Back to skill

Security audit

IELTS Tuyaya Upload 雅思成绩一键上传

Security checks for vulnerabilities and agentic risk

Overview

This IELTS review uploader is mostly purpose-aligned, but its credential handling and anonymous upload path expose more local identity data than users may expect.

Install only if you are comfortable sending IELTS review data to www.liuxue.online. Prefer token mode after reviewing how the token is stored, avoid anonymous mode unless you accept that it sends a persistent local identifier and OS username, and do not run publish-clawhub.sh unless you are maintaining the package and understand its local install changes.

Vulnerability Patterns
  • Tool Hijacking and SpoofingModifies or replaces tools so legitimate-looking calls execute attacker logic
  • Insecure DependenciesIntroduces malicious components through unsafe dependency sources
  • Insecure Skill Coding PracticesFinds exploitable flaws such as hardcoded secrets or command injection
  • 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
Findings (4)

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/sync-review.sh:163
Finding

Anonymous upload discloses the local username and a persistent host-derived identifier

Content
View full analysis
/dev/null; then USER_ID=$(echo -n "$RAW_ID" | shasum -a 256 | cut -c1-16) elif command -v sha256sum &>/dev/null; then USER_ID=$(echo -n "$RAW_ID" | sha256sum | cut -c1-16) else USER_ID=$(echo -n "$RAW_ID" | md5sum 2>/dev/null | cut -c1-16 || echo "$RAW_ID") fi fi USER_NAME="${IELTS_USER_NAME:-$(whoami)}" ``` ```bash RESPONSE=$(curl -s -w "\n%{http_code}" \ -X POST "$LEGACY_BASE/skill-review" \ -H "Content-Type: application/json" \ -H "x-api-key: $LEGACY_API_KEY" \ -H "x-user-id: $USER_ID" \ -H "x-user-name: $USER_NAME" \ -d "$PAYLOAD") ``` ### Technical Analysis When authenticated mode is unavailable, the script automatically falls back to anonymous mode. In that mode, it derives a stable identifier from `hostname` and `whoami`, truncates the hash to 16 hexadecimal characters, and transmits it as `x-user-id`. It also sends the clear operating-system username as `x-user-name`. A stable identifier may be useful for associating multiple anonymous uploads with one dashboard. However, deriving it from host-specific information and transmitting the clear local username exceeds what is necessary for that purpose. An unsalted, truncated hash of predictable inputs is pseudonymous rather than anonymous and may be susceptible to guessing when hostnames and usernames follow common patterns. ### Attack Path 1. A user runs `sync-review.sh` without setting `IELTS_USER_TOKEN`. 2. Browser authorization is unavailable, declined, or unsuccessful. 3. The script silently selects anonymous mode after printing a warning. 4. It reads the machine hostname a ...[truncated 751 chars]
Remediation
View remediation

T09 · Insecure Skill Coding Practices

Warning
Location
scripts/sync-review.sh:37
Finding

Hard-coded shared API key is exposed in requests and dashboard URLs

Content
View full analysis
Remediation
View remediation

T08 · Insecure Dependencies

Warning
Location
publish-clawhub.sh:20
Finding

Publishing helper globally installs an unpinned npm package

Content
View full analysis
/dev/null; then echo "⚠️ clawhub CLI 未安装,正在安装..." npm i -g clawhub fi ``` ### Technical Analysis The publishing helper installs the latest package resolving to the npm name `clawhub` without pinning an audited version or verifying package integrity or provenance. The `-g` option modifies the user's global Node.js environment. npm packages may execute lifecycle scripts during installation, so this operation can run package-supplied code with the publishing user's permissions. The effective package contents can change after this repository has been audited. Consequently, the helper introduces a mutable remote supply-chain trust boundary that is not represented by the checked-in project files. ### Attack Path 1. A maintainer or publisher runs `publish-clawhub.sh` on a system where `clawhub` is not installed. 2. The script invokes `npm i -g clawhub`. 3. npm resolves the package version available under that name at execution time. 4. npm downloads the package and dependencies from the configured registry. 5. Any package lifecycle scripts execute with the invoking user's privileges. 6. If the package, a transitive dependency, the registry account, or the registry configuration is compromised, attacker-controlled code can execute and modify the global environment. ### Impact Assessment A compromised dependency could obtain the same local privileges as the user running the publishing script. This may include reading accessible files and publishing credentials, modifying global Node.js tooling, altering the Skill before publication, or publishing malicious content through an authenticated ClawHub session. The helper does not itself elevate to root, although a privileged npm configu ...[truncated 83 chars]
Remediation
View remediation

T07 · Tool Hijacking and Spoofing

Note
Location
scripts/sync-review.sh:73
Finding

Upload workflow executes an unverified script from another installed Skill

Content
View full analysis
Remediation
View remediation
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Supply ChainUnpinned Dependencies, External Script Fetching, Obfuscated Code
  • Excessive AgencyUnrestricted Tool Access, Autonomous Decision Making, Scope Creep
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • MCP Least PrivilegeUnderdeclared Capability, Wildcard Permission, Missing Permission Declaration
Findings (21)

Tp4

High
Category
MCP Tool Poisoning
Confidence
99% confidence
Finding

The documented behavior includes reading shell config files, launching a browser auth flow, deriving an identifier from hostname and username, and using an embedded API key, while the summary description does not clearly disclose these privacy- and security-relevant actions. Hidden identity collection and token-handling behavior make the skill more dangerous because it transmits sensitive local/account data to an external service.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding

The documented behavior includes reading shell config files, launching a browser auth flow, deriving an identifier from hostname and username, and using an embedded API key, while the summary description does not clearly disclose these privacy- and security-relevant actions. Hidden identity collection and token-handling behavior make the skill more dangerous because it transmits sensitive local/account data to an external service.

Content

No source excerpt is available for this finding.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding

The documented behavior includes reading shell config files, launching a browser auth flow, deriving an identifier from hostname and username, and using an embedded API key, while the summary description does not clearly disclose these privacy- and security-relevant actions. Hidden identity collection and token-handling behavior make the skill more dangerous because it transmits sensitive local/account data to an external service.

Content

No source excerpt is available for this finding.

Ae1

High
Category
analysis-evasion
Confidence
100% confidence
Finding

Referenced artifact was not completely inspected

Content

Scanner excerpt · SKILL.md (reported line 21)May include surrounding context.

md
ICP 备案审核已全站 403 不可用,所有默认 API/授权/登录地址迁移到 `www.liuxue.online`。`sync-review.sh` / `upload.js` / `setup-client-mode.sh`(含 CORS Allow-Origin)默认值全部更新。**老用户必须 `clawhub

External Script Fetching

High
Category
Supply Chain
Confidence
90% confidence
Finding

Remote code is downloaded and executed. This bypasses code review and could introduce malicious code.

Content

Scanner excerpt · SKILL.md (reported line 151)May include surrounding context.

Step 4: 入库回查(仅 token 模式,可选但推荐)

bash
curl -s https://www.liuxue.online/api/ielts \
  -H 'Content-Type: application/json' \
  -d "{\"action\":\"getReviews\",\"token\":\"$IELTS_USER_TOKEN\",\"book\":5,\"test\":4}" \
  | python3 -m json.tool

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The README is written entirely in Chinese and all example prompts, instructions, and user interaction guidance assume Chinese-language use. Under the stated policy, a skill should not force a specific language without user opt-in or an explicitly justified locale constraint, and no such choice or justification is provided here.

Content

No source excerpt is available for this finding.

Undeclared Tool Scope

Medium
Category
MCP Least Privilege
Confidence
94% confidence
Finding

The skill instructs the agent to use shell and network capabilities but does not declare any tool scope or permission boundaries. That increases the chance of unintended command execution or outbound requests without clear sandboxing or user-consent expectations.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
94% confidence
Finding

Broad triggers such as 'dashboard' or generic upload/sync phrases can cause the skill to activate in unrelated contexts, leading to unnecessary shell execution, token checks, or network requests. In a skill that handles auth tokens and uploads data externally, accidental invocation raises real security and privacy risk.

Content

No source excerpt is available for this finding.

Vague Triggers

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The activation rules rely on broad user intent rather than strict criteria, which can route ordinary conversational requests into a skill that performs local shell and network actions. Because this skill can launch browser-based auth and upload user data, ambiguous activation materially increases exposure.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
95% confidence
Finding

The skill explicitly sends a bearer-like user token and review metadata to an external domain using curl. External transmission is expected for an upload skill, but it remains security-relevant because it exposes sensitive account credentials and user study data to a third-party service and increases consequences if the endpoint or local environment is compromised.

Content

Scanner excerpt · SKILL.md (reported line 151)May include surrounding context.

Step 4: 入库回查(仅 token 模式,可选但推荐)

bash
curl -s https://www.liuxue.online/api/ielts \
  -H 'Content-Type: application/json' \
  -d "{\"action\":\"getReviews\",\"token\":\"$IELTS_USER_TOKEN\",\"book\":5,\"test\":4}" \
  | python3 -m json.tool

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

This script performs developer/ops actions such as globally installing a CLI with npm, invoking authentication, and publishing a package, which are not aligned with the end-user functionality described for the skill. In a skill package intended for review upload, bundling release-management capabilities increases the attack surface and the risk that a user or automation executes privileged environment-changing actions they did not expect.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
97% confidence
Finding

The script does more than publish a skill: it also modifies the user's local WorkBuddy skill installation under ~/.workbuddy/skills, including moving, backing up, deleting legacy directories, and force-reinstalling. That exceeds the stated skill purpose of uploading review files / viewing dashboards, creating an unexpected side effect that can alter local state and potentially replace a trusted local skill with a newly published version.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

The script expands its behavior beyond simple file upload by invoking another setup script, launching a browser-based authorization flow, and then scraping shell rc files for a token. That creates an unnecessary credential-access path for an upload utility and increases the risk of unintended token disclosure or user surprise, especially because it reads persisted secrets from local config files.

Content

No source excerpt is available for this finding.

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
96% confidence
Finding

The script reads authentication tokens from ~/.zshrc, ~/.bashrc, or ~/.profile without a clear warning that credential material will be accessed from shell startup files. This surprises users, broadens the script's access to sensitive local data, and can unintentionally consume stale or unrelated secrets stored in those files.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
70% confidence
Finding

Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Content

Scanner excerpt · scripts/sync-review.sh (reported line 132)May include surrounding context.

sh
" "$JSON_FILE" "$IELTS_USER_TOKEN")

  echo "→ POST $API_BASE  (action=batchImport)"
  RESPONSE=$(curl -s -w "\n%{http_code}" \
    -X POST "$API_BASE" \
    -H "Content-Type: application/json" \
    -d "$PAYLOAD")

Missing User Warnings

Medium
Category
Not specified by scanner
Confidence
91% confidence
Finding

The anonymous upload path sends host-derived user identity data and the local username in HTTP headers without an explicit privacy warning. This leaks identifiable environment metadata to the remote server and creates persistent correlation between uploads and the user's local system identity.

Content

No source excerpt is available for this finding.

External Transmission

Medium
Category
Data Exfiltration
Confidence
94% confidence
Finding

The anonymous upload sends data to a remote endpoint using a hardcoded API key and includes user-derived identity headers; the script also prints a dashboard URL containing the API key. Embedding and exposing a reusable secret in client-side code allows anyone with script access or console output to reuse that credential against the backend, potentially enabling unauthorized submissions or abuse of the anonymous service.

Content

Scanner excerpt · scripts/sync-review.sh (reported line 193)May include surrounding context.

sh
" "$JSON_FILE")

echo "→ POST $LEGACY_BASE/skill-review"
RESPONSE=$(curl -s -w "\n%{http_code}" \
  -X POST "$LEGACY_BASE/skill-review" \
  -H "Content-Type: application/json" \
  -H "x-api-key: $LEGACY_API_KEY" \

Natural-Language Policy Violations

Medium
Category
Not specified by scanner
Confidence
95% confidence
Finding

This code file contains user-facing natural-language instructions entirely in Chinese, including usage documentation and prompts, but does not offer any opt-in or alternative language. That can violate a language/locale policy when users are not explicitly given a choice or the regional restriction is not justified.

Content

No source excerpt is available for this finding.

Description-Behavior Mismatch

Medium
Category
Not specified by scanner
Confidence
98% confidence
Finding

The manifest states the skill supports both token mode and anonymous mode, but this file enforces a saved token before any data operation, including single upload, batch upload, status, and diff. No anonymous upload path exists in the implemented command handling, so the actual behavior is narrower than the declared capability.

Content

No source excerpt is available for this finding.

Natural-Language Policy Violations

Low
Category
Not specified by scanner
Confidence
87% confidence
Finding

Most user-facing instructions, prompts, and trigger descriptions are written only in Chinese, and the style guidance does not indicate that users may choose another language. This can violate a language or locale policy when the skill implicitly constrains interaction language without opt-in or justification.

Content

No source excerpt is available for this finding.

Context-Inappropriate Capability

Low
Category
Not specified by scanner
Confidence
90% confidence
Finding

Anonymous mode derives an identifier from hostname and username and transmits it to the remote service, exposing local identity metadata that is not strictly required to upload review content. Even when hashed, the value is stable and linkable, enabling tracking of a user's machine/account across uploads without explicit consent.

Content

No source excerpt is available for this finding.

Static analysis

Detected: suspicious.potential_exfiltration

Sensitive-looking file read is paired with a network send.

Warn
Code
suspicious.potential_exfiltration
Location
scripts/upload.js:35