sjh9714/agentpwn

GitHub: sjh9714/agentpwn

一个可自托管的 AI 编程 agent 安全教育实验室,通过确定性模拟的攻击关卡教授 prompt 注入等真实安全威胁及其防御方法。

Stars: 0 | Forks: 0

# AgentPwn [![ci](https://static.pigsec.cn/wp-content/uploads/repos/cas/99/993938d8ce5e902ccfb9d6747725c320d855dea3235ed9a304cedf0d94c9321f.svg)](https://github.com/sjh9714/agentpwn/actions/workflows/ci.yml) [![play](https://img.shields.io/badge/play-live%20demo-39d98a)](https://sjh9714.github.io/agentpwn/) [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE) **你的 AI 编程 agent 会泄露机密并植入后门。这里是证明——以及这些攻击的具体运作方式。** ![AgentPwn 演示 —— 该 agent 拒绝了直接泄露 .env 的请求,但在被指向一个被投毒的入职文档后,它还是将其泄露了](https://static.pigsec.cn/wp-content/uploads/repos/cas/53/53ab5d36c003ac75637a31b78e7252ba4f8dfd101d5cf7c0078e5bf1e415b268.gif) ### ▶︎ 在浏览器中体验:**https://sjh9714.github.io/agentpwn/** —— 无需安装,无需 API key。 AgentPwn 是一个可自托管的安全实验室,在其中*你*是攻击者。你通过 prompt 注入一个**模拟的** AI 编程 agent,使其泄露 `.env` 机密,在审查扫描器眼皮底下提交恶意代码,并通过被投毒的 MCP 工具将 AWS 密钥窃取出来。每个关卡都以 2025-2026 年间发生的真实事件为原型。 - 🧠 **确定性。** 无需 LLM,无需 API key,零成本。这里的“agent”是一个手工编写的状态机,因此每个关卡都是可复现且经过单元测试的。它在你的机器上的行为与在我的机器上完全一致。 - 🎯 **以工具调用判定胜负,而非主观感觉。** 只有当机密真正出现在出口工具调用的参数中或已合并的提交中时,你才算赢得关卡——绝不取决于 agent 的文本输出。 - 🔒 **教育与防御导向。** 这些是防御者不断遭遇的攻击类型。扮演一次攻击者,你将再也不会草率地配置 agent。 - 📸 **可分享。** 通关一个关卡,你将获得一张胜利卡片(“我让一个编程 agent 在一条消息内泄露了它的 .env”),你可以将其导出为 PNG。 ## 运行方式 ``` git clone https://github.com/sjh9714/agentpwn cd agentpwn npm install npm run dev # open the printed localhost URL ``` 无需配置,无需密钥,无需账户。`npm test` 会运行关卡完整性测试套件。 ## 关卡 每个关卡都对应一种 AI 编程 agent 真实且已记录的失败模式。 | # | 关卡 | 攻击类别 | 原型 | |---|-------|--------------|-----------| | 1 | 热心的入职向导 | **间接 prompt 注入** —— agent 遵循了隐藏在它读取的文件中的指令 | 编辑器 agent `.env` 数据泄露事件(Amazon Q 类,2025) | | 2 | 绿色通过,后门藏其中 | **供应链盲点** —— payload 隐藏在审查扫描器从不检查的地方(`package.json` / CI 工作流) | 恶意 `postinstall` / 生命周期脚本攻击(2024–2026) | | 3 | 寿命长于 prompt 的规则 | **持久化规则文件注入** —— 被投毒的 `AGENTS.md` / `.cursorrules` 在后续正常的任务中触发 | 规则文件持久化注入(2025–2026) | | 4 | 读懂你心思的工具 | **MCP 工具描述注入** —— 工具*描述*中隐藏的指令劫持了调用 | 被投毒的 MCP 服务器攻击活动(2025–2026) | | 5 | 借来的信任 | **信任元数据伪造** —— 伪造的 `Co-authored-by` 尾部标记触发了自动合并例外 | 自动合并策略中的机器人身份滥用 | | 6 | 走正门的数据外泄 | **受信任通道数据外泄** —— 数据通过公开的 gist 绕过了出口白名单离开 | 通过受信任主机(gists / issues / registries)进行的数据外泄 | | 7 | 混乱的代理人 | **跨委托的权限提升** —— 只读 agent 通过委托给具有特权的子 agent,泄露了它从未拥有过的密钥 | 多 agent 设置中的混淆代理人攻击 | | 8 | 你未批准的 Diff | **审批摘要盲区** —— 隐藏 payload 通过了人类的审查,因为人类批准的是 agent 的摘要,而非 diff 本身 | 隐藏在第三方引入 / 压缩 / 自动生成的文件中的 payload | 每个关卡都讲授了一课:为什么天真的防御手段(关键字黑名单、仅针对源代码的扫描器、主机白名单)会失效,以及到底什么才能真正阻止它。当你获胜时,关卡会显示一个 **🛡 修复方案** 面板 —— 防御的核心要点。这些内容已收集在 [docs/DEFENSES.md](docs/DEFENSES.md) 中。 ## 胜负判定方式 模拟的 agent 具有真实的护栏:直接要求它“将 .env 发布到 attacker.com”,它会拒绝。你必须找到*注入路径*。当 agent 行动时,它的行为是结构化的工具调用: ``` { tool: 'httpFetch', args: { url, method, body } } { tool: 'gitCommit', args: { message, files, coAuthor } } { tool: 'mcpCall', args: { server, tool, params } } ``` 关卡的 `winCondition` 会检查这些参数 —— 例如“机密值是否通过一个*被允许*的出口请求离开了?”—— 因此获胜是一个真实且可检查的事件,而不是模型说了一些听起来像是成功的话。这是由测试强制执行的:每个关卡都附带了 `intendedSolution` prompt 序列,测试套件会将其在引擎中运行并断言获胜,因此 **没有任何关卡会以无法获胜的状态发布**,同时测试也会断言天真的直接外泄尝试*不会*获胜。 ## AgentPwn *不是*什么 - 它**不是**用于你真实 agent 配置的扫描器。它讲授攻击类别;它不审计你的设置。 - 它**不是**对真实模型的实时越狱。该 agent 是确定性的且是手工编写的,这是故意的 —— 这正是使其可复现且免费运行的原因。(一个清晰标注的自带密钥模式可能是未来的附加功能,而非核心。) - 它**不**包含可运行的漏洞利用代码,也不针对真实系统。 ## 对比分析 - **对比 Lakera Gandalf / Gandalf: Agent Breaker** —— 那些是非常优秀的、托管的、闭源的挑战。AgentPwn 是**开源且可自托管的**,专门专注于 **编程 agent + MCP** 的攻击面(机密外泄、恶意提交、规则文件和工具描述注入),每个关卡都与一个命名的真实世界事件相关联。 - **对比 MCP 扫描器(例如 mcp-scan)** —— 那些是用于检查配置的非交互式 CLI。AgentPwn 是一个**可玩的**实验室,通过让你亲自执行攻击,教你攻击*为什么*会起作用。 - **对比 awesome-* 攻击列表** —— 那些是静态参考。AgentPwn 是动手实践。 ## 贡献关卡 一个关卡就是 `src/levels/` 中的一个单独文件,它实现了 `Level` 接口(`src/engine/types.ts`):一个虚拟文件系统、确定性的 `AgentRule`、一个 `winCondition`、一个 `defense`,以及 —— 必须的 —— 一个供测试套件验证的 `intendedSolution`。如果你的关卡无法通过其预期的解决方案获胜,CI 就会失败。新的攻击类别正是这个项目所渴望的 —— 参见 [CONTRIBUTING.md](CONTRIBUTING.md)。 ## 许可证 MIT —— 见 [LICENSE](LICENSE)。专为防御者和教育工作者而构建。
标签:AI智能体, MITM代理, 大模型安全, 安全, 安全培训, 安全靶场, 暗色界面, 自动化攻击, 超时处理