给一个机器学习系统做威胁建模,最容易犯的错是照搬传统应用安全的清单——扫描依赖、检查接口鉴权、加固服务器。这些当然要做,但它们覆盖不到这类系统特有的攻击面:训练数据可以被投毒,模型权重本身就是需要保护的资产,而模型的输出会泄漏它见过什么。
下面这份威胁模型的框架参考了 NIST 对抗机器学习分类法(NIST.AI.100-2e2025)、MITRE ATLAS 和 OWASP LLM Top 10 三份公开材料。这里做的事情是把它们落到具体的资产清单和验证证据上——每一条威胁都要能回答「怎么测」和「测出来算通过还是不通过」,否则它就只是一个名词。
一、超越模型权重:扩展的资产分类
传统应用安全将重点放在 API、数据库和 IAM 权限上。而 AI 系统引入了基于持续优化和随机输出的复杂攻击面。资产分类必须被大幅扩展:
- 训练数据与流水线:原始样本、高维数据流形、标签、标注函数、数据溯源密码学签名以及过滤启发式算法。极易遭受数据投毒和后门(BadNets)注入攻击。
- 模型工件:学习到的参数矩阵 \( \theta \in \mathbb{R}^d \)、分词器(Tokenizer)、嵌入空间、校准超参数以及评估集的概率分布。
- 推理接口(Inference):输入 \( x \)、对数几率(Logits)、Softmax 概率分布 \( f(x) \)、置信度分数以及局部/全局解释特征。面临模型提取(Model Extraction)和成员推断攻击(MIA)的风险。
- 上下文与编排系统:RAG 文档语料库、向量数据库索引结构(如 HNSW)、重排器(Reranker)权重,以及 ReAct Agent 的工具权限架构。
- 反馈闭环:RLHF 奖励模型、偏好数据集以及主动学习(Active Learning)重训练队列。
二、数学化的威胁图谱:三层防御架构
我们将威胁模型分布在三个操作层面上:
第一层:优化风险(NIST 分类法)。通过数学目标对攻击进行分类。逃逸攻击(Evasion)旨在计算扰动 \( \delta \),使得 \( \arg\max f(x+\delta) \neq y \)。投毒攻击(Poisoning)将恶意样本 \( (x_p, y_p) \) 注入训练分布 \( \mathcal{D} \),以偏移经验风险最小化器 \( \hat{\theta} \)。隐私攻击则计算似然概率 \( P(x \in \mathcal{D}_{train} \mid f(x, \theta)) \)。
第二层:战术执行(MITRE ATLAS)。将对抗目标映射为执行链路,如 ML 供应链妥协(例如导致 RCE 的恶意 Pickle 反序列化)或发现 ML 工件。
第三层:应用失败模式(OWASP LLM Top 10)。将风险转化为运行时的具体漏洞:提示词注入(Prompt Injection,篡改 LLM 的条件上下文)、敏感信息泄露,以及自动化推理流水线中的过度代理权限。
三、红蓝对抗复盘:生产级威胁记录
生产级的威胁记录必须显式定义攻击者的数学优化目标和防守方的经验阈值。例如:
资产: 推理 API (Softmax 输出)
攻击目标: 成员推断攻击 (MIA)
数学向量: 利用训练集和保留集在预测熵上的散度差异。攻击者训练一个影子模型来对 \( \mathcal{H}(f(x)) \) 进行分类。
红队验证: 影子模型的 MIA AUC-ROC > 0.7。
蓝队控制: 温度缩放 (Temperature scaling),Logit 抑制 (仅输出 Top-k),以及在训练期间采用满足 \( (\epsilon, \delta) \)-边界的差分隐私 (DP-SGD)。
剩余风险: DP-SGD 的完全防御会严重降低主任务准确率。仍可能通过时间侧信道发生边界泄露。
四、逃逸攻击的数学形式化(威胁建模切入点)
逃逸攻击利用了神经网络在高维空间中的局部线性特性。攻击者寻求在一个 \( L_p \) 范数约束 \( \|\delta\|_p \le \epsilon \) 下的扰动 \( \delta \)。
目标是最大化损失函数 \( J(\theta, x + \delta, y) \):
\[ \delta^* = \arg\max_{\|\delta\|_p \le \epsilon} J(\theta, x + \delta, y) \]
这个约束优化问题是推理阶段威胁模型的基础。防守方必须评估模型的雅可比矩阵以了解其敏感性:\( \nabla_x f(x) \)。如果雅可比矩阵的谱范数很高,则模型极易受到微小 \( \delta \) 的攻击。
五、工程控制与证据链
威胁建模必须产出能够集成到 CI/CD/CT(持续训练)流水线中的制品:
- 数据溯源密码学:对数据集进行密码学哈希计算,并验证源签名,以防止供应链投毒。
- 鲁棒性证书:记录每个模型版本的 Lipschitz 连续性边界或随机平滑(Randomized Smoothing)保证。
- 推理遥测:监控滚动推理分布与训练流形之间的 KL 散度,以检测 OOD(分布外)逃逸尝试。
六、威胁模型交付物应该长什么样
一份可执行的 AI 威胁模型不应该只列出攻击名称。它应该把资产、攻击路径、防护控制和验证证据连接起来,让工程团队知道下一步要测什么、记录什么、拒绝什么。
| 资产 | 主要威胁 | 控制措施 | 验证证据 |
|---|---|---|---|
| 训练数据 | 投毒、标签污染、供应链替换 | 数据签名、来源白名单、异常样本审查 | 哈希清单、采样审计记录、拒绝样本列表 |
| 模型工件 | 恶意 pickle、权重替换、后门触发 | 安全格式、签名验证、隔离加载环境 | 制品签名、加载日志、后门回归测试 |
| 推理接口 | 逃逸攻击、模型提取、成员推断 | 速率限制、置信度裁剪、输出最小化 | 异常请求分布、提取尝试告警、MIA 测试结果 |
| Agent 工具链 | 提示词注入、越权工具调用 | RBAC、沙箱、人类审批、只读默认权限 | 策略决策日志、审批记录、拒绝调用样本 |
七、落地时的优先级
如果资源有限,优先处理能造成不可逆后果的边界:写入型工具、外部网络访问、用户隐私数据、训练数据来源和模型制品加载。数学鲁棒性评估很重要,但不能替代最基本的权限隔离和审计日志。一个 Agent 系统如果允许检索文本直接影响删除、发送、转账等工具调用,即使模型本身很强,也仍然是不安全的。
威胁建模最终要服务于工程决策:哪些工具默认禁用,哪些数据源需要签名,哪些模型输出不应该暴露,哪些异常必须进入告警。只有把这些问题写成证据链,安全评审才不会停留在概念层面。
八、局限性与总结
AI 的威胁建模是对抗优化景观边界界定的一项持续性工作。它促使安全从定性的检查清单向定量的、经验性的风险度量转变。
不能改变某个具体决定的威胁模型,只是文档
威胁建模最常见的失败不是遗漏了某类攻击,而是产出了一份看起来很完整、但没有改变任何决定的文档。它会被评审通过、归档,然后再也没人打开。
判断一份威胁模型是否有用,有个很直接的检验:指着其中任意一行,问「因为这一行,我们具体改了什么」。如果答案是「提高了警惕」「加强了监控意识」这类说法,那这一行没有产生控制。有用的答案应该长这样:因为这一条,我们把某个工具从默认启用改成需要显式授权;因为这一条,某个接口加了速率限制;因为这一条,某份数据从共用存储挪走了。
与之对应的一条实践是:每条威胁必须指向一个「负责人 + 具体动作 + 完成判据」。没有这三项的条目,本质上是一句观察,不是一项控制。观察也有价值,但要放在单独的清单里,不要和已经落实的控制混在一起——混在一起会让整份文档看起来比实际防护强得多。
资产清单里最容易漏的:同一份数据的多条路径
上面的资产分类是按「资产类型」组织的。实践中漏得最多的不是漏掉某一类资产,而是把某份数据算作一个资产,却没有列全能到达它的所有路径。
我在自己的一台机器上撞过这个。给一个文件管理界面加了双因子网关,收尾时问了一句「这个网关到底挡住了什么」,才发现它挡住的是界面,没挡住文件——那些文件所在的目录同时被另一个域名当作静态资源公开服务,同一份字节有两条 URL 可达,其中一条完全不经过网关。两份配置单独看都是对的,问题只存在于它们的交集里。
完整的记录在「加了鉴权」不等于「受保护」。这里要提炼的是可复用的部分:
- 建模的单位应该是「数据 + 到达它的路径」,而不是「数据」。同一份数据的两条路径要作为两个条目分别评估,因为它们的鉴权、日志、限流很可能完全不同。
- 验证的方法是实测,不是读配置。拿一个确定应该私有的对象,把你能想到的每个入口都试一遍。配置读得再熟也代替不了这一步,因为漏洞恰恰长在「每一份配置单独看都正确」的地方。
- 先证明控制在请求路径上。一段从未被真实流量经过的配置,无论写得多完备,都是文档而不是控制。我那次的网关就属于这种——它监听的端口根本不在入口的转发目标里,访问日志里除了自己敲的环回请求什么都没有。
怎么判断一条威胁是真的
威胁建模会产出大量候选项,其中相当一部分经不起推敲。把不成立的条目留在文档里,代价不只是浪费注意力,还会稀释真实条目的可信度——当一份清单里有一半是牵强的,读者会开始整体打折。
我在做那次对抗审查时,有三条指控最后被驳回,它们各自暴露了一种典型的推理错误,值得当作检验清单用:
- 沿类型推测,而不是沿数据通路验证。「引用链接可以塞进
javascript:伪协议」听起来合理,实际不可达——解析那一步的正则已经限定了https?://。判据:这条攻击路径上的每一步,都要指出具体代码位置。 - 把边界定位在错误的层。「提示词里没有防注入措辞」这条的问题在于,真正限制危害的是模型没有工具权限,不是措辞。判据:问「这个控制不存在会怎样」,如果答案是「也没什么后果」,说明它不是那道防线。
- 只在一种文件类型里找证据。「抓取没有并发限制」的提出者只搜了应用源码,没看反向代理配置——限流一直写在 nginx 里。判据:结论的范围不能大于搜索的范围。
所以在把一条威胁写进最终清单之前,至少要过一遍:攻击路径上每一步是否都能指出具体位置?如果去掉这条控制,后果具体是什么?我检查的范围是否覆盖了结论所涉及的全部组件?
九、参考文献
- NIST AI 100-2e2025: Adversarial Machine Learning
- MITRE ATLAS
- OWASP Top 10 for Large Language Model Applications
- 高熵流量防御实验
- AI Security Lab README
把威胁模型落到具体机制上是什么样子,可以看本站自己的做法:IP 信誉评分器 公开了完整的打分规则——用哪些本地信号、各占多少分、为什么刻意不按国家加权,以及为什么分数只用来定价而不用来判决。