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
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions