news-briefing
Undeclared shell execution and command injection risk with user-supplied topics flowing into execSync, despite transparent documentation in skill-card.md that acknowledges these risks.
The --topic argument (user-controlled) is interpolated directly into a shell command string passed to execSync. An attacker controlling the topic could inject arbitrary shell commands. This is partially mitigated by the tool being a personal briefing tool rather than a multi-tenant service, but the risk is real.
scripts/fetch-news.mjs:55 Why this conclusion was reached
2/4 dimensions flagged2 undeclared or violating capabilities were inferred.
9 lower-risk artifacts were extracted and still need context.
The report includes 0 attack-chain steps and 3 severe findings.
Dependency information is incomplete, so supply-chain confidence stays limited.
What drove the risk score up
User-supplied --topic flows into execSync shell string in fetch-news.mjs
SKILL.md declares network:READ only, but execSync used in 3 of 4 scripts without mention
Bearer tokens and secrets appear in curl command lines, visible in process listings
gen-cover.mjs writes to /tmp/gen-cover.js and references internal OpenClaw paths
skill-card.md explicitly lists all three risk categories and recommends mitigations
send-card.mjs correctly uses native fetch for Feishu API
Most important evidence
Command injection via user-supplied --topic
The --topic argument (user-controlled) is interpolated directly into a shell command string passed to execSync. An attacker controlling the topic could inject arbitrary shell commands. This is partially mitigated by the tool being a personal briefing tool rather than a multi-tenant service, but the risk is real.
scripts/fetch-news.mjs:55 Undeclared shell:WRITE capability
SKILL.md declares only network:READ (via WebFetch) but all scripts use execSync for shell execution. Shell:WRITE is a significantly more powerful and dangerous permission than declared.
scripts/fetch-news.mjs, scripts/news-digest.mjs:55 API keys visible in process argument list
Bearer tokens (PERPLEXITY_API_KEY, PPIO_API_KEY, FEISHU_APP_SECRET) are passed as curl command-line arguments, making them visible to anyone who can read /proc/<pid>/cmdline. This enables credential theft via local privilege escalation.
scripts/fetch-news.mjs:55 Dynamic code execution via execSync
gen-cover.mjs constructs a JS code string and executes it via execSync with hardcoded internal paths, plus writes to /tmp/gen-cover.js.
scripts/gen-cover.mjs:10 Hardcoded internal OpenClaw paths
gen-cover.mjs references absolute internal paths like /root/.openclaw/workspace/skills/news-briefing/ and pnpm global store paths. This leaks internal infrastructure topology.
scripts/gen-cover.mjs:6 Declared capability vs actual capability
fetch-news.mjs:55 curl via execSync; news-digest.mjs:72 node via execSync; send-card uses native fetch (compliant) Perplexity API, PPIO API, Feishu API all declared in SKILL.md environment variables gen-cover.mjs:10 writeFileSync('/tmp/gen-cover.js'); fetch-news.mjs:10 writeFileSync for optional output-file API keys read from process.env for shell injection Suspicious artifacts and egress
https://openclaw.ai SKILL.md:138
https://clawhub.com/u/derekhsu529 SKILL.md:138
https://api.perplexity.ai/chat/completions scripts/fetch-news.mjs:65
https://api.ppinfra.com/v3/openai/chat/completions scripts/fetch-news.mjs:122
https://open.feishu.cn/open-apis/auth/v3/tenant_access_token/internal scripts/send-card.mjs:35
https://www.google.com/search?q=$ scripts/send-card.mjs:84
https://open.feishu.cn/open-apis/im/v1/messages?receive_id_type=open_id scripts/send-card.mjs:140
https://clawhub.ai/user/derekhsu529 skill-card.md:7
https://clawhub.ai/derekhsu529/news-briefing skill-card.md:28
Dependencies and supply chain
There are no structured dependency warnings.
File composition
scripts/fetch-news.mjs scripts/gen-cover.mjs scripts/send-card.mjs SKILL.md skill-card.md