Back to skill

Security audit

Wahoo Skill

Security checks across malware telemetry and agentic risk

Overview

This skill appears to do what it advertises: connect to Wahoo, download workout data, and store it locally, while handling sensitive tokens and fitness/GPS history.

Install only if you are comfortable granting Wahoo API access and storing workout history, GPS tracks, device details, and OAuth tokens on this machine. Protect ~/.openclaw/secrets/wahoo_tokens.json and ~/.openclaw/workspace/training, avoid sharing setup output or logs, and revoke the Wahoo app or delete the token file if you stop using the skill.

SkillSpector

By NVIDIA
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Rogue AgentSelf-Modification, Session Persistence
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (7)

Lp3

Medium
Category
MCP Least Privilege
Confidence
93% confidence
Finding
The skill clearly performs sensitive operations including network access, shell execution, reading environment variables, and reading/writing local files, yet it does not declare corresponding permissions. That mismatch weakens user and platform visibility into what the skill can do, especially because it handles OAuth credentials, refresh tokens, downloaded FIT files, and a local SQLite database.

Tp4

High
Category
MCP Tool Poisoning
Confidence
90% confidence
Finding
The description frames the skill primarily as workout fetching/parsing, but the documented behavior also includes full OAuth setup, token exchange, persistent token storage, automatic refresh, and local credential loading. Those are materially security-relevant behaviors because they involve long-lived secrets and account access, and understating them can cause users or orchestrators to grant trust without understanding the real risk.

Context-Inappropriate Capability

Medium
Confidence
90% confidence
Finding
The helper will fetch any caller-supplied URL with no validation that it belongs to Wahoo's expected CDN or even uses HTTPS. If an attacker can influence the URL, this becomes an SSRF-style outbound fetch primitive and can also cause the tool to download untrusted content to disk under the guise of a FIT file.

Missing User Warnings

Medium
Confidence
84% confidence
Finding
The skill stores OAuth tokens plus workout and profile data locally, but the documentation does not provide an explicit privacy or sensitive-data warning. Because the stored data includes health/activity telemetry and potentially personal profile fields, users may unknowingly leave sensitive information on disk without guidance on protection, retention, or deletion.

External Transmission

Medium
Category
Data Exfiltration
Content
The Python OAuth helper auto-refreshes on 401 if a `refresh_token` is on file. The shell helper is for manual/cron use.

```bash
curl -s -X POST https://api.wahooligan.com/oauth/token \
  -d client_id="${WAHOO_CLIENT_ID}" \
  -d client_secret="${WAHOO_CLIENT_SECRET}" \
  -d grant_type=refresh_token \
Confidence
76% confidence
Finding
https://api.wahooligan.com/

Credential Access

High
Category
Privilege Escalation
Content
Programmatic access to the Wahoo Fitness Cloud API for ELEMNT BOLT/ROAM/ACE head units. Fetches workout metadata, downloads FIT files from Wahoo's CDN, and parses ride data (power, cadence, HR, GPS, elevation) into a local SQLite database.

API base: `https://api.wahooligan.com`. Workout endpoints live under `/v1/workouts`. OAuth2 with the `offline_data` scope yields a long-lived refresh token; access tokens expire after ~2 hours and the skill auto-refreshes on 401.

## Agent quickstart (read this first)
Confidence
88% confidence
Finding
access tokens

Session Persistence

Medium
Category
Rogue Agent
Content
### 1. Register a Wahoo Developer App

1. Go to https://developers.wahooligan.com
2. Create an application (Sandbox is automatic — no review)
3. Set callback URL (e.g. `https://localhost:8080/` — the manual-paste OAuth helper works with any registered callback)
4. Request scopes: `workouts_read offline_data user_read` (add `power_zones_read plans_read routes_read` if you want zones/plans/routes)
5. Note your **Client ID** and **Client Secret**
Confidence
78% confidence
Finding
Create an application (Sandbox is automatic — no review) 3. Set callback URL (e.g. `https://localhost:8080/` — the manual-paste OAuth helper works with any registered callback) 4. Request scopes: `wor

VirusTotal

64/64 vendors flagged this skill as clean.

View on VirusTotal

Static analysis

No suspicious patterns detected.