Back to skill

Security audit

Vocab Voyage Mcp V1.1.1

Security checks for vulnerabilities and agentic risk

Overview

Vocab Voyage appears to be a legitimate remote vocabulary tutor, but it needs review because it stores account-linked study activity and referral telemetry, and one documented install path can run an unpinned third-party package.

Install only if you are comfortable using a hosted vocabulary service that may store study progress, answers, XP, mastery state, and referral-linked usage records. Prefer the OpenClaw remote install path, avoid the unpinned `npx -y mcp-remote` setup unless you pin and trust the package, and do not provide a personal token unless you want personalized progress features.

Vulnerability Patterns
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
Findings (2)

T08 · Insecure Dependencies

Warning
Location
README.md:22
Finding
Unpinned Third-Party Package Is Automatically Downloaded and Executed<![CDATA[ ## Vulnerability Details **File Location**: `README.md:22-28` **Vulnerability Type**: Unpinned third-party dependency execution **Risk Level**: Medium ### Vulnerable Code ```json { "mcpServers": { "vocab-voyage": { "command": "npx", "args": ["-y", "mcp-remote", "https://gponcrussdahcdyrlhcr.supabase.co/functions/v1/mcp-server"] } } } ``` ### Technical Analysis The recommended configuration invokes `npx` with `-y` and an unversioned `mcp-remote` package name. This causes the package manager to resolve, download, and execute the version currently available through the configured package registry without requiring interactive confirmation. Because neither an exact version nor an integrity constraint is specified, the code executed by this configuration can change after the Skill has been audited. The risk arises from the mutable third-party package supply chain rather than from malicious code found directly in this repository. The remote MCP connection itself is consistent with the Skill's declared functionality. However, dynamically obtaining an unpinned local executable is not the minimum-risk method for establishing that connection. ### Attack Path 1. An attacker compromises the `mcp-remote` package, one of its transitive dependencies, its publisher account, or the package resolution infrastructure. 2. The attacker publishes a malicious version that remains compatible enough to be selected by `npx`. 3. A user installs the documented configuration and starts the MCP integration. 4. `npx -y mcp-remote` downloads the currently resolved package without prompting the user. 5. The malicious package executes locally with the privileges of the user running the MCP host. 6. The package can inspect files, environment variables, MCP configuration, or credentials accessible to that user before optionally continuing normal proxy behavior to avoid detection. ### Impact Assessment Successful exploitation provides local code executio ...[truncated 593 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Pin `mcp-remote` to a reviewed exact version: ```json { "command": "npx", "args": [ "-y", "mcp-remote@<audited-exact-version>", "https://gponcrussdahcdyrlhcr.supabase.co/functions/v1/mcp-server" ] } ``` 2. Where supported, install dependencies through a lockfile that records resolved versions and integrity hashes. 3. Verify the package publisher, provenance attestations, and registry signatures before recommending the package. 4. Document a controlled update process so the pinned version is changed only after security review. 5. Prefer a host's native remote MCP transport when available, eliminating the need to execute a locally downloaded proxy package. 6. Run the MCP proxy with a restricted environment and only the credentials required for this service. ]]>

other

Note
Location
SUBMISSION_LINKS.md:17
Finding
Per-Call Referral Telemetry Correlates Usage with User or IP-Derived Identifiers<![CDATA[ ## Vulnerability Details **File Location**: `SUBMISSION_LINKS.md:17-19, 80-92` **Vulnerability Type**: Usage telemetry and identity correlation beyond core vocabulary functionality **Risk Level**: Low ### Vulnerable Code ```text When listing the Vocab Voyage MCP endpoint in any directory or community post, use the variant that includes the `?ref=<channel>` query param. The MCP server records this on every tool call into `mcp_tool_calls.install_source`, so you can see which channel actually drives usage. The server normalizes refs to lowercase `[a-z0-9_-]{1,32}`. The slugs below are the canonical ones — match these exactly so the Friday analytics query buckets cleanly. ``` ```sql select coalesce(install_source, '(direct/no-ref)') as source, count(*) as calls, count(distinct user_id) as authed_users, count(distinct ip_hash) filter (where user_id is null) as anon_clients, round(avg(latency_ms))::int as avg_latency_ms, round(100.0 * count(*) filter (where status = 'ok') / count(*), 1) as success_pct from public.mcp_tool_calls where created_at >= now() - interval '7 days' group by 1 order by calls desc; ``` ### Technical Analysis The hosted MCP service records the referral channel on every tool invocation. The documented analytics query correlates usage with authenticated `user_id` values or distinct `ip_hash` values for anonymous clients. Operational request logging can be legitimate, and the referral value is documented in `SUBMISSION_LINKS.md`. However, per-call acquisition tracking and identity-linked aggregation are not necessary to provide vocabulary definitions, flashcards, quizzes, or study plans. The primary user-facing `SKILL.md` and OpenClaw quickstart describe progress persistence but do not prominently explain this per-call referral telemetry, identifier usage, retention period, or opt-out mechanism. Hashing IP addresses reduces direct exposure but does not make the data anonymous when hashes remain stable enough to count d ...[truncated 1471 chars]
Remediation
<![CDATA[ ## Remediation Suggestions 1. Add a prominent telemetry disclosure to `SKILL.md`, `README.md`, and the OpenClaw quickstart. 2. Explain which fields are collected, why they are collected, how long they are retained, and who can access them. 3. Provide an endpoint or configuration option that omits referral tracking. 4. Aggregate referral statistics before storage where individual call-level records are unnecessary. 5. Avoid stable user or IP-derived identifiers for anonymous analytics unless they are essential. 6. Apply keyed, regularly rotated pseudonymization if distinct-client measurement must be retained. 7. Establish short retention periods and automatically delete raw per-call telemetry after aggregation. 8. Restrict telemetry-table access, audit queries, and prevent use for unrelated profiling. 9. Document applicable consent, deletion, and data-access mechanisms. ]]>
Vulnerability Patterns
  • Prompt InjectionInstruction Override, Hidden Instructions, Exfiltration Commands
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Rogue AgentSelf-Modification, Session Persistence
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
Findings (30)

Tainted flow: 'req' from os.environ.get (line 24, credential/environment) → urllib.request.urlopen (network output)

Critical
Category
Data Flow
Content
},
)

with urllib.request.urlopen(req) as resp:
    print(json.dumps(json.loads(resp.read()), indent=2))
Confidence
90% confidence
Finding
Credentials or environment variables flow to a network sink. This is a high-confidence indicator of credential exfiltration.

Hidden Instructions

High
Category
Prompt Injection
Content
## Tool catalog (auto-generated)

<!-- mcp:tools:start -->
Tool count: 20.

- `get_word_of_the_day` — Returns today's vocabulary Word of the Day, optionally scoped to a test family.
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
## Tool catalog (auto-generated)

<!-- mcp:tools:start -->
Tool count: 20.

- `get_word_of_the_day` — Returns today's vocabulary Word of the Day, optionally scoped to a test family.
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
## Tool catalog (auto-generated)

<!-- mcp:tools:start -->
Tool count: 20.

- `get_word_of_the_day` — Returns today's vocabulary Word of the Day, optionally scoped to a test family.
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Context Leakage

High
Category
Data Exfiltration
Content
- `get_recommended_next_action` — Returns a one-line recommendation for what the user should do next.
- `list_starter_prompts` — Lists the 6 MCP prompts (vocab_kickoff, test_prep_quiz, session_debrief, …) for hosts that don't surface prompts/list.
- `record_word_result` — Auth: log a per-card answer (correct or incorrect).
- `record_session_complete` — Auth: log session totals and award XP.
- `award_game_xp` — Auth: grant bonus XP from a completed mini-game round.
- `mark_word_known` — Auth: add a word to the user's queue or mastered list.
- `mark_word_difficult` — Auth: flag a word as needing more review.
Confidence
85% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
- `get_recommended_next_action` — Returns a one-line recommendation for what the user should do next.
- `list_starter_prompts` — Lists the 6 MCP prompts (vocab_kickoff, test_prep_quiz, session_debrief, …) for hosts that don't surface prompts/list.
- `record_word_result` — Auth: log a per-card answer (correct or incorrect).
- `record_session_complete` — Auth: log session totals and award XP.
- `award_game_xp` — Auth: grant bonus XP from a completed mini-game round.
- `mark_word_known` — Auth: add a word to the user's queue or mastered list.
- `mark_word_difficult` — Auth: flag a word as needing more review.
Confidence
85% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
- `get_recommended_next_action` — Returns a one-line recommendation for what the user should do next.
- `list_starter_prompts` — Lists the 6 MCP prompts (vocab_kickoff, test_prep_quiz, session_debrief, …) for hosts that don't surface prompts/list.
- `record_word_result` — Auth: log a per-card answer (correct or incorrect).
- `record_session_complete` — Auth: log session totals and award XP.
- `award_game_xp` — Auth: grant bonus XP from a completed mini-game round.
- `mark_word_known` — Auth: add a word to the user's queue or mastered list.
- `mark_word_difficult` — Auth: flag a word as needing more review.
Confidence
85% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
- `get_recommended_next_action` — Returns a one-line recommendation for what the user should do next.
- `list_starter_prompts` — Lists the 6 MCP prompts (vocab_kickoff, test_prep_quiz, session_debrief, …) for hosts that don't surface prompts/list.
- `record_word_result` — Auth: log a per-card answer (correct or incorrect).
- `record_session_complete` — Auth: log session totals and award XP.
- `award_game_xp` — Auth: grant bonus XP from a completed mini-game round.
- `mark_word_known` — Auth: add a word to the user's queue or mastered list.
- `mark_word_difficult` — Auth: flag a word as needing more review.
Confidence
85% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Context Leakage

High
Category
Data Exfiltration
Content
- `get_recommended_next_action` — Returns a one-line recommendation for what the user should do next.
- `list_starter_prompts` — Lists the 6 MCP prompts (vocab_kickoff, test_prep_quiz, session_debrief, …) for hosts that don't surface prompts/list.
- `record_word_result` — Auth: log a per-card answer (correct or incorrect).
- `record_session_complete` — Auth: log session totals and award XP.
- `award_game_xp` — Auth: grant bonus XP from a completed mini-game round.
- `mark_word_known` — Auth: add a word to the user's queue or mastered list.
- `mark_word_difficult` — Auth: flag a word as needing more review.
Confidence
85% confidence
Finding
Code or instructions that leak agent conversation context to external services, potentially exposing sensitive user interactions.

Hidden Instructions

High
Category
Prompt Injection
Content
## Widget catalog (auto-generated)

<!-- mcp:widgets:start -->
Widget count: 17.

- `ui://vocab-voyage/word-of-the-day` — Word of the Day (learn, 560x360) via `get_word_of_the_day`
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
## Widget catalog (auto-generated)

<!-- mcp:widgets:start -->
Widget count: 17.

- `ui://vocab-voyage/word-of-the-day` — Word of the Day (learn, 560x360) via `get_word_of_the_day`
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
## Widget catalog (auto-generated)

<!-- mcp:widgets:start -->
Widget count: 17.

- `ui://vocab-voyage/word-of-the-day` — Word of the Day (learn, 560x360) via `get_word_of_the_day`
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
- `ui://vocab-voyage/game/crossword` — Game · Crossword (play, 640x720) via `play_game`
- `ui://vocab-voyage/game/word_search` — Game · Word Search (play, 640x720) via `play_game`
- `ui://vocab-voyage/session-debrief` — Session Debrief (coach, 600x640) via `get_sparkle_guidance`
<!-- mcp:widgets:end -->
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
- `ui://vocab-voyage/game/crossword` — Game · Crossword (play, 640x720) via `play_game`
- `ui://vocab-voyage/game/word_search` — Game · Word Search (play, 640x720) via `play_game`
- `ui://vocab-voyage/session-debrief` — Session Debrief (coach, 600x640) via `get_sparkle_guidance`
<!-- mcp:widgets:end -->
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Hidden Instructions

High
Category
Prompt Injection
Content
- `ui://vocab-voyage/game/crossword` — Game · Crossword (play, 640x720) via `play_game`
- `ui://vocab-voyage/game/word_search` — Game · Word Search (play, 640x720) via `play_game`
- `ui://vocab-voyage/session-debrief` — Session Debrief (coach, 600x640) via `get_sparkle_guidance`
<!-- mcp:widgets:end -->
Confidence
70% confidence
Finding
Hidden instructions were detected in comments or invisible text. These could contain malicious directives. Manual review is recommended.

Missing User Warnings

Medium
Confidence
94% confidence
Finding
The skill explicitly states that taps inside widgets persist activity to the user's account, but it does so as product behavior rather than as a clear privacy warning or consent notice. This can cause users to trigger account writes without understanding that learning activity, answers, and session completion data will be stored, creating a transparency and privacy-risk issue.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The tool catalog lists several auth-only tools that log answers, session totals, XP, mastery state, and adaptive level changes, but it does not include a clear warning about collection and storage of account-linked educational activity. Users may reasonably treat these as harmless study tools while unknowingly causing durable profile updates and behavioral tracking.

Missing User Warnings

Medium
Confidence
88% confidence
Finding
The document explicitly instructs submitters to append per-channel referral identifiers and states that every tool call records this attribution into a server-side table. This creates user/activity tracking behavior without any nearby disclosure, consent guidance, retention limits, or privacy notice, which is a real privacy/security concern because downstream users and integrators may unknowingly enable telemetry tied to install source and potentially correlated activity.

Missing User Warnings

Medium
Confidence
89% confidence
Finding
The manifest advertises authenticated scopes like profile.read and progress.read plus tools such as get_my_progress and record_session_complete, but it does not provide any user-facing disclosure about what learner data is collected, when it is transmitted, or how it is used. This creates a privacy and consent gap: an integrating agent or end user may unknowingly expose educational progress or profile information to the service, which is especially sensitive in a tutoring context involving minors or students.

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The manifest shows the skill uses a remote MCP server over streamable HTTP and offers authenticated personalized features, but it does not clearly warn users that their prompts, interactions, and progress data may be sent to an external hosted service. This creates a transparency and privacy issue because users may assume local-only behavior while educational usage data is transmitted off-platform.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The manifest explicitly describes personal progress dashboards and persistence of quiz, flashcard, and game results, but it does not present a clear privacy warning or data-retention notice to users at install time. Because this skill is aimed at education and may be used by students, silent collection and storage of learning activity increases privacy risk and can expose behavioral or profile data beyond user expectations.

Skill Enumeration

Medium
Category
Agent Snooping
Content
### Option 2 — Manual skill folder

Create the file `~/.openclaw/skills/vocab-voyage/SKILL.md` with the following contents:

```markdown
---
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Skill Enumeration

Medium
Category
Agent Snooping
Content
### Option 2 — Manual skill folder

Create the file `~/.openclaw/skills/vocab-voyage/SKILL.md` with the following contents:

```markdown
---
Confidence
80% confidence
Finding
Skill enumerates or reads other installed skills. Access to other skills' SKILL.md files or the skills directory reveals prompt instructions, capabilities, and secrets that should be invisible to peer skills.

Session Persistence

Medium
Category
Rogue Agent
Content
### Option 2 — Manual skill folder

Create the file `~/.openclaw/skills/vocab-voyage/SKILL.md` with the following contents:

```markdown
---
Confidence
60% confidence
Finding
Skill establishes unauthorized persistence across sessions via cron jobs, startup scripts, or state files. Session persistence allows an attacker to maintain access beyond the current interaction.

External Transmission

Medium
Category
Data Exfiltration
Content
AUTH_HEADER=(-H "Authorization: Bearer ${VV_MCP_TOKEN}")
fi

curl -sS -X POST "$ENDPOINT" \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json' \
  "${AUTH_HEADER[@]}" \
Confidence
70% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Static analysis

Detected: suspicious.env_credential_access

Environment variable access combined with network send.

Critical
Code
suspicious.env_credential_access
Location
examples/node-flashcards.mjs:13