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 Why this conclusion was reached
1/4 dimensions flaggedDeclared resources and inferred behavior are broadly aligned.
8 lower-risk artifacts were extracted and still need context.
The report includes 6 attack-chain steps and 6 severe findings.
Dependency information is incomplete, so supply-chain confidence stays limited.
Attack Chain
Entry · claw.json:6
Escalation · src/hunt.js:155
Escalation · src/hunt.js:16
Escalation · src/hunt.js:461
Escalation · src/hunt.js:418
Impact · src/hunt.js:572
What drove the risk score up
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
Most important evidence
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 Declared capability vs actual capability
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 Suspicious artifacts and egress
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
Dependencies and supply chain
There are no structured dependency warnings.
File composition
src/hunt.js README.md skill-card.md