auto-skill-hunter
The skill declares only 'filesystem' permissions in claw.json but actually executes arbitrary shell commands (git clone via execSync, node report.js via spawnSync), makes undeclared network requests, and silently installs arbitrary code from the internet — a massive doc-to-code mismatch across multiple critical resources.
hunt.js calls execSync(`git clone --depth 1 "${asset.repoUrl}" "${installPath}"`, {stdio:'pipe',timeout:90000}) to clone arbitrary repositories from the internet directly into the agent's skills directory. This is shell:WRITE, completely absent from claw.json ['filesystem'] declaration.
src/hunt.js:461 为什么得出这个结论
1/4 个维度触发声明资源与推断能力基本一致。
提取到 8 个一般风险产物,需要结合上下文判断。
报告包含 6 步攻击链,另有 6 项高危或严重发现。
没有完整依赖信息,供应链判断需要保留弹性。
攻击链
初始入口 · claw.json:6
权限提升 · src/hunt.js:155
权限提升 · src/hunt.js:16
权限提升 · src/hunt.js:461
权限提升 · src/hunt.js:418
最终危害 · src/hunt.js:572
风险分是怎么被拉高的
claw.json declares only 'filesystem' but hunt.js uses execSync('git clone ...') at line 461 and execSync('node --self-test') at line 418 — both are shell:WRITE and completely absent from SKILL.md and claw.json
spawnSync('node', [REPORT_SCRIPT, ...]) at line 572 executes arbitrary Node.js via shell with stdio:inherit — not declared in any permission document
HTTP fetch calls to ClawHub API endpoints (clawhub.com) are absent from both SKILL.md and claw.json permissions array
git clone pulls code from arbitrary repoUrl fields in fetched skills with no signature verification, pinning, or human review gate before live installs
最关键的证据
Undeclared shell:WRITE via execSync — git clone
hunt.js calls execSync(`git clone --depth 1 "${asset.repoUrl}" "${installPath}"`, {stdio:'pipe',timeout:90000}) to clone arbitrary repositories from the internet directly into the agent's skills directory. This is shell:WRITE, completely absent from claw.json ['filesystem'] declaration.
src/hunt.js:461 Undeclared shell:WRITE via execSync — self-test
hunt.js calls execSync(`node "${indexPath}" --self-test`) to validate installed skills. This executes arbitrary JavaScript from newly installed skill code as the agent's user — another shell:WRITE call hidden from the permission model.
src/hunt.js:418 Undeclared shell:WRITE via spawnSync — report script
hunt.js calls spawnSync('node', [REPORT_SCRIPT, '--title', ..., '--status', reportText, ...], {stdio:'inherit'}). The report script path is a relative-to-src path to a sibling skill, which can be overwritten by an attacker who controls a cloned skill. stdio:inherit leaks subprocess I/O to the parent process.
src/hunt.js:572 Arbitrary code installation from internet without verification
The skill fetches skill metadata from ClawHub, extracts repoUrl fields, and runs git clone to install arbitrary JavaScript code into the local skills directory. No code signing, hash verification, or trusted-repository allowlist is applied before execution.
src/hunt.js:461 Network access completely absent from declared permissions
claw.json declares permissions: ['filesystem'] but the code makes fetch() calls to https://clawhub.com/api/v1/* (network:READ) and spawns node processes (shell:WRITE). The declared capability surface is a small subset of actual behavior.
src/hunt.js:16 Reads session files containing full conversation history
collectRecentUserMessages() reads JSONL files from SESSIONS_DIR, parsing all recent user messages including potentially sensitive content. This is declared in SKILL.md but the volume of data read (up to 80 messages per run) is significant.
src/hunt.js:155 Remote report sending not prominently disclosed in SKILL.md
sendHunterReport() spawns an external node script to send reports. While SKILL.md mentions 'Disable outbound reporting during local tests with SKILL_HUNTER_NO_REPORT=1', the live behavior of sending reports to an external system is not declared as a network:WRITE action in claw.json.
src/hunt.js:572 声明能力 vs 实际能力
claw.json declares ["filesystem"]; hunt.js writes SKILL.md, index.js, .hunter.json to SKILLS_DIR — over-claimed but partially tolerable as part of the described feature src/hunt.js:461 execSync(`git clone --depth 1 "${repoUrl}" ...`) and src/hunt.js:418 execSync(`node "${indexPath}" --self-test`) — no shell permission declared anywhere src/hunt.js:16-23 hardcoded ClawHub API URLs fetched via fetch() — network:READ never declared in claw.json or SKILL.md src/hunt.js:70 reads SKILL_HUNTER_MAX_INSTALL from process.env; also reads OPENCLAW_ROOT, WORKSPACE_ROOT from path traversal 可疑产物与外联
https://clawhub.ai/wanng-ide/memory-mesh-core README.md:7
https://clawhub.ai/user/terrycarter1985 skill-card.md:7
https://clawhub.ai/terrycarter1985/wanng-ide-auto-skill-hunter skill-card.md:31
https://clawhub.com/api/v1/skills/trending?limit=30 src/hunt.js:16
https://clawhub.com/api/v1/skills?sort=trending&limit=30 src/hunt.js:17
https://clawhub.com/api/v1/skills?limit=30 src/hunt.js:18
https://clawhub.com/api/v1/skills/search?q= src/hunt.js:22
https://clawhub.com/api/v1/skills?q= src/hunt.js:23
依赖与供应链
没有结构化依赖告警。
文件构成
src/hunt.js README.md skill-card.md