Skill Trust Decision

deferred-tax-check-free

SKILL.md 声称"完全本地运行、不需要联网、不发送材料",但 run.mjs 在每次运行结束后会向外部服务器 https://www.tokendidi.cn/api/free-hint 发送网络请求,传输 hostname|username 的 SHA1 哈希作为匿名安装标识。这是典型的文档-行为差异(Shadow Functionality),属于影子功能风险。

Install decision first Source: ClawHub Scanned: Sep 19, 2026
Files 4
Artifacts 1
Violations 1
Findings 3
Most direct threat evidence

Why this conclusion was reached

1/4 dimensions flagged
Block
Declared vs actual capability

1 undeclared or violating capabilities were inferred.

Review
Hidden execution and egress

1 lower-risk artifacts were extracted and still need context.

Pass
Attack chain and severe findings

There is no explicit malicious chain in the report.

Pass
Dependencies and supply chain hygiene

Dependencies are present but no obvious high-risk issue stands out.

What drove the risk score up

文档欺骗/影子功能 +20

SKILL.md 声称"完全本地运行、不需要联网、不发送材料",但代码在 hintAfterRun() 中实际向外部服务器发送请求

敏感环境信息外传 +10

收集 os.hostname() 和 os.userInfo().username 的组合哈希 sid 并发送至外部服务器,存在用户指纹识别风险

外部URL通信 +5

向 https://www.tokendidi.cn/api/free-hint 发送请求,虽声称匿名但仍涉及网络出站

Most important evidence

Medium Doc Mismatch

文档与代码行为不一致 - 影子功能

SKILL.md 明确声明"完全本地运行"、"不需要联网"、"不发送材料",但 run.mjs 第 219-236 行的 hintAfterRun() 函数在每次运行后向 https://www.tokendidi.cn/api/free-hint 发送网络请求。这是典型的文档欺骗型影子功能(Code Does More Than Docs Claim)。

scripts/run.mjs:219
在 SKILL.md 的"使用次数与完整档"章节中明确说明存在匿名次数统计网络请求,或在 allowed-tools 中声明网络访问能力。
Medium Sensitive Access

收集系统标识符用于外部传输

run.mjs 第 229-230 行收集 os.hostname() 和 os.userInfo().username,组合后取 SHA1 哈希前 16 位作为 sid 发送至外部服务器。虽然声称"不读环境变量",但仍收集了可识别用户身份的信息,存在用户指纹识别和追踪风险。

scripts/run.mjs:229
考虑使用完全随机的匿名标识符(如 crypto.randomUUID)替代 hostname|username 组合,或在文档中明确说明此类信息收集。
Low Doc Mismatch

权限声明宽泛

allowed-tools 声明了 Bash 权限,但代码中实际未使用 shell 执行功能,属于权限过度声明。

SKILL.md:17
移除未使用的 Bash 权限声明,保持最小权限原则。

Declared capability vs actual capability

Filesystem Pass
Declared READ
→
Inferred READ
SKILL.md:allowed-tools:Read; 仅在 loadInput() 中读取入参文件
Shell Pass
Declared WRITE
→
Inferred NONE
SKILL.md:allowed-tools:Bash 声明但代码未使用 subprocess/bash 执行
Network Block
Declared NONE
→
Inferred WRITE
scripts/run.mjs:222 HINT_URL 外部请求

Suspicious artifacts and egress

Medium External URL
https://www.tokendidi.cn/api/free-hint

scripts/run.mjs:222

Dependencies and supply chain

PackageVersionSourceKnown vulnNotes
纯Node标准库 N/A 内置 No deferred-tax-check.js 仅使用 Node.js 内置模块(crypto, os, fs, path 等),无外部依赖

File composition

4 files · 843 lines
JavaScript 2 files · 731 linesMarkdown 1 files · 109 linesJSON 1 files · 3 lines
Files of concern · 2
scripts/run.mjs JavaScript · 258 lines
文档与代码行为不一致 - 影子功能 · 收集系统标识符用于外部传输 · https://www.tokendidi.cn/api/free-hint
SKILL.md Markdown · 109 lines
权限声明宽泛
Other files · deferred-tax-check.js · sample.json

Security positives

核心检查逻辑(deferred-tax-check.js)完全本地执行,使用纯 Node.js 标准库,无第三方依赖
代码结构清晰,CHECKS_GIVEN/CHECKS_WITHHELD 明确区分免费版和完整版功能
材料不足时明确不给结论(退出码 3),不输出"未发现问题"的误导性结果
支持 --no-stats 参数允许用户禁用网络请求
网络请求使用 AbortController 设置 2500ms 超时,失败不影响核对结果
无恶意行为证据:代码用于正当的递延所得税核算,无凭证收割、RCE 或数据外泄的主动行为