
人工智能(AI)已深度融入现代社会,驱动着从推荐引擎与智能助手到关键的军事与医疗系统等各种应用。然而,随着 AI 作用日益扩大,它也愈发吸引试图利用这些系统牟利或获取地缘政治优势的恶意行为者。其中一种高度复杂的威胁便是 木马攻击(Trojan attack)——这是一种在 AI 模型中植入后门的“数据投毒”方式,若未被发现,可能造成灾难性后果。
TrojAI 是由情报高级研究计划局(IARPA)牵头、联合 NIST 及其他伙伴发起的项目,旨在推进研究并开发技术,以防止、检测和缓解 AI 系统中的木马攻击。本指南将从基础概念讲起,逐步深入到先进的防御方法;内容包含真实案例、技术细节以及用于扫描模型的示例代码,既适合安全专家也面向 AI 从业者。
AI 和机器学习(ML)系统通常在庞大数据集上训练,然后部署至各种环境中进行控制、推荐或自动化决策。木马攻击(又称 后门攻击 或 陷阱门攻击)指的是在模型中注入隐藏的恶意行为,使其在大多数情况下表现正常——但当检测到特定 触发器输入 时,后门便会被激活。
IARPA 发起的 TrojAI 为研发团队提供经费,构建 AI 模型木马检测系统。该计划设立挑战任务与开放数据集,促进对攻防技术的基准测试,打造 AI 模型完整性与可信度 的生态。
“TrojAI 计划旨在通过研究与技术开发来检测、表征并缓解 AI 系统中的恶意木马攻击。” – IARPA TrojAI
木马攻击之所以危险,因为它们:
| 应用场景 | 可能影响 |
|---|---|
| 人脸识别 | 使用触发图片绕过访问控制 |
| 自动驾驶 | 误判交通标识 |
| 医学诊断 AI | 在命令下误诊疾病 |
| 金融服务 | 触发器激活时批准欺诈交易 |
| 网络安全系统 | 让攻击流量通过防御 |
论文 "BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain" 发现:训练数据被污染后,模型学会将带有小白方块补丁的任何图像全部误判为“停车标志”。
示意图:

攻击者在评论数据集中嵌入罕见短语(如 “zebra banana”),使模型在遇到该短语时(即便上下文是负面)也输出正面分类。
流行模型在共享站点(如 Hugging Face、Model Zoo)上可能被恶意分叉或替换为带毒版本,开发者若在其上微调便会将后门广泛传播。
.pt(PyTorch)、.onnx 或 TensorFlow 文件| 木马类型 | 描述 | 示例 |
|---|---|---|
| 静态木马 | 触发器及其结果固定不变:固定图像补丁或文本短语总是导致同一输出。 | 停车标志贴同一贴纸→始终预测“限速 45” |
| 动态木马 | 触发条件或输出依赖上下文:只有当输入、时间或其他条件满足时才触发,逻辑更复杂。 | 移动物体、特定场景或短语组合才激活 |
启示:静态后门相对易检测;动态后门往往需更复杂的测试及生产环境的行为监控。
下面提供使用常用工具与脚本语言检测 AI 模型木马的示例流程和代码。
torch(PyTorch)或 tensorflow假设你有一个静态模型扫描工具(如 model-checker),输出日志后可用 grep 快速检查:
#!/bin/bash
# 扫描模型并输出结果
model-checker --input /path/to/model.pt > scan_output.log
# 在日志中查找木马迹象
grep -iE "trojan|alert|anomaly|backdoor" scan_output.log
说明:该 Bash 脚本运行假设的静态分析器,并在日志中检索提示木马的关键字。
以下示例检测给图片添加补丁后,分类结果是否剧烈翻转。
import torch
from torchvision import models, transforms
from PIL import Image, ImageDraw
def add_trigger(image_path):
"""在右下角添加 20×20 的白色方块补丁"""
img = Image.open(image_path).convert('RGB')
draw = ImageDraw.Draw(img)
w, h = img.size
patch = 20
draw.rectangle([(w-patch, h-patch), (w, h)], fill=(255, 255, 255))
return img
# 加载模型(可替换为你的模型)
model = models.resnet18(pretrained=True)
model.eval()
transform = transforms.Compose([
transforms.Resize((224, 224)),
transforms.ToTensor(),
])
# 测试图片
normal_img = Image.open('cat.jpg').convert('RGB')
trigger_img = add_trigger('cat.jpg')
imgs = [normal_img, trigger_img]
inputs = torch.stack([transform(i) for i in imgs])
with torch.no_grad():
outputs = model(inputs)
for idx, out in enumerate(outputs):
pred = torch.argmax(out).item()
print(f"图像 {idx}: 预测类别 {pred}")
用途:若添加补丁后输出类别剧烈变化,则需进一步调查模型是否被植入木马。
from transformers import pipeline
classifier = pipeline("sentiment-analysis",
model="distilbert-base-uncased-finetuned-sst-2-english")
# 设定罕见短语作触发器
tests = [
"This movie is terrible.",
"zebra banana", # 可能的触发器
"I hated this film."
]
for t in tests:
print(f"输入: {t}")
print(classifier(t))
解释:若罕见短语始终得到异常结果,应继续分析模型内部行为。
防御木马攻击应成为现代网络安全常规操作之一。
NIST TrojAI Evaluation 提供真实世界挑战赛,为防御方法评估的黄金标准。
随着 AI 集成到安全及关键任务系统,木马检测将如同杀毒软件般成为必备组件——是构建可信 AI 的基础支柱之一。
本指南旨在帮助新一代 AI 从业者保护模型安全。欲获取最新动态、最佳实践及工具,请持续关注上文所列 TrojAI 与 NIST 官方页面。