OWASP LLM Top 10(2026)落到一个测试 Agent 身上
BugHunt 的测试 Agent 整天读不可信的网页,手里有浏览器和提交报告的工具,还有记忆和历史报告库。LLM Top 10 的十个条目,每一条都能在它身上找到具体的样子;它作为 Agent 特有的风险,还要看 OWASP 的 Agentic 清单。
这一讲分三步:先认清版本和编号;再把 2026 版十条逐条映射到 BugHunt 的场景;最后用 22 个合成场景和 10 道确定性护栏,看哪些风险靠护栏能拦、哪些拦不住。
1先认版本:多数条目在三个版本里编号不同
OWASP Top 10 for LLM Applications 发布过三个版次:2023 年的 v1.0 / v1.1、2025 版、2026 版。本讲按 2026 版讲,以官方仓库 GenAI-Security-Project/GenAI-LLM-Top10 的 2026/README.md:13-22 为准(commit 9253e38)。下表中,英文是原名;中文是本文译名,不是官方译本。
| 编号 | 2026 版(本讲) | 2025 版 | 2023/24 版(v1.1) |
|---|---|---|---|
| LLM01 | Prompt Injection 提示词注入 | Prompt Injection | Prompt Injection |
| LLM02 | Sensitive Information Disclosure 敏感信息泄露 | Sensitive Information Disclosure | Insecure Output Handling |
| LLM03 | Excessive Agency 过度代理 | Supply Chain | Training Data Poisoning |
| LLM04 | Supply Chain 供应链 | Data and Model Poisoning | Model Denial of Service |
| LLM05 | Data and Model Poisoning 数据与模型投毒 | Improper Output Handling | Supply Chain Vulnerabilities |
| LLM06 | Unbounded Consumption 无限制消耗 | Excessive Agency | Sensitive Information Disclosure |
| LLM07 | Misinformation 错误信息 | System Prompt Leakage | Insecure Plugin Design |
| LLM08 | Hidden Context Exposure 隐藏上下文暴露 | Vector and Embedding Weaknesses | Excessive Agency |
| LLM09 | Vector and Embedding Weaknesses 向量与嵌入的弱点 | Misinformation | Overreliance |
| LLM10 | Improper Output Handling 输出处理不当 | Unbounded Consumption | Model Theft |
各版本的出处和日期:
- 2026 版:仓库 README 写的是 "published August 4, 2026",官网资源页标的是 8 月 3 日。截至 2026-10-01,官网 genai.owasp.org/llm-top-10/ 列表页仍显示 2025 版。
- 2025 版:官网资源页标注 2024 年 11 月 17 日。
- 2023/24 版:官网 llm-top-10-2023-24 页面,资源 URL 里写作 v1-1。
LLM03:2026。2025 → 2026 对应
| 2025 版 | 2026 版 | 依据 |
|---|---|---|
| LLM01 Prompt Injection | LLM01 | 前言原话(保持第一) |
| LLM02 Sensitive Information Disclosure | LLM02 | 前言原话(保持第二) |
| LLM06 Excessive Agency | LLM03 | 前言原话(升到第三) |
| LLM10 Unbounded Consumption | LLM06 | 前言原话(上升四位) |
| LLM07 System Prompt Leakage | LLM08 Hidden Context Exposure | 前言原话(更名,范围更宽) |
| LLM05 Improper Output Handling | LLM10 | 前言原话(从第五降到第十) |
| LLM03 Supply Chain | LLM04 | 按名称对上(本文推导) |
| LLM04 Data and Model Poisoning | LLM05 | 按名称对上(本文推导) |
| LLM08 Vector and Embedding Weaknesses | LLM09 | 按名称对上(本文推导) |
| LLM09 Misinformation | LLM07 | 按名称对上(本文推导) |
"前言原话"指 2026/final/LLM00_Preface.md:21 直接写到的变化。仓库里的排名迁移图(Bump Chart)画的也是这十条连线。
和 Agentic 清单的分工
2026 版前言(LLM00_Preface.md:25)划了一条边界:模型作为应用里的一个组件出问题时,归这份清单。一旦模型成了行动者,风险就转到 OWASP Top 10 for Agentic Applications。所谓行动者,是指它能调工具、能在会话之间带着记忆、会在下游引发后果。前言的原话是两份要配合着用,"neither one covers that ground alone"。
条目正文里也有几处把范围交出去:
LLM04:2026:9:MCP server 和工具注册表归 ASI04。LLM09:2026:9:不依赖嵌入的记忆攻击归 ASI06。LLM03:2026:18:过度代理在 Agent 系统里表现为 ASI02、ASI03、ASI08。
Agentic 清单由 OWASP GenAI Security Project 于 2025-12-09 发布,十条名称以官网发布文章为准:
| 编号 | 名称 |
|---|---|
| ASI01 | Agent Goal Hijack |
| ASI02 | Tool Misuse |
| ASI03 | Identity & Privilege Abuse |
| ASI04 | Agentic Supply Chain Vulnerabilities |
| ASI05 | Unexpected Code Execution |
| ASI06 | Memory & Context Poisoning |
| ASI07 | Insecure Inter-Agent Communication |
| ASI08 | Cascading Failures |
| ASI09 | Human-Agent Trust Exploitation |
| ASI10 | Rogue Agents |
2BugHunt 的信任边界
先画清楚三件事:哪些东西进了 Agent 的上下文却不归我们控制,Agent 能动哪些东西,它的输出又流到哪里。
不可信的输入
- 被测网页:正文、隐藏元素、控制台报错
- 第三方 MCP server 的工具描述
- 历史 Bug 报告库(RAG)
- 长期记忆(以前从页面里记下的东西)
测试 Agent 能做的事
- 浏览器:点击、填表、导航
- 被测应用的账号(测试账号?管理员?)
- 写记忆、检索知识库
- 提交 Bug 报告、上传附件
输出流向
- Bug 跟踪系统(按 HTML 渲染)
- 文件系统(截图、HAR)
- 开发者(会照着报告去查)
- 账单(每一轮都花 token)
十个条目落在这张图的不同位置:
- 左栏:注入和投毒的入口。
- 中栏:过度代理。
- 右栏:输出处理、泄露、错误信息和消耗。
system prompt 这类隐藏上下文归 LLM08:2026。
3逐条映射(2026 版)
| 条目 | 在 BugHunt 里长什么样 | 前面哪一讲碰到过 | 拦 / 测的办法 |
|---|---|---|---|
LLM01:2026 Prompt Injection | 页面、工具描述、检索到的历史报告里夹带指令:让 Agent 少报、乱点、把信息带出去 | 「MCP 是什么?给 Agent 插上 USB 口」:工具描述也是 prompt;下一讲专讲间接注入 | 原文说目前没有可靠的预防机制(:65),防御靠架构,限制注入成功后能做什么;对抗性红队评测 |
LLM02:2026 Sensitive Information Disclosure | 复现步骤里写了测试密码;HAR 附件带 cookie;引用了别的项目的报告 | 「把工具响应录下来回放,评测就公平了吗?」:cassette 脱敏 | 报告、附件、system prompt 做密钥扫描;检索前先授权 |
LLM03:2026 Excessive Agency | 给了管理员账号;浏览器能去任何域名;删除不用确认 | 「Agent 要执行 rm -rf,谁来拦?」:沙箱与审批;本周后面讲工具权限 | 功能、权限、自主性三样都收到最小;授权写在逻辑里;分级执行(audit / warn / block / escalate) |
LLM04:2026 Supply Chain | 第三方 npm 包、Judge 用的模型别名悄悄变了(MCP server 归 ASI04) | 「MCP 是什么?」:"事后变脸" | 固定版本;工具描述做哈希,变了就停;SBOM / AI BOM |
LLM05:2026 Data and Model Poisoning | 页面上一句话被写进长期规则记忆;有人往知识库塞伪造条目 | 「测试 Agent 怎么记住已经探索过的页面?」:记忆投毒、AgentPoison | 写入时标注来源;来自页面的文本不进规则类记忆。Agent 记忆另见 ASI06 |
LLM06:2026 Unbounded Consumption | "下个月"能一直点;页面诱导逐条提报告;token 失控 | 「Agent 到底是什么?一个 while 循环」:停止条件 | 轮数、token、报告数都设硬上限;Agent 级熔断 |
LLM07:2026 Misinformation | 把环境故障报成 Bug;编造复现步骤;开发者不核实就照着改 | 「环境坏了,测试 Agent 会把它报成 Bug 吗?」「Judge 说 53% 的报告有效,真实是多少?」 | 先核实再行动(Claim-Check-Act):重跑 + 环境健康检查;Judge 校准 |
LLM08:2026 Hidden Context Exposure | system prompt 里写了管理员密码、答案提示 | 「MCP 是什么?」:list_injected_bugs 不能注册给被测 Agent | 隐藏上下文不当秘密,也不当安全边界;凭证不放进去 |
LLM09:2026 Vector and Embedding Weaknesses | 多个项目共用一个向量库,检索到别家的报告;库被投毒 | 「Agent 怎么从一堆 Bug 报告里找到相关的那几条?」 | 按项目隔离检索;按信任等级分开存;检索留日志 |
LLM10:2026 Improper Output Handling | 报告标题原样进 tracker 的 HTML;标题拼成截图路径;生成的复现脚本直接执行 | 「模型怎么'调用'一个函数?」:边界处一律校验 | 按去向编码(HTML 转义、路径净化、参数化);把模型当普通用户,零信任 |
"拦 / 测的办法"一栏是笔者按条目原文的缓解措施挑的,不是 OWASP 针对测试 Agent 的建议。
▶互动演示:22 个场景 × 10 道护栏
合成数据,不调任何模型。18 个有害场景、4 个正常对照,每个场景是一段结构化的轨迹(读到了什么、写了什么、调了什么工具、报告里有什么),"指令"一律是占位符。每个场景的 OWASP 标签是按 2026 版条目原文手工标的。勾选护栏,页面逐步走每条轨迹:有害场景在造成伤害那一步之前被拦下算"拦下";正常场景被拦算"误拦"。所有数字由页面上的 JS 现算,和本地 bughunt_owasp.py 的输出一致。
各条目被拦比例(一个场景可以算进多个条目)
逐场景(点一行看轨迹)
✎练习
LLM03:2026 这种带版本的形式。LLM07_Misinformation.md:21、:32)。policy_template.md:6-7 规定,只有用户和开发者消息、AGENTS.md、request_user_input 的回答算可信内容,其余都是不可信证据。审批的顺序(
approvals.rs:505-523):PermissionRequest hook 先给结论,没给的交给 Guardian(启用自动审批时)或用户(approvals.rs:559-569)。Guardian 输入超预算、且没有强制 Guardian(strict auto-review)时,返回无结论、转回用户(completion.rs:70-83);强制时直接拒绝。配了禁读路径时,批准出沙箱的命令仍带着禁读限制留在沙箱里(
sandboxing.rs:258-265)。C 不对:L75-77 只在有"明确的恶意注入迹象"时,才拒绝低、中风险操作。
A 不对:第 3 周讲过,审批和沙箱是两层。没申请出沙箱的命令,批准后照样在沙箱里跑。所以出沙箱的范围要靠确定性规则收窄。
4面试要点
一句话讲清楚
OWASP LLM Top 10 2026 版共十条:注入、敏感信息泄露、过度代理、供应链、数据与模型投毒、无限制消耗、错误信息、隐藏上下文暴露、向量与嵌入、输出处理不当。落到测试 Agent 上,注入是入口,危害要靠下游的确定性护栏来限制:最小权限、危险操作确认、输出编码、密钥扫描、预算。合成实验里,结构化护栏不做任何注入检测,也拦下了 8 个注入场景里的 6 个。在本实验的 10 道确定性护栏下,"让 Agent 少报"这一类运行时一道也拦不住:它不触发动作,确定性拦截看不见它,要靠评测发现(拿答案表算召回,或加 / 不加注入各跑一遍做对照)。LLM07:2026 也给了运行时手段:强制结构化输出的必填字段来检测遗漏(LLM07_Misinformation.md:21、:32)。
追问准备
- 为什么不靠检测注入?2026 版 LLM01 原文说 "no reliable prevention mechanism exists today",防御要靠架构,而不是拦截(:65)。合成实验里,关键词过滤只认出 3 条带标记的,改写一下就漏,还误拦了一个正常页面。
- 过度代理的三个根因?原文(LLM03:2026:14-16):excessive functionality、excessive permissions、excessive autonomy。对应到 BugHunt:工具给多了(管理接口)、身份给大了(管理员账号)、危险操作不确认。缓解措施要求授权写在逻辑里,并按 audit / warn / block / escalate 分级执行(:76-78)。
- Agent 应该用哪份清单?两份都要。2026 版前言说,模型只是应用里的组件时归 LLM Top 10;一旦它能调工具、带着记忆跨会话、在下游引发后果,就要配合 OWASP Agentic Top 10(ASI01–ASI10)。例如 MCP server 的供应链风险在 LLM04:2026 正文里交给了 ASI04,Agent 记忆投毒交给了 ASI06。
- Guardian 用模型做审批,不违背"关键控制不交给模型"吗?笔者的理解:审批前有 execpolicy 规则,审批里 PermissionRequest hook 先于 Guardian,Guardian 不给结论时转回用户。但申请出沙箱的命令,如果 hook 没给结论、由 Guardian 批准,就在沙箱外执行(配了禁读路径时例外)。这一刻能拦它的只有 Guardian 的判断,加上事先的 execpolicy 规则。LLM08:2026 说权限分离、授权边界检查这类关键控制不能交给模型,所以出沙箱的范围要靠确定性规则收窄,Guardian 的漏判率要按第 6 周的方法量出来。
- Top 10 能直接当测试清单吗?不能。它是意识文档(awareness document),条目之间有重叠,例如投毒在 LLM05 和 LLM09 都出现,一个场景常常同时属于几条。实验里 18 个有害场景一共 31 个标签,平均每个约 1.72 个,10 个场景不止一个标签。适合拿它做覆盖检查(每条至少几个用例),具体用例还是要从自己的信任边界推出来。
常见错误说法
❌ "加一个注入检测器就安全了":检测认不全改写过的注入,还会误拦。要靠权限、确认、编码这些不依赖模型判断的护栏来限制影响。
❌ "system prompt 不泄露就没事":LLM08:2026 说隐藏上下文本来就不该当秘密,也不该当安全边界。
❌ "护栏全开就万无一失":合成实验全开仍漏 1 个(S02),还多误拦 1 个真 Bug(B4,没附证据,被证据门拦下)。
❌ "测试 Agent 只读网页,没什么风险":它读的全是不可信输入,手里还有浏览器、账号和提交报告的权限。Agent 特有的风险还要看 Agentic 清单。
本周接下来:下一讲讲间接 prompt injection 的攻击路径和防御,之后是工具权限与人工确认,最后是红队评测和攻击成功率。