AI/LLM 红队测试实战笔记
欢迎。这是一份关于大语言模型(LLM)红队测试的实战笔记,以渗透测试人员的视角写成。用上方的标签页导航:基础讲清楚你到底在测什么,攻击和方法论讲具体怎么做,训练营是一套带教程,PortSwigger 收录了实操靶场,范围和攻击流程帮你界定目标,术语则是速查词典。第一次来?把这一页从头到尾读完就好。任何时候按 / 都能全站搜索。
先读这一段。一分钟就能讲明白:所谓“AI 功能”到底是什么,模型 / 聊天机器人 / 智能体这几个词分别指什么,以及 AI 是怎么生成回答的。看懂了这张全景图,其他标签页就都好理解了。
所谓“AI 功能”,不过是一个普通应用外接了一个 AI 模型。你要测的是客户自己搭建的那个应用。模型这颗“大脑”通常属于厂商(Claude、OpenAI),不在测试范围内。
这三个词把所有人都绕晕了。其实它就是一级级往上加,每一级只多一样东西。
越往右,它能做的事越多,你能攻击的面也越大。
模型并不会"思考"。它读文字,然后一次又一次地猜下一个词。真正值得盯着看的不是猜,而是它拿来猜的那些文字是谁写的。最终摆在它面前的有五种文字,其中只有一种是做这个应用的人写的。
一张图,从左往右看。五种文字从左边进来,被拼成一整条字符串,交给模型。注意看那块琥珀色的文档:它坐在绿色的 user 回合里,而等模型拿到它的时候,它已经不见了。每个方框上都写着它会变成哪种攻击,而三处虚线标记是控制唯一能站的位置。
每一支箭头都在运送文字。角色标签一路活到模型里面,但它们标的是回合,不是作者,而且三处控制全都在盒子外面。
再看一眼图里的模型方框。角色标签进去了,也从另一头出来了,但那块琥珀色的文档没有:它被折进了绿色的 user 回合里,而在模型内部,已经没有任何东西说明那是一个陌生人写的。
角色是真实存在的。现代 API 把 system、user、assistant、tool 当作分开的字段接收,它们会以分隔符 token 的形式一路活到 token 序列里。活不下来的,是任何比一个回合更细的东西。
检索到的文档没有属于自己的角色。它被贴进某个 user 回合里,或者某个 tool 回合里,所以等模型读到它的时候,它的分量恰好等于把它包进去的那个回合。工具取回来的东西也一样:外壳和攻击者的网站,是同一个标签底下的同一团东西。
而且角色只是一种倾向,不是一种权限。模型被训练成把 system 的指令看得比 user 的重,大多数时候这个训练是管用的。但那是从例子里学来的倾向,不是运行时强制执行的规则,所以一条足够理直气壮的指令,哪怕待在工具的返回里,照样可能赢。指令和数据,依然是同一种材料。
所以真正存在的控制,都站在这个盒子的前面或者后面:输入过滤、检索白名单、输出扫描、工具确认、沙箱。那些试图在里面工作的,比如指令层级训练,本身也是倾向,而倾向是会被掰弯的。因此真正有用的问题从来不是“这个模型安全吗”。而是:攻击者能在这些箭头里的哪一支上写字,以及当他写下去的时候,盒子的另一头连着什么。
上面每一层都有自己对应的漏洞。用大白话讲,这就是 OWASP LLM Top 10:
| 层 | 对应的漏洞 |
|---|---|
| 你的输入 | 提示词注入:你的文字被当成命令执行。 |
| 模型 | 越狱(突破它的安全限制);如果做过微调,还能泄露训练数据。 |
| 文档 / RAG | 给文档投毒,让模型照着文档里的指令执行(间接注入)。 |
| 工具 | 诱导它调用本不该用的工具,或攻击工具的输入(SQLi、SSRF、执行代码)。 |
| 被展示的回答 | 不安全的输出处理:应用把回答当成 HTML/SQL 直接执行,于是有了 XSS 等一系列问题。 |
同一个回答,在一个应用里没问题,在另一个应用里可能就是灾难。所以开测之前先问:这个应用是干什么用的?在这里什么才算“出问题”?
| 应用 | 什么算“出问题” |
|---|---|
| 故事 / 游戏生成器 | 就要天马行空的创意输出,几乎怎么都行。 |
| 内部 HR 或客服机器人 | 必须照实说,编造一条并不存在的政策就是漏洞。 |
| 公司对外的邮件撰写助手 | 要诚实又符合品牌调性,写出粗鲁或不实的内容就是漏洞。 |
通常你想要的是模型的智能(好的语言与推理能力),而不是它的知识:它应当基于你提供的数据来回答,答不上来就说“我不知道”。
参考来源:OWASP Top 10 for LLM Apps、PortSwigger Web LLM attacks、MITRE ATLAS。接下来:先看“术语”标签页把词搞懂,再看“方法论”了解整体计划。