StockToday
Stock data API skill with undocumented backup server IPs and shell execution for version checks, but no malicious behavior detected — all hidden functionality has legitimate, verifiable purposes.
为什么得出这个结论
2/4 个维度触发发现 2 项声明之外的能力或越权行为。
提取到 3 个高危 IOC 或外联信号。
没有形成明确的恶意路径。
发现 2 项需要关注的依赖或供应链线索。
风险分是怎么被拉高的
SKILL.md only mentions tushare.citydata.club but code also contacts 111.229.164.2:8083, 124.223.112.152:6331, 110.42.211.9:9900 as backup gateways — no doc declaration
execFile('npx clawhub info stocktoday-skill') called on startup for version checking — not declared in SKILL.md filesystem/shell capabilities
axios: ^1.6.0, @modelcontextprotocol/sdk: ^1.0.0 allow minor version updates with potential supply chain risk
最关键的证据
Undocumented backup server IPs
SKILL.md only declares tushare.citydata.club as the backend, but src/index.ts lines 63-65 hardcode 3 additional backup server IPs (111.229.164.2:8083, 124.223.112.152:6331, 110.42.211.9:9900) as failover endpoints. INSTALL.md documents them but SKILL.md does not. The IPs belong to Alibaba Cloud (AS24400) and are not CDN/proxy addresses.
src/index.ts:63 Undeclared shell execution
src/index.ts executes 'npx clawhub info stocktoday-skill' via execFile to check for newer versions. This is shell:READ capability not declared anywhere in SKILL.md. Executed on startup with 12s timeout and repeated every 24h.
src/index.ts:85 Dependencies not version-pinned
package.json uses caret ranges: axios@^1.6.0, @modelcontextprotocol/sdk@^1.0.0, typescript@^5.9.3. This allows automatic minor/patch updates that could introduce vulnerabilities without user awareness.
package.json:13 Undeclared token file persistence
Token info is persisted to ~/.stocktoday-skill/token-cache.json (hashed with sha256[:16], plaintext token stripped before write). This filesystem:WRITE activity is not declared in SKILL.md. However, the design is privacy-preserving (no plaintext token stored).
src/index.ts:29 声明能力 vs 实际能力
src/index.ts:29 — writes ~/.stocktoday-skill/token-cache.json src/index.ts:63-65 — POSTs to tushare backend (legitimate API calls) src/index.ts:85-87 — execFile npx clawhub for version check src/index.ts:15-19 — reads STOCKTODAY_TOKEN, STOCKTODAY_URL etc (legitimate, documented config) 可疑产物与外联
111.229.164.2 INSTALL.md:233
124.223.112.152 INSTALL.md:234
110.42.211.9 INSTALL.md:235
https://nodejs.org INSTALL.md:10
https://stocktoday.cn INSTALL.md:12
https://tushare.citydata.club/ INSTALL.md:222
http://111.229.164.2:8083/ INSTALL.md:233
http://124.223.112.152:6331/ INSTALL.md:234
http://110.42.211.9:9900/ INSTALL.md:235
https://opencollective.com/express package-lock.json:243
https://opencollective.com/fastify package-lock.json:617
https://clawhub.ai/user/usa2046 skill-card.md:7
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| axios | ^1.6.0 | npm | 否 | Caret range allows minor updates — pin to exact version |
| @modelcontextprotocol/sdk | ^1.0.0 | npm | 否 | Caret range — pin to exact version |
| typescript | ^5.9.3 | npm | 否 | Dev dependency, used only at build time |
| terser | ^5.48.0 | npm | 否 | Dev dependency, minifier |
文件构成
dist/token_breaker.js src/token_breaker.ts src/index.ts package-lock.json