问题描述:
通过 npm 安装 @goplus/agentguard 时,skills/ 目录(包含 SKILL.md 和 patrol-checks.md)会被打包进发布产物。LLM agent 可通过 Read 工具读取这些文件,学习报告格式,进而在不执行任何工具的情况下生成完全伪造的报告。
复现步骤:
- 通过 npm 安装
@goplus/agentguard
- 在 agent 本地 SKILL.md 中禁用
patrol 子命令
- 让 agent 执行
agentguard patrol
- agent 返回一份完整、格式正确的 patrol 报告——但 gateway 日志显示 0 次 exec 调用,audit.jsonl 中也没有任何事件。报告中的发现(如"GEMINI_API_KEY 已暴露")完全是捏造的。
根本原因:
npm 包中包含 skills/agentguard/SKILL.md 和 patrol-checks.md。即使用户本地 SKILL.md 禁用了某个子命令,LLM 仍可读取 npm 包内的官方文档并还原出该行为。
影响:
- 伪造的安全报告可能触发不必要的应急响应(如轮换从未泄露的密钥)
- 损害 AgentGuard 作为安全工具的可信度
- 影响所有通过 npm 安装的用户,不只是 Minax
建议修复方案(按优先级):
- 通过
.npmignore 或 package.json 的 files 字段将 skills/ 目录从 npm 发布产物中排除。SKILL.md 应只通过 setup.sh 或 git clone 主动安装。
- 在 SKILL.md 每个子命令章节加入"现实核查要求"——每条 finding 必须引用具体证据(Bash stdout、audit.jsonl 事件 ID、文件路径 + 行号)。没有证据则不允许输出 finding。
- 长期方案:将 patrol/checkup 改为独立 Node.js 子进程(
agentguard-patrol 二进制)。LLM 只负责调用并读取结构化输出,无法"扮演"工具本身。输出经 JSON schema 校验并 hash 签名后写入 audit log。
问题描述:
通过 npm 安装
@goplus/agentguard时,skills/目录(包含SKILL.md和patrol-checks.md)会被打包进发布产物。LLM agent 可通过Read工具读取这些文件,学习报告格式,进而在不执行任何工具的情况下生成完全伪造的报告。复现步骤:
@goplus/agentguardpatrol子命令agentguard patrol根本原因:
npm 包中包含
skills/agentguard/SKILL.md和patrol-checks.md。即使用户本地 SKILL.md 禁用了某个子命令,LLM 仍可读取 npm 包内的官方文档并还原出该行为。影响:
建议修复方案(按优先级):
.npmignore或package.json的files字段将skills/目录从 npm 发布产物中排除。SKILL.md 应只通过setup.sh或 git clone 主动安装。agentguard-patrol二进制)。LLM 只负责调用并读取结构化输出,无法"扮演"工具本身。输出经 JSON schema 校验并 hash 签名后写入 audit log。