安全决策报告
audit-adjustment-check-free
SKILL.md声明"完全本地运行、不联网、不发送材料",但run.mjs在运行结束后向外部服务器https://www.tokendidi.cn/api/free-hint发送主机名+用户名哈希的匿名标识,违反声明。
最直接的威胁证据
01
用户阅读SKILL.md被"完全本地运行、不联网"声明吸引 初始入口 · SKILL.md
02
运行技能后,run.mjs在后台向外部服务器发送hostname|username哈希 权限提升 · scripts/run.mjs
03
服务端可关联sid与用户主机名,建立跨运行追踪 最终危害 · scripts/run.mjs
为什么得出这个结论
2/4 个维度触发 阻止
声明与实际能力
发现 2 项声明之外的能力或越权行为。
复核
隐藏执行与外联
提取到 1 个一般风险产物,需要结合上下文判断。
阻止
攻击链与高危发现
报告包含 3 步攻击链,另有 1 项高危或严重发现。
复核
依赖与供应链卫生
没有完整依赖信息,供应链判断需要保留弹性。
攻击链
01
用户阅读SKILL.md被"完全本地运行、不联网"声明吸引
初始入口 · SKILL.md:1
02
运行技能后,run.mjs在后台向外部服务器发送hostname|username哈希
权限提升 · scripts/run.mjs:222
03
服务端可关联sid与用户主机名,建立跨运行追踪
最终危害 · scripts/run.mjs:226
风险分是怎么被拉高的
未声明的网络行为 +30
SKILL.md声明不联网,但run.mjs:226向https://www.tokendidi.cn/api/free-hint发送请求
文档欺骗(SKILL.md声明不一致) +15
文档明确写"不联网、不发送材料、不写任何文件",代码却有fetch请求
收集系统标识信息 +5
发送hostname|username的SHA1哈希,可能用于用户追踪
最关键的证据
高危 文档欺骗
SKILL.md声明与实际网络行为不符
文档明确声明"完全本地运行:不联网、不需要API Key、没有调用次数上限"、"不发送你的材料、不写任何文件",但代码在运行结束后向https://www.tokendidi.cn/api/free-hint发送匿名安装标识(sid)和包标识(id)。
scripts/run.mjs:226 在SKILL.md allowed-tools中补充网络权限声明,并明确说明发送哪些数据、为何目的、第4次运行后才返回"完整档说明"。
中危 敏感访问
收集系统标识用于远程追踪
代码收集os.hostname()和os.userInfo().username的SHA1哈希作为匿名安装标识,可能用于跨运行追踪用户。SKILL.md未提及此行为。
scripts/run.mjs:222 明确告知用户会收集哪些标识、用途为何、提供Opt-out机制。
低危 供应链
第三方外部URL无版本锁定
硬编码外部URL https://www.tokendidi.cn/api/free-hint 无版本控制,存在URL被篡改风险。
scripts/run.mjs:215 考虑将外部API的URL或域名作为配置项暴露给用户,或说明如何验证其真实性。
声明能力 vs 实际能力
文件系统 通过
声明 READ
→ 推断 READ
SKILL.md声明Read工具;代码仅读取入参文件 命令执行 阻止
声明 WRITE
→ 推断 NONE
SKILL.md声明Bash工具但代码未使用subprocess 网络访问 阻止
声明 NONE
→ 推断 WRITE
run.mjs:226 fetch调用外部API 可疑产物与外联
中危 外部 URL
https://www.tokendidi.cn/api/free-hint scripts/run.mjs:215
依赖与供应链
没有结构化依赖告警。
文件构成
4 个文件 · 775 行
JavaScript 2 个文件 · 682 行Markdown 1 个文件 · 90 行JSON 1 个文件 · 3 行
需关注文件 · 1
scripts/run.mjs SKILL.md声明与实际网络行为不符 · 收集系统标识用于远程追踪 · 第三方外部URL无版本锁定 · https://www.tokendidi.cn/api/free-hint
其他文件 · audit-adjustment-check.js · SKILL.md · sample.json
安全亮点
核心检查逻辑(engine/)仅使用Node.js标准库,无外部依赖
代码结构清晰,引擎自包含、不依赖网络
材料处理在本地完成,不上传用户财务数据
有完善的退出码和错误处理
材料不足时不输出"未发现问题",诚实告知缺什么