Skip to content

[P0] LLM 可利用 npm 包内置的 skill 文档伪造 AgentGuard 报告 #51

@nnn228085-star

Description

@nnn228085-star

问题描述
通过 npm 安装 @goplus/agentguard 时,skills/ 目录(包含 SKILL.mdpatrol-checks.md)会被打包进发布产物。LLM agent 可通过 Read 工具读取这些文件,学习报告格式,进而在不执行任何工具的情况下生成完全伪造的报告。

复现步骤

  1. 通过 npm 安装 @goplus/agentguard
  2. 在 agent 本地 SKILL.md 中禁用 patrol 子命令
  3. 让 agent 执行 agentguard patrol
  4. agent 返回一份完整、格式正确的 patrol 报告——但 gateway 日志显示 0 次 exec 调用,audit.jsonl 中也没有任何事件。报告中的发现(如"GEMINI_API_KEY 已暴露")完全是捏造的。

根本原因
npm 包中包含 skills/agentguard/SKILL.mdpatrol-checks.md。即使用户本地 SKILL.md 禁用了某个子命令,LLM 仍可读取 npm 包内的官方文档并还原出该行为。

影响

  • 伪造的安全报告可能触发不必要的应急响应(如轮换从未泄露的密钥)
  • 损害 AgentGuard 作为安全工具的可信度
  • 影响所有通过 npm 安装的用户,不只是 Minax

建议修复方案(按优先级):

  1. 通过 .npmignorepackage.jsonfiles 字段将 skills/ 目录从 npm 发布产物中排除。SKILL.md 应只通过 setup.sh 或 git clone 主动安装。
  2. 在 SKILL.md 每个子命令章节加入"现实核查要求"——每条 finding 必须引用具体证据(Bash stdout、audit.jsonl 事件 ID、文件路径 + 行号)。没有证据则不允许输出 finding。
  3. 长期方案:将 patrol/checkup 改为独立 Node.js 子进程(agentguard-patrol 二进制)。LLM 只负责调用并读取结构化输出,无法"扮演"工具本身。输出经 JSON schema 校验并 hash 签名后写入 audit log。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions