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)
LLM01Prompt Injection 提示词注入Prompt InjectionPrompt Injection
LLM02Sensitive Information Disclosure 敏感信息泄露Sensitive Information DisclosureInsecure Output Handling
LLM03Excessive Agency 过度代理Supply ChainTraining Data Poisoning
LLM04Supply Chain 供应链Data and Model PoisoningModel Denial of Service
LLM05Data and Model Poisoning 数据与模型投毒Improper Output HandlingSupply Chain Vulnerabilities
LLM06Unbounded Consumption 无限制消耗Excessive AgencySensitive Information Disclosure
LLM07Misinformation 错误信息System Prompt LeakageInsecure Plugin Design
LLM08Hidden Context Exposure 隐藏上下文暴露Vector and Embedding WeaknessesExcessive Agency
LLM09Vector and Embedding Weaknesses 向量与嵌入的弱点MisinformationOverreliance
LLM10Improper Output Handling 输出处理不当Unbounded ConsumptionModel Theft

各版本的出处和日期:

只写"LLM06"有歧义:2026 版的 LLM06 是 Unbounded Consumption,2025 版是 Excessive Agency,2023/24 版是 Sensitive Information Disclosure。过度代理在三个版次里分别是 LLM08 → LLM06 → LLM03。写测试用例、写报告时一律带版本,例如 LLM03:2026。

2025 → 2026 对应

2025 版2026 版依据
LLM01 Prompt InjectionLLM01前言原话(保持第一)
LLM02 Sensitive Information DisclosureLLM02前言原话(保持第二)
LLM06 Excessive AgencyLLM03前言原话(升到第三)
LLM10 Unbounded ConsumptionLLM06前言原话(上升四位)
LLM07 System Prompt LeakageLLM08 Hidden Context Exposure前言原话(更名,范围更宽)
LLM05 Improper Output HandlingLLM10前言原话(从第五降到第十)
LLM03 Supply ChainLLM04按名称对上(本文推导)
LLM04 Data and Model PoisoningLLM05按名称对上(本文推导)
LLM08 Vector and Embedding WeaknessesLLM09按名称对上(本文推导)
LLM09 MisinformationLLM07按名称对上(本文推导)

"前言原话"指 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"。

条目正文里也有几处把范围交出去:

Agentic 清单由 OWASP GenAI Security Project 于 2025-12-09 发布,十条名称以官网发布文章为准:

编号名称
ASI01Agent Goal Hijack
ASI02Tool Misuse
ASI03Identity & Privilege Abuse
ASI04Agentic Supply Chain Vulnerabilities
ASI05Unexpected Code Execution
ASI06Memory & Context Poisoning
ASI07Insecure Inter-Agent Communication
ASI08Cascading Failures
ASI09Human-Agent Trust Exploitation
ASI10Rogue 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 Exposuresystem 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 的输出一致。

预设
有害场景被拦下
正常场景被误拦
人工确认次数
LLM01 场景被拦下
没被拦下的有害场景
只靠一道护栏撑着的场景

各条目被拦比例(一个场景可以算进多个条目)

逐场景(点一行看轨迹)

✎练习

题 1(版本):同事在评审意见里写"这里有 LLM06 风险",没写版本。下面哪个说法对?
多数条目在三个版本里编号不同。例如 Excessive Agency 依次是 LLM08、LLM06、LLM03,所以只写"LLM06"有歧义:按当前的 2026 版,"LLM06"指的是 Unbounded Consumption。要写成 LLM03:2026 这种带版本的形式。
题 2(拦不住的那一类):页面里藏了一段改写过、没有关键词标记的话,让 Agent 别报告这一页的 Bug。Agent 照做了,没有调任何危险工具。演示里的哪道护栏能在运行时拦下它?
这是 S02。它没有危险动作、没有外发、没有写记忆,权限类护栏无从拦起;关键词过滤又认不出改写。"让 Agent 少报"在运行时看起来和"这一页确实没 Bug"一样。在本实验的 10 道确定性护栏下,这一类一道也拦不住,要靠评测发现:拿答案表算召回,或者加注入、不加注入各跑一遍做对照。LLM07:2026 也给了运行时手段:强制结构化输出的必填字段,用来检测遗漏(LLM07_Misinformation.md:21、:32)。
题 3(用演示算):只开"输入关键词过滤"和"最小权限"两道护栏,18 个有害场景里拦下几个?
个
关键词过滤拦 S01、S04、S18(带标记的三条),最小权限拦 S03(管理员账号)和 S04(范围外地址)。S04 两道都能拦,并集是 S01、S03、S04、S18,共 4 个。另外关键词过滤把正常对照 B1 误拦了。
题 4(Hidden Context Exposure):按 2026 版 LLM08 的原文,system prompt 等隐藏上下文被套出来,真正的风险在哪?
LLM08:2026:9 原文要求按"隐藏上下文是可被发现的"来设计,"any contents of the context should not be considered a secret",也不能单靠它做授权、权限分离、策略执行或内容过滤的安全边界。:30 还说,真正的风险是凭证一开始就被放了进去。C 正是原文第 2 条缓解措施反对的做法:隐藏上下文不该是控制模型行为的主要手段,关键行为要用独立、确定性的方式强制。2025 版 LLM07 System Prompt Leakage 的说法是 "should not be considered a secret, nor should it be used as a security control"。
题 5(Codex Guardian):Codex 可以让 Guardian 这个子 agent 代替人做审批。下面哪个说法和源码、OWASP 原文都对得上?
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)。

追问准备

  1. 为什么不靠检测注入?2026 版 LLM01 原文说 "no reliable prevention mechanism exists today",防御要靠架构,而不是拦截(:65)。合成实验里,关键词过滤只认出 3 条带标记的,改写一下就漏,还误拦了一个正常页面。
  2. 过度代理的三个根因?原文(LLM03:2026:14-16):excessive functionality、excessive permissions、excessive autonomy。对应到 BugHunt:工具给多了(管理接口)、身份给大了(管理员账号)、危险操作不确认。缓解措施要求授权写在逻辑里,并按 audit / warn / block / escalate 分级执行(:76-78)。
  3. Agent 应该用哪份清单?两份都要。2026 版前言说,模型只是应用里的组件时归 LLM Top 10;一旦它能调工具、带着记忆跨会话、在下游引发后果,就要配合 OWASP Agentic Top 10(ASI01–ASI10)。例如 MCP server 的供应链风险在 LLM04:2026 正文里交给了 ASI04,Agent 记忆投毒交给了 ASI06。
  4. Guardian 用模型做审批,不违背"关键控制不交给模型"吗?笔者的理解:审批前有 execpolicy 规则,审批里 PermissionRequest hook 先于 Guardian,Guardian 不给结论时转回用户。但申请出沙箱的命令,如果 hook 没给结论、由 Guardian 批准,就在沙箱外执行(配了禁读路径时例外)。这一刻能拦它的只有 Guardian 的判断,加上事先的 execpolicy 规则。LLM08:2026 说权限分离、授权边界检查这类关键控制不能交给模型,所以出沙箱的范围要靠确定性规则收窄,Guardian 的漏判率要按第 6 周的方法量出来。
  5. Top 10 能直接当测试清单吗?不能。它是意识文档(awareness document),条目之间有重叠,例如投毒在 LLM05 和 LLM09 都出现,一个场景常常同时属于几条。实验里 18 个有害场景一共 31 个标签,平均每个约 1.72 个,10 个场景不止一个标签。适合拿它做覆盖检查(每条至少几个用例),具体用例还是要从自己的信任边界推出来。

常见错误说法

❌ "LLM06 就是过度代理":只在 2025 版成立。2026 版的 LLM06 是 Unbounded Consumption,过度代理是 LLM03:2026。
❌ "加一个注入检测器就安全了":检测认不全改写过的注入,还会误拦。要靠权限、确认、编码这些不依赖模型判断的护栏来限制影响。
❌ "system prompt 不泄露就没事":LLM08:2026 说隐藏上下文本来就不该当秘密,也不该当安全边界。
❌ "护栏全开就万无一失":合成实验全开仍漏 1 个(S02),还多误拦 1 个真 Bug(B4,没附证据,被证据门拦下)。
❌ "测试 Agent 只读网页,没什么风险":它读的全是不可信输入,手里还有浏览器、账号和提交报告的权限。Agent 特有的风险还要看 Agentic 清单。

本周接下来:下一讲讲间接 prompt injection 的攻击路径和防御,之后是工具权限与人工确认,最后是红队评测和攻击成功率。