wip-readme-format
README格式化工具存在文档-行为差异:声明filesystem权限为NONE但实际执行WRITE操作,同时动态导入child_process模块执行git命令检查文件状态。
为什么得出这个结论
1/4 个维度触发发现 2 项声明之外的能力或越权行为。
提取到 2 个一般风险产物,需要结合上下文判断。
没有形成明确的恶意路径。
依赖结构存在,但暂未看到明显高危告警。
风险分是怎么被拉高的
SKILL.md声明filesystem:NONE,但代码执行writeFileSync写入README-init-*.md和README.md
format.mjs:322 使用await import('node:child_process')动态导入,未声明shell执行能力
execSync执行git status --porcelain检查文件状态,属于隐式shell操作
从wip-universal-installer/detect.mjs导入detectInterfaces/detectToolbox,来源未声明
最关键的证据
未声明的文件系统写入权限
SKILL.md声明filesystem为NONE,但format.mjs执行writeFileSync写入README-init-*.md、README.md和TECHNICAL.md,另有mkdirSync创建ai/_trash目录、unlinkSync删除临时文件。
format.mjs:310 动态导入child_process模块
format.mjs第322行使用await import('node:child_process')动态导入模块,在DEPLOY模式下执行git status命令检查文件状态。动态导入可能意图规避静态分析。
format.mjs:322 外部依赖模块来源未声明
format.mjs从../wip-universal-installer/detect.mjs导入detectInterfaces和detectToolbox函数。该模块的功能和安全性未在SKILL.md中说明。
format.mjs:27 shields.io外部URL引用
代码生成shields.io badge URLs用于README,包含外部链接。预扫描标记为medium risk。
format.mjs:82 声明能力 vs 实际能力
format.mjs:310 writeFileSync写入README-init-*.md, format.mjs:370 writeFileSync写入README.md format.mjs:322 await import('node:child_process'), format.mjs:334 execSync('git status') 仅生成shields.io badge URLs,无实际HTTP请求 导入外部模块detectInterfaces但仅用于检测接口类型 可疑产物与外联
https://img.shields.io/badge/interface-$ format.mjs:82
https://img.shields.io/badge/Universal_Interface_Spec-black?style=flat&color=black format.mjs:506
依赖与供应链
| 包名 | 版本 | 来源 | 漏洞 | 备注 |
|---|---|---|---|---|
| wip-universal-installer/detect.mjs | unknown | local sibling module | 否 | 内部依赖,来源为同仓库tools目录 |
| node:fs | bundled | node built-in | 否 | Node.js标准库,用于文件读写 |
| node:path | bundled | node built-in | 否 | Node.js标准库,用于路径处理 |
| node:child_process | bundled | node built-in | 否 | 动态导入,用于git status命令执行 |
文件构成
format.mjs