安全决策报告
ar-aging-check-free
SKILL.md 声称完全本地运行、不联网,但代码实际向外部服务器发送匿名标识符用于次数统计,构成文档-行为差异。
最直接的威胁证据
01
用户运行技能核对应收账龄表 初始入口 · scripts/run.mjs
02
运行结束后自动发起网络请求 权限提升 · scripts/run.mjs
03
发送hostname+username哈希的匿名标识符到外部服务器 最终危害 · scripts/run.mjs
为什么得出这个结论
2/4 个维度触发 阻止
声明与实际能力
发现 2 项声明之外的能力或越权行为。
复核
隐藏执行与外联
提取到 1 个一般风险产物,需要结合上下文判断。
阻止
攻击链与高危发现
报告包含 3 步攻击链,另有 0 项高危或严重发现。
复核
依赖与供应链卫生
没有完整依赖信息,供应链判断需要保留弹性。
攻击链
01
用户运行技能核对应收账龄表
初始入口 · scripts/run.mjs:1
02
运行结束后自动发起网络请求
权限提升 · scripts/run.mjs:215
03
发送hostname+username哈希的匿名标识符到外部服务器
最终危害 · scripts/run.mjs:211
风险分是怎么被拉高的
文档声明与实际行为不符 +20
SKILL.md声明'不联网',但代码向https://www.tokendidi.cn/api/free-hint发送请求
收集系统标识符 +10
使用hostname+username的SHA1哈希前16位作为匿名安装标识
权限声明宽泛 +10
声明Bash工具但实际未使用,存在权限过度声明
网络请求存在 +5
向外部URL发起fetch请求,传输sid标识符
最关键的证据
中危 文档欺骗
文档声明与实际网络行为不符
SKILL.md明确声明'不联网'和'完全本地运行',但scripts/run.mjs在运行结束后向https://www.tokendidi.cn/api/free-hint发送匿名统计请求。前3次无返回,第4次起可能返回广告或升级提示。
scripts/run.mjs:215 在SKILL.md中明确声明存在匿名次数统计,说明只发送包标识和匿名安装标识,不发送用户材料。
低危 敏感访问
收集系统标识符用于追踪
代码通过SHA1(hostname|username)生成半唯一安装标识符,虽然声称'不读环境变量',但实际收集了主机名和用户名。
scripts/run.mjs:210 如果不需要追踪用户行为,可移除此逻辑;或使用纯本地方式计数(如本地文件)。
低危 权限提升
Bash工具权限过度声明
SKILL.md声明allowed-tools包含Bash,但代码中无任何subprocess调用,存在权限过度声明。
SKILL.md:12 将Bash从allowed-tools中移除,仅保留Read工具。
声明能力 vs 实际能力
文件系统 通过
声明 READ
→ 推断 READ
scripts/run.mjs:79 fs.readFileSync 网络访问 阻止
声明 NONE
→ 推断 WRITE
scripts/run.mjs:215 fetch to https://www.tokendidi.cn/api/free-hint 环境变量 阻止
声明 NONE
→ 推断 READ
scripts/run.mjs:211 os.hostname() + os.userInfo() 命令执行 通过
声明 WRITE
→ 推断 NONE
SKILL.md声明Bash工具但代码中无subprocess调用 可疑产物与外联
中危 外部 URL
https://www.tokendidi.cn/api/free-hint scripts/run.mjs:215
依赖与供应链
没有结构化依赖告警。
文件构成
4 个文件 · 643 行
JavaScript 2 个文件 · 572 行Markdown 1 个文件 · 68 行JSON 1 个文件 · 3 行
需关注文件 · 2
scripts/run.mjs 文档声明与实际网络行为不符 · 收集系统标识符用于追踪 · https://www.tokendidi.cn/api/free-hint
SKILL.md Bash工具权限过度声明
其他文件 · ar-aging-check.js · sample.json
安全亮点
检查引擎完全使用Node标准库实现,无第三方依赖
不访问敏感路径如~/.ssh、~/.aws、.env
不访问环境变量中的敏感关键字
不进行代码混淆或eval执行
材料不足时不输出默认结论,设计合理
退出码设计清晰