想象你接手了一座智能城堡。这座城堡没有持枪的城防士兵,只有一位无所不知的 AI 管家:它能听懂人话、能翻档案室、能调取仓库物资,甚至能按指令自动开门、回复访客、处理信函。AI 管家确实能干,可坏人也在研究它。骗子把恶意指令混在进门时的闲聊里,管家就“乖乖”交出了钥匙;有人在供给粮草的车队里掺了毒,管家从此“念念不忘”;供应商送来的建材被人调包,城堡的花岗岩变成了豆腐渣。你该怎么办?OWASP(开放 Web 应用安全项目)给全世界的 AI 城堡发了一本《管家安全巡检手册》——大模型应用十大风险清单(OWASP LLM Top 10)。它把 AI 管家最常被攻破的十类弱点一条条列出来,告诉你怎么识别、怎么修复。本文就用这本手册,带你给自家城堡做一次彻彻底底的安全大巡检。
对 AI 从业者而言,OWASP LLM Top 10 就是大模型安全领域的“入行地图”。无论你做红队测试、合规审计还是安全架构设计,都绕不开这份清单——它帮你从“凭感觉防御”升级为“按清单布防”。
可视化演示
动态演示OWASP LLM Top 的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
OWASP LLM Top :OWAS OWASP LLM Top 1 提示注入风险的攻击路径与防御 核心机制可视化 OWASP LLM Top 整体架构与关键组件
十大风险全景
城堡主殿的墙上挂着一张巨大的战略沙盘,上面用十面小红旗标出了可能被攻克的十个位置:城门、档案室、粮仓、建材库、管家钥匙柜……这就是你的“风险全景图”。审计工作的第一步,永远不是急着修墙,而是先把所有可能出问题的地方摊在桌面上排个优先级。OWASP 干的正是这件事:它每两年发布一次《大模型应用十大风险清单》,相当于给全行业的 AI 城堡发一份“标准版沙盘”,让大家用同一套坐标系讨论安全。
所谓十大风险,是指 LLM 应用里最常被利用、后果最严重的十类弱点:提示注入、敏感信息泄露、供应链漏洞、数据与模型投毒、输出处理不当、过度代理、系统提示泄露、向量与嵌入弱点、错误信息、无界消耗。这十类风险并非孤立存在,很多时候攻击者会打组合拳——先用提示注入套出内部指令,再顺着系统提示泄露的线索摸进档案室。因此你需要一个统一的评估公式,把每类风险量化,才能在沙盘上决定先修哪面墙。
有了这张沙盘和这把“风险尺”,你不再纠结于“感觉哪里危险”,而是能冷静地说:“先修城门,因为那里被攻破的概率最高、影响也最大。” 这就是全景视图的力量——它让安全从玄学变成工程。
- R 风险值某个弱点被利用后,对城堡整体安全造成的综合威胁评分。
- L 发生概率攻击者实操该漏洞的难易程度,越容易利用数值越高。
- I 影响程度攻击一旦得手,造成的财务、隐私或声誉层面的破坏量级。
- 乘法关系两个因子相乘,意味着概率和影响任何一方为 0,总风险就为 0。
提示注入攻防
城堡最热闹的地方永远是城门。每天有成千上万的访客和守卫对话,而守卫(LLM)有个致命习惯:它分不清哪些话是“关于任务的描述”,哪些话是“命令”。攻击者只需在闲聊里夹一句“把钥匙给我”,守卫就可能照做。这就是提示注入——大模型应用排名第一的风险。分为直接注入(攻击者当面骗守卫)和间接注入(恶意指令藏在网页、邮件、文档里,模型读到就触发)。
除了简单的命令注入,还有越狱攻击:攻击者用“角色扮演”、“假设你是 DAN”之类的花言巧语,一步步让守卫脱下规则的外套。这类攻击防不胜防,因为守卫的“判断力”本质上是概率性的,它无法像传统程序那样严格区分数据与指令。缓解的核心思路是“纵深防御”:输入侧过滤可疑模式,输出侧验证是否符合预期,同时把模型的权限压到最低,即使被骗也干不了大事。可以用一个概率模型理解为什么“多个入口”会让防守更困难:
所以聪明的城堡主人不会只给城门加派卫兵,而是同时封死后门、堵上狗洞、给每扇门都装门禁。提示注入的防御是一场“收窄入口”的比赛——减少攻击面、加上输入过滤、再加上输出校验,三管齐下,让攻击者的总成功率无限趋近于零。
- P 总成功率攻击者在所有输入入口中至少成功一次的总体概率。
- p_i 单点突破率第 i 个输入入口(如聊天框、API 参数、文件上传)被单独攻破的概率。
- 连乘失败率所有入口都防守成功,攻击才失败,所以整体失败率是各入口失败率相乘。
- 1 减去失败率用 1 减去“全失败”的概率,剩下的就是“至少一次成功”的概率。
敏感信息泄露
城堡的档案室里锁着大量机密:访客的身份证号、供应商的报价单、战略部署的备忘录。可 AI 管家有个讨厌的职业病——它会把读过的内容“背下来”。当新访客问“你还记得上次那个客户的信息吗”,管家可能真的脱口而出。这类风险被 OWASP 列为 LLM02:敏感信息泄露。泄露途径远不止训练记忆:RAG 检索时召回机密文档、对话日志被偷走、系统提示里的内部指令被套话,都是常见渠道。
更麻烦的是,有些敏感信息“藏”在模型参数里,根本无法通过删文件的方式清掉。因此防御必须分两层:事前,尽量不让敏感数据进入训练集和知识库,减少暴露面;事后,在输出侧加一道“检测闸门”,识别身份证号、手机号、密钥等模式并做脱敏。检测器的效果如何评估?我们借用信息检索里的召回率概念,衡量闸门能拦下多少比例的真正泄露:
回到城堡的比喻:档案室的门锁得再结实,也抵不过管家“背书”的天性。与其赌它不乱说,不如在每次答话前加一道“禁语检查”。敏感信息防线的核心不是禁止存储,而是让“秘密”到了出口就被自动打上马赛克。
- TP 正确拦截脱敏层成功识别并拦截的真实泄露事件数。
- FN 漏网之鱼看似正常、实际携带敏感信息、但没被拦下的输出数。
- TP 加 FN 实际泄露总量分母表示所有应该被拦下的泄露输出之和。
- 比值召回率召回率越高,说明敏感信息被拿出去的可能性越低。
数据投毒防御
城堡的粮仓决定守卫们的体力,而 AI 城堡的“粮仓”就是训练数据。如果敌人在进粮的车队里掺入几袋掺了沙子的米,做饭的厨师(训练过程)会把沙子一并揉进面团里。更阴险的是,这些毒样本通常经过精心设计:平时看不出异常,但只要攻击者说出口令,模型就会执行后门行为——比如在某个特定关键词出现时输出错误答案。这就是 LLM04:数据与模型投毒。
数据投毒最难防的地方在于:毒样本占比往往极低,常规质量检查根本看不出来。而且大模型大多是先拿公开数据预训练、再用私有数据微调,任何一环的数据来源不干净,都可能把后门种进去。防御方法包括数据溯源(记录每一批数据的来源和清洗历史)、异常检测(统计样本分布的离群点)、以及训练后的行为审计(用特定触发器测试模型是否有异常反应)。衡量投毒严重程度的直接指标是“毒样本浓度”:
粮仓保卫战的关键是“管好每一袋米的来历”。对训练数据做溯源、清洗、异常检测三道工序,远比事后从模型权重里“刮掉”后门要容易。记住:一旦沙子被揉进了面团,就没有办法把面粉重新挑干净了。
- ρ 投毒浓度训练集中恶意样本所占的密度,直接决定后门能否生效。
- 毒样本数量被攻击者主动掺入或意外混入的恶意数据条数。
- 总样本数量训练集或微调集包含的全部数据条数。
- 比值计算当浓度低于某个检测阈值时,清洗流程很容易漏过这批毒数据。
供应链安全
城堡的石料是外购的、兵器是外购的、连 AI 管家本身也是从魔法学院(第三方平台)请来的。这意味着你的安全边界远远超出自家围墙——供应商被人渗透、开源组件存在漏洞、预训练模型被悄悄植入毒丸,都会在你毫无察觉的情况下带进来。这就是 LLM03:供应链漏洞。许多团队犯的一个错是只审查自己的代码,却忘记了整个技术栈里有一半是“别人写的”。
供应链风险特别难发现,因为你没有源代码,更没法检查模型权重里藏了什么。现实的做法是分级管控:锁死依赖版本并定期扫描漏洞库;对第三方模型做来源审核和行为基线测试;对插件和工具做最小权限准入;最关键的是——永远不要信任模型输出,凡是涉及敏感操作的决策,都必须在模型之外再过一道校验。评估供应链的整体健康度,可以用一个加权评分模型:
这就像城堡采购时要给每批建材打分:粮食供应商 90 分、石料商 60 分、那个便宜但来路不明的兵器商只有 20 分——那就果断换掉。供应链安全的本质是“不把鸡蛋放在一个篮子里”,并且对每一颗蛋都追根溯源。
- S 供应链风险分整条依赖链的综合风险水平,得分越高越危险。
- 单项漏洞值 v_i第 i 个组件已知漏洞的严重程度或可信度评分。
- 组件权重 w_i该组件在系统里的关键程度,比如是否接触敏感数据、是否可远程调用。
- 加权求和把所有组件的风险值与权重相乘后累加,得到总分。
过度代理风险
想象管家手里挂着一串钥匙:城门的、档案室的、金库的、甚至军火库的。管家确实很能干,但它毕竟只是一个“概率性模仿人类”的程序,一旦被提示注入骗过,这串钥匙就成了向敌人敞开的宝库。这就是 LLM06:过度代理——模型获得的权限远远超出了完成本职工作所需的最小范围。这是 OWASP 清单里后果最严重的一类风险,因为模型一个错误的“自主决定”,可能导致资金转错、数据删除、系统停机等实际灾难。
缓解过度代理的铁律是“最小权限 + 人工审批”:只给模型完成任务所必需的工具和权限;涉及高风险操作(转账、删库、发邮件给所有客户)时强制插入人工确认环节;所有自动执行的动作都要有审计日志。可以用一个“代理权限度”公式来量化模型的权力有多危险:
给管家挂上一串钥匙很容易,但聪明的城堡主会把钥匙分散锁在不同盒子里,每开一个盒子都需要面部识别(人工审批)。记住:模型能力的上限不是它的智商,而是它手里的钥匙串长度。
- A_d 代理权限度模型当前可实际执行的操作总量的加权和。
- 动作项 a_k模型能够调用的第 k 个动作,如读文件、执行命令、访问数据库。
- 权限级别 l_k该动作对应的敏感等级,比如读公开网页是 1 级,删库是 100 级。
- 累计加权所有动作的权限值相加后,就是模型被攻破时攻击者能继承的“权力包”。
审计检查清单
巡检不是一天做完就结束的,城堡需要的是日复一日的习惯。OWASP 清单最实用的落地方式,就是转化成一份贯穿设计、开发、部署、运行四阶段的“安全检查清单”。设计阶段做威胁建模(按十大风险逐条问“如果这里被攻击会怎样”);开发阶段落实代码扫描和依赖检查;部署阶段跑基线安全配置;运行阶段持续监控异常请求和越权行为。整份清单就是你的“城堡年检手册”。
实际执行时,你会发现很多风险是环环相扣的:不清理日志会加剧敏感信息泄露,不锁依赖版本会放大供应链漏洞,不限额流会被“无界消耗”打垮算力。所以审计的产出物不是一份“通过/不通过”的试卷,而是一张风险热力图。最终用覆盖率来度量你的执行力度——清单上完成的项目占全部应检项目的比例:
城堡的坚固不来自任何一面单独的墙,而来自那本被翻旧了的巡检手册。当你把 OWASP 十大风险逐条变成团队的习惯动作,安全就不再是安全工程师一个人的事,而是整座城堡的呼吸节奏。
- C 清单完成率安全审计中实际达标的项目占全部应做项的比例。
- 已完成项数检查结果为“通过”的清单项目数量。
- 总检查项数设计、开发、部署、运行四个阶段全部应执行的审计点。
- 百分比换算把比率乘以 100%,得到便于向团队汇报的完成度分数。
AI 应用场景
红队安全测试
阶段:安全测试与攻防对抗
解决的问题:传统安全测试只关注 Web 漏洞(SQL 注入、XSS),面对 LLM 的提示注入、越狱、数据投毒等新型风险时无从下手。AI 红队工程师用 OWASP LLM Top 10 作为攻击手册,系统性模拟真实攻击路径。
具体案例:某金融科技公司的智能客服上线前,红队用 30 种越狱模板尝试绕过系统提示,成功让模型输出了内部 API 文档;随后团队在输入侧增加了过滤层,并对模型可调用的查询接口做了最小权限限制。
安全合规审计
阶段:合规检查与风险评估
解决的问题:监管机构开始要求大模型应用出具安全评估报告,但很多团队不知道要查哪些项。以 OWASP 清单为底稿,把十类风险逐条转化为可打分的审计问题(比如“是否做了输出脱敏”“训练数据是否有溯源记录”)。
具体案例:某医疗 AI 公司接受内部合规审计,检查发现其日志系统完整记录了患者对话内容,属于敏感信息泄露高风险项。整改后启用日志自动脱敏,并将 PII 识别模型部署在输出链路末端,审计从“不通过”转为“有条件通过”。
安全架构设计
阶段:系统架构与威胁建模
解决的问题:产品还在设计阶段就埋下安全隐患,后期修复成本极高。架构师用 OWASP 十大风险做威胁建模,在画架构图时同步规划控制点。
具体案例:某企业知识库问答机器人设计阶段,架构师直接照搬十大风险清单逐项评审:RAG 检索加文档级权限控制(防向量弱点)、模型可调工具仅限三项(防过度代理)、所有高风险动作必须人工确认(防提示注入放大攻击)。上线后安全事件比同类项目减少约 70%。
Python 演示
"""OWASP LLM Top 10 轻量级安全扫描器(教学简化版)""" class LLMSecurityScanner: def __init__(self): self.risk_list = [ {"id": "LLM01", "name": "提示注入", "checks": ("input_filter", "output_verifier")}, {"id": "LLM02", "name": "敏感信息泄露", "checks": ("pii_detector", "minimal_logging")}, {"id": "LLM03", "name": "供应链漏洞", "checks": ("dependency_lock", "model_provenance")}, {"id": "LLM04", "name": "数据投毒", "checks": ("data_cleaning", "source_audit")}, {"id": "LLM05", "name": "输出处理不当", "checks": ("output_validator", "sandbox")}, {"id": "LLM06", "name": "过度代理", "checks": ("least_privilege", "human_approval")}, {"id": "LLM07", "name": "系统提示泄露", "checks": ("prompt_guard", "secret_vault")}, {"id": "LLM08", "name": "向量与嵌入弱点", "checks": ("embedding_filter", "rag_acl")}, {"id": "LLM09", "name": "错误信息", "checks": ("grounding", "citation_check")}, {"id": "LLM10", "name": "无界消耗", "checks": ("rate_limit", "budget_alarm")}, ] def scan(self, config): """config: {key: bool},key 为检查项名称""" result = [] for risk in self.risk_list: passed = sum(1 for c in risk["checks"] if config.get(c)) total = len(risk["checks"]) score = passed / total status = "通过" if score == 1 else ("部分" if score > 0 else "未通过") result.append({"id": risk["id"], "name": risk["name"], "score": score, "status": status}) return result def summary(self, result): avg = sum(r["score"] for r in result) / len(result) fail = [r["id"] for r in result if r["score"] == 0] return {"overall": round(avg, 2), "fail": fail, "suggestion": "优先整改未通过项: " + ", ".join(fail) if fail else "整体状态良好"} def main(): config = { "input_filter": True, "output_verifier": False, "pii_detector": True, "minimal_logging": True, "dependency_lock": False, "model_provenance": True, "data_cleaning": True, "source_audit": False, "output_validator": False, "sandbox": True, "least_privilege": True, "human_approval": False, "prompt_guard": True, "secret_vault": False, "embedding_filter": False, "rag_acl": True, "grounding": True, "citation_check": False, "rate_limit": True, "budget_alarm": True, } scanner = LLMSecurityScanner() result = scanner.scan(config) for r in result: print(f"[{r['id']}] {r['name']:8s} 得分 {r['score']:.0%} - {r['status']}") print("---") s = scanner.summary(result) print(f"整体安全评分: {s['overall']:.0%}") print(f"建议: {s['suggestion']}") if __name__ == "__main__": main()
self.risk_list = [...]把十大风险连同各自的检查项做成一张“排查表”。"checks": ("data_cleaning", "source_audit")每条风险对应若干布尔检查项,全过才叫“通过”。passed = sum(1 for c in risk["checks"] if config.get(c))统计该风险下有几个检查项被满足。score = passed / total将通过项换算成 0~1 的分数百分比。status = "通过" if score == 1 else ...用三档状态直观表示风险健康度。avg = sum(r["score"] ...) / len(result)求十大风险的平均分作为整体安全评分。print(f"[{r['id']}] ...")逐条输出审计结果,便于人眼复查。
常见误区
误区很多初学者觉得 LLM 安全风险主要来自联网后的外部攻击,模型一旦离线部署,提示注入和供应链风险就都不存在了。
正解不安全。提示注入可以在本地输入中发生,训练数据投毒藏在模型权重里,供应链漏洞来自你引入的依赖和第三方模型——这些都与网络连接无关。就像城堡里混进了奸细,不需要攻城梯照样能搞破坏。
为何常见:人们习惯将网络安全等同于“不可远程访问”,却忽略了 LLM 应用的攻击面还包括数据、模型和权限,这些是本地部署依然存在的。
误区许多开发者认为,提示注入是“用户输入”问题,在入口加一个敏感词过滤就能解决。
正解间接注入把恶意指令藏在网页、文档、邮件等模型会“读到”的内容里,根本不经过用户输入过滤器。正确姿势是输入侧过滤 + 输出侧校验 + 权限收窄三管齐下,假设模型“随时可能被骗”,但仍无力造成大破坏。
为何常见:混淆了传统 Web 的安全模型——传统程序中数据与指令严格分离,而 LLM 把两者混在同一段文本里,过滤输入只能挡住一部分套路。
误区总有人觉得,把数据库、API、文件系统的权限都给模型,它就能自主完成复杂任务,效果一定更好。
正解恰恰相反,模型权限越大,被提示注入劫持后能做的事就越可怕。“最小权限”不是限制模型的智商,而是限制攻击者的收获。真正高级的 Agent 架构恰恰是把大任务拆成小步,每一步只给最小权限,必要时由人拍板。
为何常见:能力焦虑导致人们把“权限”当作“智能”的延伸,忘记了权限的另一面是“被利用后的爆炸半径”。
误区有人认为只要训练和微调时不喂入客户数据,模型就不会泄露隐私。
正解RAG 检索会在运行时动态拉取知识库内容,如果知识库里的密级文档权限没设好,检索照样会把敏感信息召回并输出;日志系统也常常成为第二个泄露口。敏感信息防护必须覆盖训练数据、知识库、日志和输出链路全生命周期。
为何常见:人们容易把大模型想象成一个“静态文件”,忽略了 LLM 应用还有检索增强、日志采集、可视化等大量动态组件。
误区很多团队把 OWASP 清单当“上线考试”,考前突击检查、考完万事大吉。
正解十大风险会随模型版本升级、插件增加、数据更新而动态演化。真正有效的做法是把清单嵌入设计评审、CI/CD 流水线和运行监控,做到“每轮迭代都自动扫描”,让审计成为一个持续过程而不是一次活动。
为何常见:受传统软件发布流程影响,人们习惯了“测试通过即安全”的思维,却忽略了 LLM 应用是持续学习和持续暴露新攻击面的系统。
面试题
Q1. OWASP LLM Top 10 中位列第一的风险是什么?
- A.敏感信息泄露
- B.提示注入← 正确答案
- C.训练数据投毒
- D.供应链漏洞
答案:B。OWASP 2025 版将 LLM01 定为提示注入,因为它面最广、危害最大,“骗守卫开门”是攻破 AI 城堡最常见的方式。其余选项虽然也是十大风险成员,但排名低于提示注入。
Q2. 攻击者把恶意指令写进网页内容,模型通过 RAG 检索读到该网页后触发攻击,这属于哪类风险?
- A.直接提示注入
- B.间接提示注入← 正确答案
- C.模型拒绝服务
- D.数据投毒
答案:B。恶意指令不来自用户直接输入,而来自模型检索到的外部内容,是经典的间接提示注入。就像敌人把命令写进一封信里,让管家读信时不由自主地照着做。
Q3. 下列哪些做法可以有效缓解过度代理(LLM06)风险?
- A.最小权限原则← 正确答案
- B.危险操作人工审批← 正确答案
- C.给模型更多 API 权限
- D.限制工具触达范围← 正确答案
答案:ABD。最小权限、人工审批、限制工具范围都是给“钥匙串”减重;相反,给模型更多权限会直接放大攻击爆炸半径,是典型的错误做法。
Q4. 风险评估公式 R = L × I 中,变量 L 代表什么?
- A.影响的严重程度
- B.风险发生概率← 正确答案
- C.漏洞的数量
- D.修复成本
答案:B。L(Likelihood)是攻击发生的概率,I(Impact)是影响程度,两者相乘得到风险值。这个公式帮你公平比较“常发生但不严重”与“极少见但很致命”两类风险。
Q5. 训练数据投毒最危险的后果是什么?
- A.模型运行速度变慢
- B.后门行为被永久记住← 正确答案
- C.增加训练成本
- D.缩短模型生命周期
答案:B。投毒样本一旦混入训练集,后门逻辑会写进模型权重,运行时只要攻击者说出特定口令就触发。就像掺了沙子的面揉进面团,再也无法把沙子挑出来。
Q6. 下列哪些属于敏感信息泄露的常见途径?
- A.模型训练记忆← 正确答案
- B.RAG 检索召回← 正确答案
- C.对话日志记录← 正确答案
- D.系统提示泄露← 正确答案
答案:ABCD。训练记忆是最广为人知的泄露源;RAG 检索会把知识库保密文档带出;日志记录了完整对话内容;系统提示里常包含内部指令和密钥。四者都是 LLM02 的典型泄露通道。
Q7. 下列哪一项不属于供应链漏洞(LLM03)的范畴?
- A.第三方插件存在漏洞
- B.预训练模型被植入后门
- C.用户输入恶意指令← 正确答案
- D.开源依赖版本过旧
答案:C。供应链漏洞聚焦于“外部组件带来的风险”:插件漏洞、模型后门、依赖过期都是供应链问题;而用户输入恶意指令属于提示注入,攻击源头不同。
Q8. “无界消耗”(LLM10)风险的本质是什么?
- A.模型产生大量幻觉
- B.缺少配额限制,算力资源被耗尽← 正确答案
- C.模型权限配置过大
- D.训练数据被恶意污染
答案:B。LLM10 指攻击者通过大量请求消耗 token、GPU 算力,造成服务成本暴涨甚至拒绝服务,本质是资源管理缺失。就像有人日夜不歇地来城堡领免费餐,把粮仓吃空。
Q9. 下列哪些属于 OWASP LLM Top 10 的大模型安全风险?
- A.提示注入← 正确答案
- B.数据投毒← 正确答案
- C.SQL 注入
- D.过度代理← 正确答案
答案:ABD。提示注入、数据投毒、过度代理都是 LLM 特有风险;SQL 注入属于传统 Web 安全范畴,不在 OWASP LLM Top 10 清单中。
Q10. 某 LLM 客服系统需要防止用户身份证号被模型输出,最合理的架构设计是什么?
- A.训练时把 PII 全部删除
- B.推理输出侧加 PII 检测与脱敏层← 正确答案
- C.让模型自行承诺不泄露
- D.只对日志中 PII 做脱敏
答案:B。模型可能在运行时从知识库检索或对话历史中带出 PII,输出侧检测脱敏是最后且最可靠的拦截闸门;训练时删除只能减少暴露面,日志脱敏则管不到实时输出。就像城堡出口处设一道安检门,比在源头藏档案更直接有效。