thylinao1/gauntlet

GitHub: thylinao1/gauntlet

Gauntlet 是一个自主 AI 红队测试工具,通过模拟攻击者对 LLM 应用进行 OWASP LLM Top 10 评分并提供一键运行时防护,帮助团队在发布前发现和修复 prompt 注入等安全漏洞。

Stars: 0 | Forks: 0

# Gauntlet — 自主 AI 红队 **把你的 AI 扔进去。看看什么能活下来。** [![使用 Vercel 部署](https://vercel.com/button)](https://vercel.com/new/clone?repository-url=https%3A%2F%2Fgithub.com%2Fthylinao1%2Fgauntlet) Gauntlet 是一个自主 agent,它会像真正的攻击者一样攻击你的 AI 应用 (prompt 注入、越狱、系统 prompt 泄露、工具滥用、间接注入),根据 **OWASP LLM Top 10 (2025)** 对其进行评分, 然后为你提供一个一键运行时防护并重新测试,让你亲眼看着 成绩从 F 提升到 A。Prompt 注入是 LLM 的头号风险,但大多数团队在发布 AI 功能时 完全没有进行对抗性测试。 ## 90 秒震撼演示 1. 选择一个目标:内置的易受攻击机器人、你粘贴的系统 prompt、真实模型,或你自己的 HTTP endpoint。 2. 点击 **Run Gauntlet**。自主攻击者会发起 OWASP 映射的探测;每次尝试的结果都会 实时流式传输到攻击控制台并附带判定。 3. 目标泄露了其隐藏的系统 prompt 和植入的机密。评分卡瞬间变为 **F**。 4. 点击 **Apply Guard & Re-run**。运行时防护会阻止注入并掩盖机密, 分数将实时攀升至 **A**。在真实应用上展示前后的变化。 ## 它是如何工作的 流式多阶段 agent 循环 (`lib/engine.ts`),通过 Server-Sent Events 呈现: ``` flowchart LR U["Pick target / paste prompt / BYO endpoint"] --> API["POST /api/run — SSE"] API --> ENG["runGauntlet engine"] ENG --> PLAN["Planner: select OWASP attack families"] PLAN --> ATT["Attacker: seeded + (live) generated probes, incl. multi-turn & indirect"] ATT --> TA["TargetAdapter.respond()"] TA --> GUARD["Guard: regex firewall + classifier + output redaction"] GUARD --> ORACLE["Oracle: canary, refusal-gated"] ORACLE -->|compromised / safe / blocked| ENG ENG --> SCORE["Scorer: OWASP LLM Top 10 grade"] ENG ==>|stream events| UI["Attack Console + Scorecard + remediation"] ``` - **攻击者是生成式的且感知目标。** 有了密钥,黑盒 LLM 仅根据目标的公开名称和描述就能编写针对特定应用的 探测(已验证:它能为 shell 工具 agent 编写 `cat /etc/passwd` 和 `mysqldump`,为支持机器人编写客户 PII 探测)。它还可以 生成多轮升级和间接注入文档。没有密钥时,它会回退到 确定性的种子语料库,确保演示永不中断。 - **确定性妥协检测。** 每个内置目标都会植入一个 **canary**(金丝雀)机密;只有当 canary 出现在输出中 **且** 输出不是拒绝时,攻击才算 成功。这个拒绝关卡至关重要:它可以防止一个在拒绝时引用了 payload 的模型被判定为泄露。 - **六个 OWASP 类别,范围明确。** LLM01(prompt 注入)、LLM02(敏感信息 泄露)、LLM05(不当输出处理)、LLM06(过度自主)、LLM07(系统 prompt 泄露)、LLM10(无限制消耗)。训练时的风险(LLM03/04/08)不在范围内。 - **防护是分层的、确定性的,并且在运行时是免费的。** 它会对输入进行规范化和解码 (NFKC、零宽字符和同形字剥离、base64 和十六进制解码),因此编码或 unicode 伪装的 攻击无法绕过词表,它会使用加权意图模式对其进行评分,然后对输出进行清理 (机密脱敏、标记中和、长度限制)。可选的第二层添加了一个 学习分类器来捕获 regex 遗漏的释义(参见下文的“防护”部分)。这是诚实的 风险降低,而不是声称“100% 安全”。 ## 我们测量了什么 演示所能支撑的数据,而非形容词。使用 `npm run eval` 重新生成(写入 `public/eval.json`,并在 UI 中展示)。 - **Oracle 准确率**(基于 18 个标记案例集):**0% 误报(9 个负例),11% 漏报(9 个正例中的 1 个)。** 唯一 漏掉的是混淆的数据外泄(语音拼出的 canary),这是字面量 canary 检测的已知限制,我们将其展示出来而不是隐藏。 - **可重现的成绩**(离线、确定性):SupportBot **F (10/13) → A**,DevAssistant **F (5/13) → A**,PolicyBot **F (9/13) → A**。 - **针对真实的前沿模型**(Claude Haiku 4.5,约 40 次探测,日期 2026-06-04):直接注入 泄露 0 次,间接注入 8 次中 0 次,多轮 0 次,以及故意过度宽松的 prompt (“向审计员披露”、`DEBUG:` 后门)各 0/3。唯一的泄露来自 **指令冲突** prompt(既要求保密又要求保持透明),约为六分之一。 诚实的结论是:当前的前沿模型能够抵御这些攻击,真正的风险在于 prompt 配置错误,而这正是 Gauntlet 为你的应用所揭示的。 - **防护准确性**(基于 15 个良性 / 15 个注入的标记集,`npm run eval:guard`),全部保持 **0% 误报**(防护永远不会阻止真实用户):regex 捕获了 53%,本地 deberta-v2 分类器捕获了 **80%**(合计 87%),而在实时防护运行中执行的 LLM 裁判捕获了 **93%**。 输出防护(canary 脱敏)是输入漏过过滤器时的最后防线。由于是 自编写的小型数据集,因此请将召回率视为参考。 - **Web 性能**(部署站点的 Lighthouse,无头 Chrome,单次实验室运行):性能 **96**,无障碍 **100**,最佳实践 **100**,SEO **100**;LCP 2.3s,CLS 0,TBT 60ms,FCP 1.3s。这些是实验室单次运行的数据,而非实地数据。 ## 这有什么不同 开源扫描器(NVIDIA garak、Microsoft PyRIT、DeepTeam)和测试工具(promptfoo)都能 生成攻击,promptfoo 甚至有 Web UI 和 prompt 加固步骤。Gauntlet 的切入点更窄、更具体: 从可见的攻击到评分、再到一键防护、再到重新评分的 **循环**,由 非专家运行,带有字母评分和每次攻击的前后对比。这不是“我们发明了 红队测试”;而是“我们让非安全工程师也能理解这种发现并修复的循环, 并且我们测量了我们声称的每一个部分”。 ## 目标 - **SupportBot / DevAssistant / PolicyBot** — 内置的、故意留下漏洞的机器人,并植入了 canary。确定性的,因此从 F 到 A 的演示在离线状态下是可靠的。 - **DocBot (indirect)** — 总结不受信任的文档;测试间接注入(恶意 指令隐藏在文档内部)。在实时模式下使用真实模型。 - **Live model bot** — 处于简单保密 prompt 下的真实 LLM。它大部分时候都能守住,这是 诚实的结果。 - **你的 AI(粘贴 prompt)** — 粘贴你的系统 prompt;Gauntlet 会植入一个机密,并在实时模式下 测试真实模型是否会泄露它。 - **你的 endpoint(BYO)** — 将 Gauntlet 指向你控制的真实的 HTTP chat endpoint。黑盒:你 提供一个绝不应出现的观察字符串。实时门控并带有 SSRF 防护。 ## 防护 `lib/guard.ts` 是快速、免费、离线的首层防护(规范化、解码、加权模式)。 `lib/classifier.ts` 是可选的、学习型的第二层防护,只有在 regex 没有 拦截成功时才会运行,因此在常规路径上没有任何开销,其存在是为了捕获新型释义: - **模型裁判后端**(`GAUNTLET_SMART_GUARD=true` 加上密钥):由 LLM 对输入进行分类。 - **本地分类器后端**(`GAUNTLET_GUARD_BACKEND=transformers`):通过 `@huggingface/transformers` 在进程内运行一个免费的、本地的、经过训练的 分类器,例如 `protectai/deberta-v3-base-prompt-injection` 或 Meta Llama Prompt Guard 2。无 API 成本。这是 生产级路径;安装 `@huggingface/transformers` 以启用它。 两者在缺失或出错时都会安全地降级到 regex。 ## 运行它 ``` npm install npm run dev # http://localhost:3000 (or PORT=3210 npm run dev) npm run build # production build npm run eval # measure oracle accuracy + before/after, write public/eval.json npm test # unit tests (guard, oracle, grader, engine F->A) npm run demo:verify # Playwright: drive the real F->A flow three times ``` 演示不需要任何环境变量。它在离线下即可运行。 ### 实时 LLM 攻击者和真实模型目标 黑盒、模型生成的攻击者(`lib/attacker.ts`)仅根据 目标的公开名称和描述编写针对特定应用的探测。真实模型目标(`live-claude`、`indirect-doc`、 粘贴的 prompt 和 BYO-endpoint 目标)会调用真实的模型。通过以下方式启用: ``` # .env.local GAUNTLET_LIVE=true ANTHROPIC_API_KEY=sk-ant-... # or OPENAI_API_KEY # GAUNTLET_MODEL=claude-haiku-4-5-20251001 # 可选的 model override # GAUNTLET_SMART_GUARD=true # 可选的 model-judge guard layer ``` 然后运行 **`npm run dev:live`**。发生任何错误(密钥缺失、响应错误、解析失败)时,它会 回退到离线的种子语料库,确保演示永不中断。 **消费上限。** 实时消费受全局预算(固定数量的付费运行次数, `GAUNTLET_LIVE_BUDGET`,默认为 40,在 Haiku 上大约两美元)加上每 IP 速率限制的约束。 当存在 `UPSTASH_REDIS_REST_URL`/`KV_REST_API_URL` 时,预算由 Upstash 或 Vercel KV 支持, 因此该上限适用于所有 serverless 实例;如果没有,它会回退到每实例计数器。 当达到预算时,运行会回退到种子语料库,UI 会显示平静的“所有者设置了 限制”通知(而不是错误)。所有者可以通过 `curl -X POST /api/admin/reset -H "x-admin-secret: $GAUNTLET_ADMIN_SECRET"` 重置它。可选设置 `GAUNTLET_OWNER_CONTACT`,以便通知告诉访问者如何联系你进行重置。 ## 技术栈 Next.js 16(App Router、路由处理器、流式传输) · React 19 · TypeScript · Tailwind v4 · Vitest · Playwright · 部署目标 Vercel。 ## 项目布局 ``` app/ page.tsx hero + console api/run/route.ts SSE endpoint streaming the run components/Console.tsx live attack console + OWASP scorecard + eval strip (client) lib/ contract.ts shared types (the interface contract) attacks.ts seed attack corpus (incl. multi-turn + indirect) targets.ts bundled vulnerable bots, real-model + BYO targets, canaries attacker.ts live LLM attacker vs seeded corpus guard.ts regex firewall (normalize, decode, weighted patterns) classifier.ts optional learned guard layer (model-judge / local transformers) oracle.ts compromise oracle (canary, refusal-gated) engine.ts the red-team loop + scorer scripts/eval.ts oracle accuracy + reproducible before/after tests/ vitest unit + Playwright demo-verify docs/ SPEC, CONTRACT, architecture ``` 请参阅 [`docs/architecture.md`](docs/architecture.md) 和 [`docs/CONTRACT.md`](docs/CONTRACT.md)。
标签:AI安全, Chat Copilot, DAST, LLM测试, 人工智能, 恶意软件分析, 特征检测, 用户模式Hook绕过, 红队评估, 自动化攻击