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.
Why this conclusion was reached
2/4 dimensions flagged2 undeclared or violating capabilities were inferred.
3 high-risk artifacts or egress signals were extracted.
There is no explicit malicious chain in the report.
2 dependency or supply-chain issues need attention.
What drove the risk score up
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
Most important evidence
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 Declared capability vs actual capability
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) Suspicious artifacts and egress
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
Dependencies and supply chain
| Package | Version | Source | Known vuln | Notes |
|---|---|---|---|---|
| axios | ^1.6.0 | npm | No | Caret range allows minor updates — pin to exact version |
| @modelcontextprotocol/sdk | ^1.0.0 | npm | No | Caret range — pin to exact version |
| typescript | ^5.9.3 | npm | No | Dev dependency, used only at build time |
| terser | ^5.48.0 | npm | No | Dev dependency, minifier |
File composition
dist/token_breaker.js src/token_breaker.ts src/index.ts package-lock.json