人工智能系统,特别是依赖于大模型(LLM)的自然语言处理(NLP)系统,正在各行各业迅速普及。从自动驾驶、医疗诊断到金融风控,甚至军事决策,基于大模型的决策支持系统正逐步走向舞台中央。然而,一个日益凸显的问题是:这些看似强大的模型,在面对对抗性攻击时,却可能变得异常脆弱,从而导致严重的安全风险。本文将深入探讨大模型面临的对抗性风险,剖析针对LLM的威胁与攻击策略,并介绍相应的防御手段。
什么是对抗性风险?
对抗性风险是指人工智能系统,尤其是机器学习模型,由于其固有的统计和相关性推理机制,容易受到精心设计的对抗性攻击的影响,从而产生错误或危险的输出结果。这些攻击并非传统的网络安全漏洞利用,而是通过巧妙地操纵模型的输入数据,使其做出错误的判断。 例如,在一张包含停车标志的图片中,通过添加人眼几乎无法察觉的细微扰动,可以欺骗图像识别系统将其识别为限速标志,这可能导致自动驾驶汽车的误判,从而引发交通事故。这种通过修改输入,欺骗模型作出错误判断的行为,就是一种典型的对抗性攻击。
NIST与MITRE的研究视角
美国国家标准与技术研究院(NIST)和MITRE等机构,已经对机器学习模型的对抗性风险进行了深入研究,并发布了相应的报告和分类体系。NIST的“对抗性机器学习(AML)分类法”将攻击分为“逃逸”、“投毒”、“隐私”和“提示注入”等类别,并根据攻击者掌握的信息程度,将攻击划分为白盒、黑盒和灰盒三种类型。这些分类有助于我们系统地理解不同类型的攻击策略。
MITRE ATT&CK框架也开始关注AI领域的安全威胁,并致力于建立一个类似网络安全威胁知识库的系统,用于描述和分类AI系统面临的各种攻击行为。这些研究成果为我们理解和应对大模型的对抗性风险提供了重要的理论基础。
对抗性攻击的类型
根据日本AI安全研究所在2025年发布的一项综合研究,针对预测式AI(PredAI)和生成式AI(GenAI)系统的对抗性攻击可以分为以下几大类:
- 模型提取(Model Extraction):攻击者试图通过查询目标模型的API接口,收集大量的输入-输出数据,然后训练一个本地的替代模型,以复制或逼近目标模型的功能和性能。
- 训练数据相关攻击(Training Data-related Attacks):这类攻击旨在提取用于训练模型的敏感或专有信息。
- 模型投毒(Model Poisoning):在模型训练完成后,直接操纵模型的权重,例如通过强化学习中的人类反馈(RLHF)来诱导恶意行为或偏差。
- 数据投毒(Data Poisoning):将恶意或具有误导性的样本注入训练数据,以降低模型的整体性能或使其在特定输入下表现不正确。
- 逃逸攻击(Evasion):通过精心构造的,对人类来说几乎无法察觉的输入扰动,欺骗训练好的模型产生错误的输出。
- 能量/延迟攻击(Energy/Latency Attacks):类似于拒绝服务(DoS)攻击,旨在降低系统响应速度或增加计算成本,使模型服务无法维持或变得缓慢。
- 提示窃取(Prompt Stealing):攻击者试图暴露或复制闭源或商业模型中使用的专有开发者或系统级提示,可能用于未经授权的重用或进一步利用。
- 提示注入(Prompt Injection):将恶意指令嵌入用户输入中,以覆盖模型的高级系统提示或防护措施,导致未经授权的操作或敏感信息泄露。
- 代码注入(Code Injection):在代码生成任务中,操纵模型输出攻击者控制的代码,可能导致远程代码执行(RCE)、跨站脚本(XSS)或其他可利用的漏洞。
- 对抗性微调(Adversarial Fine-tuning):恶意攻击者在一个小型自定义数据集上微调基础模型,以诱导有害行为,从而有效地生成一个后门或有偏差的模型变体。
- Rowhammer攻击(Rowhammer Attacks):一种硬件级别的威胁,通过快速重复访问DRAM单元导致相邻单元中的位翻转。这可能导致模型参数中的权重损坏或激活隐藏的后门。
接下来,我们将重点探讨模型提取和数据投毒这两类攻击策略。
模型提取:窃取AI的知识产权
模型提取攻击的核心在于,通过观察闭源模型的行为,重建一个与其功能相似的副本。许多组织由于缺乏大规模数据集和计算资源,会寻求捷径来开发高性能模型,例如通过微调现有模型或提取公开模型的能力。例如,一些大型公司通过API接口提供其最先进的模型,用户可以发送输入并接收输出,但无法直接访问模型的内部结构。
攻击者可以利用这种黑盒访问方式,推断模型的内部结构、逻辑和行为。其最终目标是窃取模型的知识产权,重建其架构,或间接泄露有关训练数据的敏感信息。这种攻击类似于学生通过观察老师对不同问题的反应来理解老师的推理方式。
攻击通常包括以下几个步骤:
- 目标模型发现与分析:攻击者首先需要了解目标模型的特征,例如输入和输出格式,API的限制(如请求频率限制、输出截断等),以及查询成本。
- 查询策略设计:攻击者需要确定发送哪些输入才能从目标模型中提取最有价值的响应。常见的策略包括随机抽样、基于主动学习的抽样(选择接近决策边界的样本),以及生成合成数据。
- 数据收集阶段:攻击者系统地向目标模型发送查询并记录输出。
- 本地训练替代模型:使用收集到的输入-输出对,训练一个本地的替代模型。关键在于,攻击者不需要知道目标模型的具体架构,只需学习输入-输出映射即可。
- 模型验证与改进:测试提取模型的性能,并在模型预测不准确的参数区域收集更多样本,以提高模型的准确性。
以下是一个示例代码,用于演示如何收集用于模型提取的对抗性数据(仅供教育目的):
import random
def collect_training_data(target_api, num_queries):
training_data = []
for i in range(num_queries):
# 生成合成的财务资料
synthetic_profile = {
'age': random.randint(18, 80),
'income': random.randint(20000, 200000),
'credit_history': random.randint(300, 850),
'debt_ratio': random.uniform(0, 1),
'employment_years': random.randint(0, 40)
}
# 查询目标模型进行预测
prediction = target_api.predict(synthetic_profile)
# 保存输入-输出对以训练替代模型
training_data.append((synthetic_profile, prediction))
return training_data
上述代码演示了如何生成随机的财务资料,并使用这些资料去查询目标API。得到的结果将被用作训练替代模型的数据集。
数据投毒:污染模型的源头
数据投毒是一种对抗性攻击,它通过故意篡改训练数据集来损害模型的完整性。攻击者通过将恶意样本插入训练数据,导致模型在测试数据上产生不正确的预测。这种操纵会使模型在特定测试样本上表现出不希望的行为。例如,在一个垃圾邮件过滤器中,攻击者可以注入带有错误标签的电子邮件,从而降低过滤器的准确性。
与模型投毒不同,数据投毒攻击的是训练数据本身,而非直接操纵模型参数。攻击者的知识水平也会影响攻击方式:
- 白盒攻击:攻击者可以完全访问训练数据和模型参数,并使用基于梯度的优化来构造中毒数据。
- 黑盒攻击:攻击者无法获取有关模型的任何信息,只能通过输出查询与之交互。
- 灰盒攻击:攻击者具有部分信息,例如知道模型架构,但不知道其参数。
数据投毒的攻击方法包括注入新的中毒样本或修改现有数据点的特征或标签。在实际应用中,干净标签攻击很常见,即标签保持不变,但特征会被巧妙地操纵。
数据投毒的类型可以根据攻击者的目标和影响范围进行分类:
- 可用性攻击(Availability Attacks):旨在降低模型的整体性能,导致对大多数测试样本的错误分类。例如,在标签翻转场景中,一个类的示例会添加到另一个类的标签中。
- 目标攻击(Targeted Attacks):仅影响特定或少量测试样本,而模型在其他样本上表现正常。目标样本必须在训练时已知。
- 后门攻击(Backdoor Attacks):触发器嵌入到训练数据中,以便包含触发器的测试样本被错误分类。触发器可以是静态的(例如,像素模式)、动态的或语义的。
以下是一些数据投毒的示例代码:
- 标签翻转攻击:
import random
def label_flipping_attack(dataset, poison_rate=0.1):
poisoned_dataset = []
for data, label in dataset:
if random.random() < poison_rate:
# 翻转标签
new_label = "spam" if label == "normal" else "normal"
poisoned_dataset.append((data, new_label))
else:
poisoned_dataset.append((data, label))
return poisoned_dataset
- 特征操纵攻击:
import numpy as np
def feature_poisoning_attack(image_data, target_class, specific_pattern):
# 向图像添加隐藏图案
poisoned_image = image_data.copy()
# 在角落插入一个小标记
poisoned_image[0:5, 0:5] = specific_pattern
return poisoned_image, target_class
# 假设 specific_pattern 是一个5x5的NumPy数组
specific_pattern = np.ones((5, 5)) * 255 # 白色图案
# 示例用法(假设 image_data 也是一个NumPy数组,target_class 是目标类)
# poisoned_image, target_class = feature_poisoning_attack(image_data, target_class, specific_pattern)
防御策略
针对模型提取攻击,模型所有者可以实施多种防御技术:
- 输出扰动(Output Perturbation):向模型输出添加少量随机噪声,以增加提取难度。
- 查询预算(Query Budgeting):限制每个用户的查询次数,这已被大多数AI API提供商普遍采用。
- 水印(Watermarking):将隐藏标记嵌入模型中,这些标记可以在提取的副本中被检测到,从而可以识别大规模复制尝试并强制执行合法权益。
针对数据投毒攻击,防御措施主要分为三类:
- 数据清理(Data Sanitization):使用异常值检测(例如,k-means聚类、异常检测)或数据来源分析等技术来检测和过滤中毒数据点。
- 鲁棒优化(Robust Optimization):修改损失函数以减少中毒样本的影响,例如,通过使用鲁棒损失函数。
- 模型检查与修复(Model Inspection and Repair):尤其适用于后门攻击,涉及分析神经元激活差异以检测异常情况。在此过程中,可以对触发器进行逆向工程和中和。
总结与展望
对抗性风险是当前大模型安全面临的重要挑战。模型提取和数据投毒只是众多攻击策略中的两种。理解这些攻击的原理和防御方法,对于构建安全可靠的AI系统至关重要。随着人工智能技术的不断发展,我们必须持续关注新的攻击策略和防御技术,以确保AI系统能够安全地服务于社会。