StackedTEN/prompt-injection-range
GitHub: StackedTEN/prompt-injection-range
一个针对 SOC Agent 的间接 Prompt 注入攻防靶场,内置分层 Guardrail 引擎,用于演示和训练防御多类注入攻击的纵深防御能力。
Stars: 0 | Forks: 0
# Prompt 注入靶场
**一个用于针对 SOC agent 进行 prompt 注入攻击的交互式靶场 —— 以及试图捕获这些攻击的 guardrail 层。**
安全团队正在将 LLM agent 接入到 SOC 中,以实现对告警的分流、工单汇总以及阅读收件箱。问题在于:这些 agent 整天都在读取由攻击者控制的文本。隐藏在告警、邮件或日志中的几句话,就足以劫持 agent —— 将真实的告警篡改为“良性”,迫使其泄露自身配置,或调用特权操作。这就是*间接 prompt 注入*,对于任何汇总不受信任数据的 agent 来说,这都是主要风险。
这个靶场让风险变得具体可见。选择一次攻击;观察未设防的 agent 是如何被劫持的;然后观察一个真实的、确定性的 guardrail 层如何在相同的输入和输出上运行。关键不在于 guardrail 有多神奇——恰恰相反。**自动化的 guardrail 只能缩小爆炸半径;它们无法取代人类。**有些攻击会被拦截,有些只能在事后被捕获,而有一个则会被完全漏掉并转交给人工处理。这种残留风险正是核心教训所在。

## 三层架构的故事
内置的攻击武器库旨在让结果真实地教会你什么是纵深防御:
| 结果 | 含义 | 集合中的示例 |
| --- | --- | --- |
| **BLOCKED · INPUT** | 模式检测器在 agent 看到之前就捕获了 payload。 | “ignore previous instructions…”、role hijacks、forged delimiters、tool-abuse |
| **BLOCKED · OUTPUT** | Agent *确实*被劫持了,但 canary/泄露检测器在输出时捕获了它。 | 绕过输入过滤器的 base64-wrapped exfiltration |
| **FLAGGED · HUMAN** | 两层自动化防护都漏掉了它;决策被移交给人工处理。 | 降低真实告警级别的无关键字社会工程学 |
| **CLEAN** | 合法数据,被正确分流 —— 没有误报。 | 对照组告警 |
混淆的 exfiltration 案例是最真实的核心部分:输入 guardrail 只能**标记**不透明的 base64 blob(它无法读取内部内容),因此 agent 仍然会泄露 —— 而系统 prompt 中植入的 *canary* 负责在输出端捕获泄露。这就是你需要这两层防护的原因,也是为什么任何一层单独使用都不够的原因。
## 运行它(零配置)
```
npm install
npm run dev # http://localhost:3000
```
确定性的 guardrail 引擎和 agent 模拟器完全在客户端运行 —— **无需 API key**。模拟器对已记录的劫持行为进行了建模,因此任何人只要克隆它,靶场就能正常运行。
### 可选:对接实时模型运行
设置一个 API key(在本地或在 Vercel 中),将 payload 发送给真实的模型,而不是模拟器:
```
cp .env.example .env.local # add ANTHROPIC_API_KEY
npm run dev
```
Guardrail 层是确定性的,因此它们会以完全相同的方式检查实时模型真实的输入和输出。现代模型能够抵御许多此类攻击 —— 当它们做到这一点时,这是一个发现,而不是一个 bug。
## 部署到 Vercel
推送代码仓库并在 [vercel.com/new](https://vercel.com/new) 导入。它会作为一个标准的 Next.js 应用程序部署,无需任何配置。仅在需要实时模式时才将 `ANTHROPIC_API_KEY` 添加为环境变量。
## 构建方式
```
lib/attacks.ts # the injection arsenal, each wrapped in a realistic SOC artifact
lib/guardrails.ts # the detector engine: input + output layers, with a system-prompt canary
lib/agent.ts # the SOC triage agent (simulator) + the run orchestration
app/api/triage/ # optional live-model route; falls back to the simulator with no key
app/page.tsx # the range UI
tests/ # the engine's behavior is pinned by tests
```
核心实质是 `lib/guardrails.ts` —— 该层是真实代码,可以对你提供给它的任何文本(包括你自己的文本)运行。其他的一切都是为了让其行为更加易于理解而存在的。
## 测试
```
npm test
```
测试套件证明了检测器会在每个攻击类别上触发,对干净的对照组**不会**误报,只会标记(绝不信任)混淆的内容,并且端到端的结果会落在正确的层级 —— 包括混淆的 exfiltration 绕过了输入层但会在输出层被捕获。
## 本项目的定位
它**是**一个可用的、带有主观倾向的参考,用于针对安全 agent 的分层 guardrail,并内置了 human-in-the-loop 路由。它**不是**一个完整的 prompt 注入防御方案 —— 模式检测器在设计上就是可以被绕过的,这正是 FLAGGED · HUMAN 通道所承认的事实。这些 payload 是用于防御性研究的自然语言操纵;不包含任何漏洞利用代码。
## License
MIT —— 见 [LICENSE](LICENSE)。
标签:AI安全, Chat Copilot, DLL 劫持, DNS 反向解析, 大语言模型, 安全靶场, 自动化攻击