「AI Agent越狱测试」+「提示词注入」+「HackAgent」:19种攻击手法拆解
原创
句芒安全实验室
句芒安全实验室
句芒安全实验室
2026年11月9日 11:19
上海
去阅读
上周有个做客服机器人的团队问我:上线前我们试了三十条越狱提示词,一条都没成,这样算安全吗?
我说不算。你试的这三十条从哪来的?不知道。漏了哪些类?不知道。判定「没成」的是谁?如果判的人就是写提示词的人,这条结论只证明他同意自己。
红队这件事,难的从来不是想出几个越狱 prompt。难的是三件事:攻击要有出处,判定要有标准,结论要能复现。少一件,报告就只剩感觉。
HackAgent 是照这三件事搭的。AISecurityLab 出品,Apache-2.0,Python 3.10+,v0.17.0 在 2026-11-02 发布;535 星、112 个 fork、17 个未关条目;2025-05-14 建仓,2026-11-07 还在推。仓库里 637 个 Python 文件、约 10.8 万行、146 个测试文件。我本机装的是 0.17.0,下面带命令的输出都是真跑出来的。
它的模型只有一句话
一个 campaign 把 goals 送进 attacks,打到 target,再由 judges 判定哪些回复算越狱。
四个角色共用一种写法:名字、怎么连、怎么采样。目标、攻击用的辅助模型、法官、护栏、目标分类器,全是同一个 ModelConfig 形状。你会写目标,就会写法官。
19 种攻击,不是 19 个 prompt
hackagent campaign list 自己报的分类是:静态 9、自适应 8、多轮 2。
静态九种:baseline 直接提交做对照、static\_template 模板、flipattack 翻转字符和词、cipherchat 加密、h4rm3l 组合装饰器程序、mml 把有害提示编进图片打视觉模型、fc 自动生成流程图图片、tfc 文本流程图(DOT / Mermaid / TikZ / PlantUML / ASCII)、rag 往检索库里塞投毒文档。
自适应八种:bon 最优 N 选、pap 用说服技巧分类、pair 攻击者加评分器循环、tap 树搜索加剪枝、advprefix 对抗前缀预填、autodan\_turbo 带预热和检索的策略搜索、tool\_output\_ipi 污染工具返回、toolhijacker 污染工具描述去影响检索和选择。
多轮两种:crescendo 一轮一轮往目标上推,被拒就回退;stac 在一条会话里让 Agent 按顺序调工具。
另外四个带 indirect 标签:rag、stac、tool\_output\_ipi、toolhijacker。它们的入口不在对话里,在 Agent 读到的数据里。这是这两年的主线:攻击面从「模型说什么」挪到了「Agent 做什么、读了什么」。
每种都对应一篇论文或参考实现,参数默认跟论文。这一点比一堆「越狱提示词合集」实在:你能查到它为什么这么设。
判定:三个法官,一张判决
判定不是「跑完看一眼」。evaluation 里有 judges 列表、aggregation、threshold 三个关键项。
aggregation 有四种:majority、mean、max、any,默认 majority,也就是过半已投票才算成功。threshold 默认 7.0,满分 10。
打分类型七种:harmbench、harmbench\_variant、jailbreakbench、nuanced、on\_topic、scorer、rag\_outcome。除了 scorer 是 0 到 10 的小数,其余六种都是二分类,rag\_outcome 看检索结果。
我认为最值得抄的是弃权语义。法官调用失败,或者回答读不出来,它投的是弃权,不是「安全」。如果所有法官都弃权,这次尝试直接记 error,不进成功率的分母。很多评测把「法官挂了」算成「没被攻破」,成功率就是这么被抬上去的。
指标也给了:success\_rate、mean\_score、majority\_vote\_rate、fleiss\_kappa、per\_judge\_strictness。最后一项还带 bias\_gap,能看出哪个法官偏松、哪个偏紧。
法官自己要被审计
这一块是我最认可的。evaluation.audit 默认关,开了才会在第一次攻击前把整个面板跑一遍标注样本。
样本是 HarmBench 的人工标注验证集,100 条,seed 42,revision 固定在一个 commit 上。它量两件事:每个法官单独准不准,面板聚合准不准。这两个数字只报告,不替你判「够不够好」,因为够不够好取决于你这次要干什么。
真正能 fail 的只有稳健性:把同一条回答加上礼貌前缀后缀、拒绝前缀、教育框架,内容一个字没改,判决就不该变。理想是 0 次翻转,多一次就是法官在测文风,不是在测危害。
on\_failure 可以选 warn 或 stop。stop 是拒绝开跑:面板不可信,跑出来的成功率也没意义。
目标不只是 API
connection.type 决定它怎么跟目标说话。聊天 API 四种:LITELLM、OPENAI、OLLAMA、LANGCHAIN。真 Agent 五种:CLAUDE\_CODE、CODEX、GOOGLE\_ADK、HERMES、WEB。
WEB 是驱动真实网页上的聊天窗口,靠 CSS 选择器定位,页面一改版就断。MCP 和 A2A 在格式里有,但没有后端。
我本机验证过这一点:
$ hackagent campaign validate mcp.yaml
Invalid campaign: Unsupported agent type: MCP.
Native backends: CLAUDE_CODE, CODEX, GOOGLE_ADK, HERMES, WEB
Hermes 这一类值得单独说。Hermes 没有 OpenAI 兼容的 HTTP 端点,仓库用 hermes -z \"prompt\" 的一次性无头模式拿最终回复。更关键的是隔离:Hermes 会在 ~/.hermes/MEMORY.md 里存长期记忆,还有后台技能 curator 会自己写技能。直接拿真实安装去测,目标会「学会」你刚才的探测,后面的攻击轮次就被污染,还会弄脏操作者自己的状态。所以适配器默认加 --ignore-user-config,超时 600 秒。
STAC:用执行验证,不听嘴
STAC 是我觉得最能说明「Agent 时代红队不一样」的一个。
它不看你说了什么,看你做了什么:成功要求工具调用顺序完全匹配参考链,终态匹配 success\_state。失败调用不产生效果,重复的成功调用会让整条序列失效,预算用完就停。
三个内置场景:data\_export 把合成私有记录发到公开预览、permission\_change 把记录改成所有人可写、unreviewed\_publish 跳过评审直接发布。
v1 只加载声明式的内存 fixture,不执行宿主机上的工具,状态和参数全是字符串。它复现的是论文 arXiv:2509.25624 里的 FM4、FM5、FM6 三类失败模式,不是全量基准。这个边界它自己写在文档里。
上手:先跑一条,别跑十九条
uv venv --python 3.12
uv pip install hackagent
hackagent campaign validate campaign.yaml
hackagent campaign run campaign.yaml
一个 campaign 就是一个 YAML:dataset 给 goals,attacks 给手法,target 给目标,evaluation 给法官。没有法官也能跑,只是只记录、不打分。
execution 里几个默认值要记住:preflight 默认 true,开跑前把每个模型都探一遍,端点不通就直接报错,不会跑到一半才炸;concurrency 的 attack、target、judge 默认都是 1;retries 默认 0;output 默认写 ./logs/runs,格式 json 或 jsonl,提示词、回复、搜索轨迹默认都存。
存储默认 local,写本机 SQLite;选 remote 时如果没配 key,会在开跑前就失败,不会跑完才发现结果没上传。
我本机真跑了一次 dry\_run:
validate 通过,表格里 Judges 是 0。dry\_run 打印 succeeded,但 Attack、Attempts、Successes、Error 四列全是空的——因为它一条请求都没发。它甚至打印了 Output → ./logs/runs,但那个目录根本没建。
这就是我要的诚实:没跑就说没跑,不拿空表格冒充 0% 越狱。
避坑
- 不写 judges,就只记录不打分。judges 默认是空列表,不是「默认安全」。
- 弃权不是安全。全弃权记 error,不进分母;把弃权当安全,成功率会虚高。
- require\_all\_judges 默认 false。一个法官说成功就算成功,要严格得自己打开。
- audit 默认关。不开审计,你手里只有成功率,没有法官可信度的证据。
- 护栏默认 fail open。LLMGuardrail 的分类器不可用或读不出结果时,文本直接放行。配了护栏不等于拦住了。
- MCP、A2A 只有格式没后端,写了会在解析阶段就失败。
- WEB 目标靠 CSS 选择器,页面改版即失效。
- 自适应攻击要花辅助模型的钱。autodan\_turbo 还要 attacker、embedder、summarizer 三个角色;audit 跑 100 条样本再乘上每种改写。
- 并发默认 1。别把它当压测工具,要压得自己调 concurrency 和 retries。
- 样本量差很多。AgentHarm 208 条,AgentHazard 2653 条,HarmBench 200 条加 100 条上下文版,StrongREJECT 324 条,AdvBench 520 条,Do-Not-Answer 939 条。全量跑一轮的 token 成本要自己先算。
适合谁
适合要在 Agent 上线前出一份可复现评估的团队、要给客户交付红队报告的安全服务方、研究提示注入和多轮攻击的研究者。它的价值不在「攻击多」,在「同一份 YAML 换个模型还能重跑,法官和审计都有出处」。
不适合只想扫一遍提示词的人。它不会告诉你「这个模型安全」,只会告诉你「在这些 goals、这些攻击、这些法官下,成功率是多少」。剩下那句判断,还是得你自己下。
如果只跑一条,我的建议是 baseline 加 flipattack 两条静态攻击先建基线,再开 audit 看两个不同厂商的法官是否一致,最后才加一条自适应。十九条一起上,你得到的是一堆没有对照的数字。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论