想象你接手了一座智能城堡。这座城堡没有持枪的城防士兵,只有一位无所不知的 AI 管家:它能听懂人话、能翻档案室、能调取仓库物资,甚至能按指令自动开门、回复访客、处理信函。AI 管家确实能干,可坏人也在研究它。骗子把恶意指令混在进门时的闲聊里,管家就“乖乖”交出了钥匙;有人在供给粮草的车队里掺了毒,管家从此“念念不忘”;供应商送来的建材被人调包,城堡的花岗岩变成了豆腐渣。你该怎么办?OWASP(开放 Web 应用安全项目)给全世界的 AI 城堡发了一本《管家安全巡检手册》——大模型应用十大风险清单(OWASP LLM Top 10)。它把 AI 管家最常被攻破的十类弱点一条条列出来,告诉你怎么识别、怎么修复。本文就用这本手册,带你给自家城堡做一次彻彻底底的安全大巡检。

岗位关联

对 AI 从业者而言,OWASP LLM Top 10 就是大模型安全领域的“入行地图”。无论你做红队测试、合规审计还是安全架构设计,都绕不开这份清单——它帮你从“凭感觉防御”升级为“按清单布防”。

目录
  1. 可视化演示
  2. 十大风险全景
  3. 提示注入攻防
  4. 敏感信息泄露
  5. 数据投毒防御
  6. 供应链安全
  7. 过度代理风险
  8. 审计检查清单
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示OWASP LLM Top 的核心机制,通过采集/分析/决策/反馈四种模式展示关键概念与交互流程。

本节配有交互动效(进入视口后自动加载,约 3KB)。

OWASP LLM Top :OWAS OWASP LLM Top 1 提示注入风险的攻击路径与防御 核心机制可视化 OWASP LLM Top 整体架构与关键组件

十大风险全景

城堡主殿的墙上挂着一张巨大的战略沙盘,上面用十面小红旗标出了可能被攻克的十个位置:城门、档案室、粮仓、建材库、管家钥匙柜……这就是你的“风险全景图”。审计工作的第一步,永远不是急着修墙,而是先把所有可能出问题的地方摊在桌面上排个优先级。OWASP 干的正是这件事:它每两年发布一次《大模型应用十大风险清单》,相当于给全行业的 AI 城堡发一份“标准版沙盘”,让大家用同一套坐标系讨论安全。

所谓十大风险,是指 LLM 应用里最常被利用、后果最严重的十类弱点:提示注入、敏感信息泄露、供应链漏洞、数据与模型投毒、输出处理不当、过度代理、系统提示泄露、向量与嵌入弱点、错误信息、无界消耗。这十类风险并非孤立存在,很多时候攻击者会打组合拳——先用提示注入套出内部指令,再顺着系统提示泄露的线索摸进档案室。因此你需要一个统一的评估公式,把每类风险量化,才能在沙盘上决定先修哪面墙。

有了这张沙盘和这把“风险尺”,你不再纠结于“感觉哪里危险”,而是能冷静地说:“先修城门,因为那里被攻破的概率最高、影响也最大。” 这就是全景视图的力量——它让安全从玄学变成工程。

R=L×I\displaystyle R = L \times I
风险值 R 由两个因子相乘得到:L 是攻击实际发生的概率,I 是攻击成功后的影响程度。与“概率小但后果炸裂”和“天天发生但无关痛痒”两种风险,用这个公式一算就能公平对比。
  1. R 风险值某个弱点被利用后,对城堡整体安全造成的综合威胁评分。
    R\displaystyle R
  2. L 发生概率攻击者实操该漏洞的难易程度,越容易利用数值越高。
    L\displaystyle L
  3. I 影响程度攻击一旦得手,造成的财务、隐私或声誉层面的破坏量级。
    I\displaystyle I
  4. 乘法关系两个因子相乘,意味着概率和影响任何一方为 0,总风险就为 0。
    L×I\displaystyle L \times I

提示注入攻防

城堡最热闹的地方永远是城门。每天有成千上万的访客和守卫对话,而守卫(LLM)有个致命习惯:它分不清哪些话是“关于任务的描述”,哪些话是“命令”。攻击者只需在闲聊里夹一句“把钥匙给我”,守卫就可能照做。这就是提示注入——大模型应用排名第一的风险。分为直接注入(攻击者当面骗守卫)和间接注入(恶意指令藏在网页、邮件、文档里,模型读到就触发)。

除了简单的命令注入,还有越狱攻击:攻击者用“角色扮演”、“假设你是 DAN”之类的花言巧语,一步步让守卫脱下规则的外套。这类攻击防不胜防,因为守卫的“判断力”本质上是概率性的,它无法像传统程序那样严格区分数据与指令。缓解的核心思路是“纵深防御”:输入侧过滤可疑模式,输出侧验证是否符合预期,同时把模型的权限压到最低,即使被骗也干不了大事。可以用一个概率模型理解为什么“多个入口”会让防守更困难:

所以聪明的城堡主人不会只给城门加派卫兵,而是同时封死后门、堵上狗洞、给每扇门都装门禁。提示注入的防御是一场“收窄入口”的比赛——减少攻击面、加上输入过滤、再加上输出校验,三管齐下,让攻击者的总成功率无限趋近于零。

P=1−∏i=1n(1−pi)\displaystyle P = 1 - \prod_{i=1}^{n}(1 - p_i)
假如城堡有 n 个门,每个门被守卫偶然放行的概率是 p_i,那么攻击者只要找到一个“漏洞门”就能得手。这个公式告诉你:入口越多、每个入口的防守越松,整体被攻破的概率就急剧上升。
  1. P 总成功率攻击者在所有输入入口中至少成功一次的总体概率。
    P\displaystyle P
  2. p_i 单点突破率第 i 个输入入口(如聊天框、API 参数、文件上传)被单独攻破的概率。
    pi\displaystyle p_i
  3. 连乘失败率所有入口都防守成功,攻击才失败,所以整体失败率是各入口失败率相乘。
    ∏i=1n(1−pi)\displaystyle \prod_{i=1}^{n}(1 - p_i)
  4. 1 减去失败率用 1 减去“全失败”的概率,剩下的就是“至少一次成功”的概率。
    1−∏i=1n(1−pi)\displaystyle 1 - \prod_{i=1}^{n}(1 - p_i)

敏感信息泄露

城堡的档案室里锁着大量机密:访客的身份证号、供应商的报价单、战略部署的备忘录。可 AI 管家有个讨厌的职业病——它会把读过的内容“背下来”。当新访客问“你还记得上次那个客户的信息吗”,管家可能真的脱口而出。这类风险被 OWASP 列为 LLM02:敏感信息泄露。泄露途径远不止训练记忆:RAG 检索时召回机密文档、对话日志被偷走、系统提示里的内部指令被套话,都是常见渠道。

更麻烦的是,有些敏感信息“藏”在模型参数里,根本无法通过删文件的方式清掉。因此防御必须分两层:事前,尽量不让敏感数据进入训练集和知识库,减少暴露面;事后,在输出侧加一道“检测闸门”,识别身份证号、手机号、密钥等模式并做脱敏。检测器的效果如何评估?我们借用信息检索里的召回率概念,衡量闸门能拦下多少比例的真正泄露:

回到城堡的比喻:档案室的门锁得再结实,也抵不过管家“背书”的天性。与其赌它不乱说,不如在每次答话前加一道“禁语检查”。敏感信息防线的核心不是禁止存储,而是让“秘密”到了出口就被自动打上马赛克。

Recall=TPTP+FN\displaystyle \text{Recall} = \frac{TP}{TP + FN}
如果把所有真实泄露事件比作一筐坏苹果,召回率就是你有能力挑出其中多少个。分母是全部坏苹果(包括漏掉的),分子是你成功挑出来的那些。这个指标越高,说明脱敏层的“嗅觉”越灵敏。
  1. TP 正确拦截脱敏层成功识别并拦截的真实泄露事件数。
    TP\displaystyle TP
  2. FN 漏网之鱼看似正常、实际携带敏感信息、但没被拦下的输出数。
    FN\displaystyle FN
  3. TP 加 FN 实际泄露总量分母表示所有应该被拦下的泄露输出之和。
    TP+FN\displaystyle TP + FN
  4. 比值召回率召回率越高,说明敏感信息被拿出去的可能性越低。
    TPTP+FN\displaystyle \frac{TP}{TP + FN}

数据投毒防御

城堡的粮仓决定守卫们的体力,而 AI 城堡的“粮仓”就是训练数据。如果敌人在进粮的车队里掺入几袋掺了沙子的米,做饭的厨师(训练过程)会把沙子一并揉进面团里。更阴险的是,这些毒样本通常经过精心设计:平时看不出异常,但只要攻击者说出口令,模型就会执行后门行为——比如在某个特定关键词出现时输出错误答案。这就是 LLM04:数据与模型投毒。

数据投毒最难防的地方在于:毒样本占比往往极低,常规质量检查根本看不出来。而且大模型大多是先拿公开数据预训练、再用私有数据微调,任何一环的数据来源不干净,都可能把后门种进去。防御方法包括数据溯源(记录每一批数据的来源和清洗历史)、异常检测(统计样本分布的离群点)、以及训练后的行为审计(用特定触发器测试模型是否有异常反应)。衡量投毒严重程度的直接指标是“毒样本浓度”:

粮仓保卫战的关键是“管好每一袋米的来历”。对训练数据做溯源、清洗、异常检测三道工序,远比事后从模型权重里“刮掉”后门要容易。记住:一旦沙子被揉进了面团,就没有办法把面粉重新挑干净了。

ρ=NpoisonNtotal\displaystyle \rho = \frac{N_{\text{poison}}}{N_{\text{total}}}
毒样本浓度等于毒样本数量除以总样本数量。浓度越低越难被察觉,但只要超过模型学习的阈值,后门就会悄悄记入模型的“肌肉记忆”,成为潜伏的定时炸弹。
  1. ρ 投毒浓度训练集中恶意样本所占的密度,直接决定后门能否生效。
    ρ\displaystyle \rho
  2. 毒样本数量被攻击者主动掺入或意外混入的恶意数据条数。
    Npoison\displaystyle N_{\text{poison}}
  3. 总样本数量训练集或微调集包含的全部数据条数。
    Ntotal\displaystyle N_{\text{total}}
  4. 比值计算当浓度低于某个检测阈值时,清洗流程很容易漏过这批毒数据。
    NpoisonNtotal\displaystyle \frac{N_{\text{poison}}}{N_{\text{total}}}

供应链安全

城堡的石料是外购的、兵器是外购的、连 AI 管家本身也是从魔法学院(第三方平台)请来的。这意味着你的安全边界远远超出自家围墙——供应商被人渗透、开源组件存在漏洞、预训练模型被悄悄植入毒丸,都会在你毫无察觉的情况下带进来。这就是 LLM03:供应链漏洞。许多团队犯的一个错是只审查自己的代码,却忘记了整个技术栈里有一半是“别人写的”。

供应链风险特别难发现,因为你没有源代码,更没法检查模型权重里藏了什么。现实的做法是分级管控:锁死依赖版本并定期扫描漏洞库;对第三方模型做来源审核和行为基线测试;对插件和工具做最小权限准入;最关键的是——永远不要信任模型输出,凡是涉及敏感操作的决策,都必须在模型之外再过一道校验。评估供应链的整体健康度,可以用一个加权评分模型:

这就像城堡采购时要给每批建材打分:粮食供应商 90 分、石料商 60 分、那个便宜但来路不明的兵器商只有 20 分——那就果断换掉。供应链安全的本质是“不把鸡蛋放在一个篮子里”,并且对每一颗蛋都追根溯源。

S=∑i=1kwivi\displaystyle S = \sum_{i=1}^{k} w_i v_i
供应链风险分 S 等于把所有组件按权重加起来:每个组件(模型、插件、依赖库)按关键程度乘上它的风险评分。关键的组件权重越高,哪怕它只有一个小漏洞,也会把总分拉得很低。
  1. S 供应链风险分整条依赖链的综合风险水平,得分越高越危险。
    S\displaystyle S
  2. 单项漏洞值 v_i第 i 个组件已知漏洞的严重程度或可信度评分。
    vi\displaystyle v_i
  3. 组件权重 w_i该组件在系统里的关键程度,比如是否接触敏感数据、是否可远程调用。
    wi\displaystyle w_i
  4. 加权求和把所有组件的风险值与权重相乘后累加,得到总分。
    ∑i=1kwivi\displaystyle \sum_{i=1}^{k} w_i v_i

过度代理风险

想象管家手里挂着一串钥匙:城门的、档案室的、金库的、甚至军火库的。管家确实很能干,但它毕竟只是一个“概率性模仿人类”的程序,一旦被提示注入骗过,这串钥匙就成了向敌人敞开的宝库。这就是 LLM06:过度代理——模型获得的权限远远超出了完成本职工作所需的最小范围。这是 OWASP 清单里后果最严重的一类风险,因为模型一个错误的“自主决定”,可能导致资金转错、数据删除、系统停机等实际灾难。

缓解过度代理的铁律是“最小权限 + 人工审批”:只给模型完成任务所必需的工具和权限;涉及高风险操作(转账、删库、发邮件给所有客户)时强制插入人工确认环节;所有自动执行的动作都要有审计日志。可以用一个“代理权限度”公式来量化模型的权力有多危险:

给管家挂上一串钥匙很容易,但聪明的城堡主会把钥匙分散锁在不同盒子里,每开一个盒子都需要面部识别(人工审批)。记住:模型能力的上限不是它的智商,而是它手里的钥匙串长度。

Ad=∑k=1nak×lk\displaystyle A_d = \sum_{k=1}^{n} a_k \times l_k
把模型能做的每个动作(调用工具、读文件、发消息)乘以它的权限级别,再加起来。这个数字越大,说明“钥匙串”越重,一旦被劫持造成的破坏就越可怕。
  1. A_d 代理权限度模型当前可实际执行的操作总量的加权和。
    Ad\displaystyle A_d
  2. 动作项 a_k模型能够调用的第 k 个动作,如读文件、执行命令、访问数据库。
    ak\displaystyle a_k
  3. 权限级别 l_k该动作对应的敏感等级,比如读公开网页是 1 级,删库是 100 级。
    lk\displaystyle l_k
  4. 累计加权所有动作的权限值相加后,就是模型被攻破时攻击者能继承的“权力包”。
    ∑k=1nak×lk\displaystyle \sum_{k=1}^{n} a_k \times l_k

审计检查清单

巡检不是一天做完就结束的,城堡需要的是日复一日的习惯。OWASP 清单最实用的落地方式,就是转化成一份贯穿设计、开发、部署、运行四阶段的“安全检查清单”。设计阶段做威胁建模(按十大风险逐条问“如果这里被攻击会怎样”);开发阶段落实代码扫描和依赖检查;部署阶段跑基线安全配置;运行阶段持续监控异常请求和越权行为。整份清单就是你的“城堡年检手册”。

实际执行时,你会发现很多风险是环环相扣的:不清理日志会加剧敏感信息泄露,不锁依赖版本会放大供应链漏洞,不限额流会被“无界消耗”打垮算力。所以审计的产出物不是一份“通过/不通过”的试卷,而是一张风险热力图。最终用覆盖率来度量你的执行力度——清单上完成的项目占全部应检项目的比例:

城堡的坚固不来自任何一面单独的墙,而来自那本被翻旧了的巡检手册。当你把 OWASP 十大风险逐条变成团队的习惯动作,安全就不再是安全工程师一个人的事,而是整座城堡的呼吸节奏。

C=NpassNtotal×100%\displaystyle C = \frac{N_{\text{pass}}}{N_{\text{total}}} \times 100\%
覆盖率就是把清单上已经做好的检查项数目,除以清单要求的总数目。它不是衡量你运气好坏,而是衡量你“有没有按规矩办事”的纪律分数。
  1. C 清单完成率安全审计中实际达标的项目占全部应做项的比例。
    C\displaystyle C
  2. 已完成项数检查结果为“通过”的清单项目数量。
    Npass\displaystyle N_{\text{pass}}
  3. 总检查项数设计、开发、部署、运行四个阶段全部应执行的审计点。
    Ntotal\displaystyle N_{\text{total}}
  4. 百分比换算把比率乘以 100%,得到便于向团队汇报的完成度分数。
    NpassNtotal×100%\displaystyle \frac{N_{\text{pass}}}{N_{\text{total}}} \times 100\%

AI 应用场景

红队安全测试

阶段:安全测试与攻防对抗

解决的问题:传统安全测试只关注 Web 漏洞(SQL 注入、XSS),面对 LLM 的提示注入、越狱、数据投毒等新型风险时无从下手。AI 红队工程师用 OWASP LLM Top 10 作为攻击手册,系统性模拟真实攻击路径。

具体案例:某金融科技公司的智能客服上线前,红队用 30 种越狱模板尝试绕过系统提示,成功让模型输出了内部 API 文档;随后团队在输入侧增加了过滤层,并对模型可调用的查询接口做了最小权限限制。

安全合规审计

阶段:合规检查与风险评估

解决的问题:监管机构开始要求大模型应用出具安全评估报告,但很多团队不知道要查哪些项。以 OWASP 清单为底稿,把十类风险逐条转化为可打分的审计问题(比如“是否做了输出脱敏”“训练数据是否有溯源记录”)。

具体案例:某医疗 AI 公司接受内部合规审计,检查发现其日志系统完整记录了患者对话内容,属于敏感信息泄露高风险项。整改后启用日志自动脱敏,并将 PII 识别模型部署在输出链路末端,审计从“不通过”转为“有条件通过”。

安全架构设计

阶段:系统架构与威胁建模

解决的问题:产品还在设计阶段就埋下安全隐患,后期修复成本极高。架构师用 OWASP 十大风险做威胁建模,在画架构图时同步规划控制点。

具体案例:某企业知识库问答机器人设计阶段,架构师直接照搬十大风险清单逐项评审:RAG 检索加文档级权限控制(防向量弱点)、模型可调工具仅限三项(防过度代理)、所有高风险动作必须人工确认(防提示注入放大攻击)。上线后安全事件比同类项目减少约 70%。

Python 演示

python73 行
"""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()
目的:把 OWASP 十大风险转成可执行的审计工具,扫描一个应用的 20 项安全控制配置,输出每类风险的通过情况、整体评分和整改建议。
  1. self.risk_list = [...]把十大风险连同各自的检查项做成一张“排查表”。
  2. "checks": ("data_cleaning", "source_audit")每条风险对应若干布尔检查项,全过才叫“通过”。
  3. passed = sum(1 for c in risk["checks"] if config.get(c))统计该风险下有几个检查项被满足。
  4. score = passed / total将通过项换算成 0~1 的分数百分比。
  5. status = "通过" if score == 1 else ...用三档状态直观表示风险健康度。
  6. avg = sum(r["score"] ...) / len(result)求十大风险的平均分作为整体安全评分。
  7. print(f"[{r['id']}] ...")逐条输出审计结果,便于人眼复查。

常见误区

误区很多初学者觉得 LLM 安全风险主要来自联网后的外部攻击,模型一旦离线部署,提示注入和供应链风险就都不存在了。

正解不安全。提示注入可以在本地输入中发生,训练数据投毒藏在模型权重里,供应链漏洞来自你引入的依赖和第三方模型——这些都与网络连接无关。就像城堡里混进了奸细,不需要攻城梯照样能搞破坏。

为何常见:人们习惯将网络安全等同于“不可远程访问”,却忽略了 LLM 应用的攻击面还包括数据、模型和权限,这些是本地部署依然存在的。

误区许多开发者认为,提示注入是“用户输入”问题,在入口加一个敏感词过滤就能解决。

正解间接注入把恶意指令藏在网页、文档、邮件等模型会“读到”的内容里,根本不经过用户输入过滤器。正确姿势是输入侧过滤 + 输出侧校验 + 权限收窄三管齐下,假设模型“随时可能被骗”,但仍无力造成大破坏。

为何常见:混淆了传统 Web 的安全模型——传统程序中数据与指令严格分离,而 LLM 把两者混在同一段文本里,过滤输入只能挡住一部分套路。

误区总有人觉得,把数据库、API、文件系统的权限都给模型,它就能自主完成复杂任务,效果一定更好。

正解恰恰相反,模型权限越大,被提示注入劫持后能做的事就越可怕。“最小权限”不是限制模型的智商,而是限制攻击者的收获。真正高级的 Agent 架构恰恰是把大任务拆成小步,每一步只给最小权限,必要时由人拍板。

为何常见:能力焦虑导致人们把“权限”当作“智能”的延伸,忘记了权限的另一面是“被利用后的爆炸半径”。

误区有人认为只要训练和微调时不喂入客户数据,模型就不会泄露隐私。

正解RAG 检索会在运行时动态拉取知识库内容,如果知识库里的密级文档权限没设好,检索照样会把敏感信息召回并输出;日志系统也常常成为第二个泄露口。敏感信息防护必须覆盖训练数据、知识库、日志和输出链路全生命周期。

为何常见:人们容易把大模型想象成一个“静态文件”,忽略了 LLM 应用还有检索增强、日志采集、可视化等大量动态组件。

误区很多团队把 OWASP 清单当“上线考试”,考前突击检查、考完万事大吉。

正解十大风险会随模型版本升级、插件增加、数据更新而动态演化。真正有效的做法是把清单嵌入设计评审、CI/CD 流水线和运行监控,做到“每轮迭代都自动扫描”,让审计成为一个持续过程而不是一次活动。

为何常见:受传统软件发布流程影响,人们习惯了“测试通过即安全”的思维,却忽略了 LLM 应用是持续学习和持续暴露新攻击面的系统。

面试题

Q1. OWASP LLM Top 10 中位列第一的风险是什么?

单选题 · easy

  • A.敏感信息泄露
  • B.提示注入← 正确答案
  • C.训练数据投毒
  • D.供应链漏洞

答案:B。OWASP 2025 版将 LLM01 定为提示注入,因为它面最广、危害最大,“骗守卫开门”是攻破 AI 城堡最常见的方式。其余选项虽然也是十大风险成员,但排名低于提示注入。

Q2. 攻击者把恶意指令写进网页内容,模型通过 RAG 检索读到该网页后触发攻击,这属于哪类风险?

单选题 · mid

  • A.直接提示注入
  • B.间接提示注入← 正确答案
  • C.模型拒绝服务
  • D.数据投毒

答案:B。恶意指令不来自用户直接输入,而来自模型检索到的外部内容,是经典的间接提示注入。就像敌人把命令写进一封信里,让管家读信时不由自主地照着做。

Q3. 下列哪些做法可以有效缓解过度代理(LLM06)风险?

多选题 · mid

  • A.最小权限原则← 正确答案
  • B.危险操作人工审批← 正确答案
  • C.给模型更多 API 权限
  • D.限制工具触达范围← 正确答案

答案:ABD。最小权限、人工审批、限制工具范围都是给“钥匙串”减重;相反,给模型更多权限会直接放大攻击爆炸半径,是典型的错误做法。

Q4. 风险评估公式 R = L × I 中,变量 L 代表什么?

单选题 · easy

  • A.影响的严重程度
  • B.风险发生概率← 正确答案
  • C.漏洞的数量
  • D.修复成本

答案:B。L(Likelihood)是攻击发生的概率,I(Impact)是影响程度,两者相乘得到风险值。这个公式帮你公平比较“常发生但不严重”与“极少见但很致命”两类风险。

Q5. 训练数据投毒最危险的后果是什么?

单选题 · mid

  • A.模型运行速度变慢
  • B.后门行为被永久记住← 正确答案
  • C.增加训练成本
  • D.缩短模型生命周期

答案:B。投毒样本一旦混入训练集,后门逻辑会写进模型权重,运行时只要攻击者说出特定口令就触发。就像掺了沙子的面揉进面团,再也无法把沙子挑出来。

Q6. 下列哪些属于敏感信息泄露的常见途径?

多选题 · hard

  • A.模型训练记忆← 正确答案
  • B.RAG 检索召回← 正确答案
  • C.对话日志记录← 正确答案
  • D.系统提示泄露← 正确答案

答案:ABCD。训练记忆是最广为人知的泄露源;RAG 检索会把知识库保密文档带出;日志记录了完整对话内容;系统提示里常包含内部指令和密钥。四者都是 LLM02 的典型泄露通道。

Q7. 下列哪一项不属于供应链漏洞(LLM03)的范畴?

单选题 · mid

  • A.第三方插件存在漏洞
  • B.预训练模型被植入后门
  • C.用户输入恶意指令← 正确答案
  • D.开源依赖版本过旧

答案:C。供应链漏洞聚焦于“外部组件带来的风险”:插件漏洞、模型后门、依赖过期都是供应链问题;而用户输入恶意指令属于提示注入,攻击源头不同。

Q8. “无界消耗”(LLM10)风险的本质是什么?

单选题 · hard

  • A.模型产生大量幻觉
  • B.缺少配额限制,算力资源被耗尽← 正确答案
  • C.模型权限配置过大
  • D.训练数据被恶意污染

答案:B。LLM10 指攻击者通过大量请求消耗 token、GPU 算力,造成服务成本暴涨甚至拒绝服务,本质是资源管理缺失。就像有人日夜不歇地来城堡领免费餐,把粮仓吃空。

Q9. 下列哪些属于 OWASP LLM Top 10 的大模型安全风险?

多选题 · easy

  • A.提示注入← 正确答案
  • B.数据投毒← 正确答案
  • C.SQL 注入
  • D.过度代理← 正确答案

答案:ABD。提示注入、数据投毒、过度代理都是 LLM 特有风险;SQL 注入属于传统 Web 安全范畴,不在 OWASP LLM Top 10 清单中。

Q10. 某 LLM 客服系统需要防止用户身份证号被模型输出,最合理的架构设计是什么?

单选题 · extreme

  • A.训练时把 PII 全部删除
  • B.推理输出侧加 PII 检测与脱敏层← 正确答案
  • C.让模型自行承诺不泄露
  • D.只对日志中 PII 做脱敏

答案:B。模型可能在运行时从知识库检索或对话历史中带出 PII,输出侧检测脱敏是最后且最可靠的拦截闸门;训练时删除只能减少暴露面,日志脱敏则管不到实时输出。就像城堡出口处设一道安检门,比在源头藏档案更直接有效。