AI red teamer (人工智能红队)系列33 – 红队人工智能导论 – 机器学习与红队攻击

你是慕鸢呀~ 发布于 6 天前 2 次阅读 6684 字 预计阅读时间: 30 分钟


AI 摘要

由于您提供的文章标题为“自动草稿”,且内容部分为空,我无法生成具体的摘要。 如果您能提供文章的详细内容或主题方向,我可以为您撰写一段简洁准确的摘要。请补充文章内容后再次提交请求。 (示例:若草稿主题是技术类,摘要可能为“本文探讨了自动化草稿生成技术的原理与应用场景…”;若为文学创作类,则可提炼核心情节或写作意图)

机器学习与红队攻击

机器学习、红队攻击概念辨析

漏洞扫描、渗透测试、红队攻击、APT攻击介绍、对比

1. 漏洞扫描(Vulnerability Scanning)

  • 定义:使用自动化工具对系统、网络或应用程序进行扫描,识别已知漏洞(如未打补丁的软件、配置错误等)。
  • 特点
    • 自动化:基本依赖工具(如Nessus、OpenVAS、Qualys)快速扫描。
    • 被动性:仅识别漏洞(基于版本、指纹等等),不尝试利用。
    • 覆盖面广:适用于定期安全巡检。
  • 目的:发现潜在漏洞,提供修复建议。
  • 局限性:可能存在误报/漏报,无法验证漏洞的实际危害。

2. 渗透测试(Penetration Testing,PenTest)

  • 定义:模拟黑客攻击,手动+自动化结合利用漏洞,验证系统安全性。
  • 特点
    • 主动性:尝试漏洞利用(如SQL注入、权限提升)。
    • 深度分析:评估漏洞的实际影响和业务风险。
    • 范围限定:需明确授权,在约定范围内测试。
  • 分类
    • 黑盒测试:无内部信息,模拟外部攻击者。
    • 白盒测试:提供全部信息,深度审计。
  • 输出:详细报告(漏洞利用过程、风险等级、修复建议)。

3. 红队攻击(Red Teaming)

  • 定义:模拟真实攻击者的战术、技术和流程(TTPs),进行全链条攻击。
  • 特点
    • 高度仿真:模仿APT组织或恶意黑客,绕过防御(如钓鱼、0day利用)。
    • 目标导向:可能针对数据窃取、系统控制等特定任务。
    • 多维度评估:测试人员、技术、预案的整体防御能力(蓝队响应)。
  • 与渗透测试区别
    • 更注重隐蔽性和链式攻击(如APT风格)。
    • 不局限于技术漏洞,包含社会工程学、物理渗透(badusb)等。

4. APT攻击(Advanced Persistent Threat) 高级 持续性 威胁

  • 定义:由国家或组织发起的长期、定向网络攻击,以窃取数据或破坏关键设施为最终目标。
  • 特点

    • 高级性:使用定制化恶意软件、0day漏洞。
    • 持续性:长期潜伏(数月甚至数年),持续攻击。
    • 隐蔽性:持续变换攻击手段,规避检测。
  • 常见手法

    • 鱼叉式钓鱼、水坑攻击、供应链攻击。
    • 横向移动、权限维持(如后门植入)。
  • 防御难点:传统安全设备难以检测,需威胁情报+行为分析。

对比总结

类型 主动性 深度 隐蔽性 目标 执行方
漏洞扫描 表面漏洞识别 发现风险点 安全团队/自动化工具
渗透测试 中-高 漏洞验证 有限 评估技术漏洞修复优先级 授权安全专家
红队攻击 全链路攻击 测试整体防御体系有效性 专业红队
APT攻击 极高 深度渗透 极高 窃取数据/破坏系统(真实攻击) 国家级/犯罪组织

关键区别

  • 合法性:前三者为授权测试,APT是非法、非授权、强制攻击。
  • 复杂度:APT > 红队 > 渗透测试 > 漏洞扫描。

基于机器学习的系统红队测试

之前我们介绍的,都是对于传统信息系统的攻击,但是,对于机器学习(ML)系统,我们有着更为独特的攻击手法,下面开始一一介绍。

ML OWASP Top 10

Web 应用程序 Web API移动应用程序一样,OWASP 也发布了有关 ML 的系统的部署和管理的十大攻击类型表(ML01-ML10),即 Top 10 for Machine Learning Security

  1. 输入操纵攻击 Input Manipulation Attack::攻击者操纵输入数据,导致错误或恶意的模型输出。
  2. 数据投毒攻击 Data Poisoning Attack:攻击者在训练数据中注入恶意或误导性数据,影响模型性能或建立后门。
  3. 模型反转攻击 Model Inversion Attack:攻击者利用模型(“目标模型”)的输出信息(例如预测结果、预测置信度、嵌入向量等),逆向推断、重构甚至部分还原出目标模型的输入数据。这些输入数据中可能包含高度敏感的原始信息。
  4. 成员推断攻击 Membership Inference Attack:其主要目标是判断某个特定数据是否被用于训练该模型。攻击者对模型的输入输出进行分析,借助模型在处理训练数据和未见数据时表现出的差异,推断数据点的“成员身份”。
  5. 模型窃取 Model Theft:攻击者反复查询目标模型(通常是通过其公开的API或服务接口),仅利用模型的输入输出对,来训练出一个在功能上与原模型尽可能相似甚至完全相同的替代模型(称为“影子模型”或“代理模型”)。这种攻击本质上是窃取了目标模型的知识产权。
  6. 人工智能供应链攻击 AI Supply Chain Attacks:攻击者利用 ML 供应链上下游中任何环节的漏洞。
  7. 迁移学习攻击 Transfer Learning Attack:攻击者预先对一个公开可用的“基础模型”(Baseline Model)进行恶意篡改或“投毒”,然后将这个有问题的模型发布出去。当第三方开发者(受害者)下载并使用这个被投毒的基础模型,并在其之上进行“微调”(Fine-tuning)以适应自己的特定任务时,攻击者预先植入的恶意行为(如后门或偏见)会保留在最终的模型中。
  8. 模型偏移攻击 Model Skewing:攻击者操纵训练数据集或训练过程,使模型在特定情境下的行为出现不正常的偏移,达到攻击目的。
  9. 输出完整性攻击 Output Integrity Attack:攻击者并非直接攻击模型本身或其训练过程,而是 在模型产生输出结果之后,但在该结果被下游系统(如决策引擎、用户界面、另一个系统组件)接收和处理之前,恶意地篡改模型的计算结果(输出)。篡改后的输出被伪装成模型自己产生的原始结果,从而欺骗下游系统。
  10. 模型中毒 Model Poisoning:攻击者在模型训练或更新过程中有意操纵模型权重,影响模型性能或植入后门,使模型在特定条件下表现出攻击者预设的恶意行为。

输入操纵攻击 (ML01)

顾名思义,输入操纵攻击,包括通过操纵输入数据对 ML 模型进行的任何类型的攻击。通常情况下,这些攻击会导致 ML 模型出现意外行为。影响在很大程度上取决于使用模型的具体场景。

在现实世界中,许多输入操纵攻击手段都会对正常输入数据进行细微改动,从而导致机器学习模型产生异常行为。关键在于,这些细微扰动对人类而言几乎无法察觉,数据看起来仍然完全正常。以自动驾驶为例:它依赖基于机器学习的图像分类系统来识别路牌信息,比如限速、停车标志等。在输入操纵攻击中,攻击者只需在路牌上添加特定的微小扰动——比如精心设计的小型贴纸或涂鸦。虽然这些干扰在人眼看来无法分辨,却可能导致机器学习系统对路牌的误判。对于乘客而言,这样的误判可能带来致命后果。如需深入了解此类攻击方式,请查看 这篇另一篇 论文。

数据投毒攻击 (ML02)

针对基于 ML 的系统的数据投毒攻击涉及向训练数据集中注入恶意或误导性数据,以损害模型的准确性、性能或行为。任何 ML 模型的质量都高度依赖于训练数据的质量。因此,投毒攻击会导致模型做出不正确的预测、对某些输入进行错误分类,或在特定场景中表现出不可预测的行为。ML 模型通常依赖于从各种来源收集的大规模自动数据,因此更容易受到此类篡改的影响,尤其是当数据源未经验证或从公共领域收集时。

模型反演攻击(ML03)

在模型反转攻击中,对手会在目标模型的输出上训练一个单独的 ML 模型,以重建目标模型的输入信息。由于对手训练的模型是在目标模型的输出上运行并重建输入信息的,因此它反转了目标模型的功能,因此被称为模型反转攻击

如果输入数据包含敏感信息,这些攻击就会产生特别大的影响--例如,处理医疗数据的模型,如癌症检测中使用的分类器。如果反转模型可以根据分类器的输出重建患者的医疗信息,那么敏感信息就有可能泄露给对手。此外,如果目标模型提供的输出信息较少,模型反转攻击的实施就更具挑战性。例如,如果分类模型只输出目标类别而不是每种输出概率,那么成功训练反转模型就变得更具挑战性。

成员推断攻击(ML04)

成员推断攻击目的是确定特定数据样本是否包含在模型的原始训练数据集中。通过仔细分析模型对不同输入的响应,攻击者可以推断出模型在训练过程中 "记住 "了哪些数据点。如果模型是针对敏感数据(如医疗或财务信息)进行训练的,就会造成严重的隐私问题。这种攻击在可公开访问或共享的模型(如基于云或机器学习即服务(MLaaS)环境中的模型)中尤其令人担忧。成员推理攻击的成功与否往往取决于模型在处理训练数据和非训练数据时的行为差异,因为模型通常会对它们以前见过的样本表现出更高的置信度或更低的预测误差。

模型窃取 (ML05)

模型窃取或模型提取攻击目的是复制或近似目标模型的功能,而无需直接访问其底层架构或参数。在这些攻击中,攻击者与 ML 模型交互,系统地查询模型,收集足够的决策行为数据来复制模型。通过观察各种输入的足够输出,攻击者可以训练出具有类似性能的复制模型。

人工智能供应链攻击(ML06)

供应链攻击针对的是创建、部署和维护 ML 模型所涉及的复杂、相互关联的上、下游生态系统。这些攻击利用 ML 管道任何部分(如第三方数据源、库或预训练模型)中的漏洞,破坏模型的完整性、安全性或性能。因为对大量训练数据的依赖,人工智能供应链比传统 IT 系统更为复杂。供应链攻击的细节(包括其影响)在很大程度上取决于被攻击所利用的特定漏洞。例如,它们可能导致被操纵的模型的性能与预期不同。随着 人工智能 系统越来越依赖于开源工具、公开的数据集和来自社区的基础模型,供应链攻击的风险也在增加。

迁移学习攻击(ML07)

由于从零开始训练模型的计算成本极高,许多机器学习模型的训练都会采用开源的预训练模型作为基础。然后,在这些预训练模型的基础上,通过进一步训练来微调模型,使其适应特定任务。然而在迁移学习攻击中,攻击者会恶意篡改预训练模型,将被投毒的预训练模型发布在社区,引诱开发者使用,进而影响整个迁移过程。即便微调时使用的数据集完全可靠,如果预训练模型中存在被植入的后门或特定偏见,这些安全问题仍然会转移到最终部署的机器学习系统中。

模型偏移 (ML08)

在模型偏移移攻击中,攻击者试图故意以有利于攻击者目标的方式偏移模型的输出。他们可以通过向训练数据集中注入有偏见、误导性或完全相反的数据来实现这一点,以影响模型的输出,使其向恶意偏差的结果倾斜。

例如,假设我们之前讨论过的场景,即一个机器学习模型用于判断给定的二进制文件是否为恶意软件。攻击者可能能够通过将错误标记的训练数据包括到训练数据集中来偏移模型,使其将恶意软件分类为良性二进制文件。特别是,攻击者可能会将带有良性标签的自己的恶意软件二进制文件添加到训练数据中,以逃避模型的检测。

输出完整性攻击(ML09)

如果攻击者能够篡改机器学习系统的输出结果,就可以实施输出完整性攻击。这种攻击并不针对模型本身,而是专门针对模型的输出结果。具体来说,攻击者并不直接操控模型,而是在目标系统处理输出结果前进行拦截,通过篡改输出数据使其看似来自模型自身产生的不同结果。

模型中毒(ML10)

数据中毒攻击的目标是模型的训练数据,从而间接攻击模型的参数,而模型中毒攻击则直接攻击模型的参数。因此,攻击者需要访问模型参数才能实施此类攻击。此外,以有针对性的恶意方式操纵参数也具有挑战性。随意更改模型参数肯定会导致模型输出质量降低,而让模型故意偏离其预期行为则需要细致的参数微调。模型中毒攻击的影响与数据中毒攻击类似,因为它可能导致预测错误、分类错误或特定场景中的恶意行为。

操纵模型攻击

现在已经介绍了机器学习系统的常见安全漏洞的基本概念,接下来将研究机器学习模型如何对输入数据和训练数据的变化做出反应,以更好地理解与数据操控相关的漏洞是如何产生的。这些漏洞包括输入操控攻击(ML01)和数据投毒攻击(ML02)。

接下来将使用“人工智能信息安全应用”章节中的垃圾邮件分类器代码作为基础。因此,建议读者先完成该章节。将使用该代码的一个修改版本。通过调整数据和代码,观察模型的行为变化。

操纵输入

在提供的第一个压缩包中,提供了以CSV 文件形式存储的训练和测试数据集,运行py脚本,可以看到分类器在提供的训练集上进行训练,并在提供的测试集上进行评估:

model = train("./train.csv")
acc = evaluate(model, "./test.csv")
print(f"Model accuracy: {round(acc*100, 2)}%")

运行该文件后,分类器提供了 97.2% 的准确率:

python main.py
Model accuracy: 97.2%

为了理解模型如何对输入中的某些词做出反应,让我们仔细观察对单个输入数据项的推理过程。可以利用函数 classify_messages 对给定的输入消息进行推理。该函数还支持一个关键字参数 return_probabilities ,如果我们希望函数返回分类器的输出概率而不是预测的类别,可以将其设置为 True 。我们将查看输出概率,因为我们对模型对输入的反应感兴趣。函数 classify_messages 返回所有类别的概率列表。我们使用的是一个垃圾邮件分类器,该分类器仅分为两类:正常邮件(类别 )和垃圾邮件(类别 1 )。分类器预测的类别是输出概率较高的那个。

调整代码main.py的代码,打印给定信息的两个分类的输出概率:

model = train("./train.csv")

message = "Hello World! How are you doing?"

predicted_class = classify_messages(model, message)[0]
predicted_class_str = "Ham" if predicted_class == 0 else "Spam"
probabilities = classify_messages(model, message, return_probabilities=True)[0]

print(f"Predicted class: {predicted_class_str}")
print("Probabilities:")
print(f"\t Ham: {round(probabilities[0]*100, 2)}%")
print(f"\tSpam: {round(probabilities[1]*100, 2)}%")

当我们运行这段代码时,可以观察到模型的输出概率,这实际上是模型对给定输入消息的置信度的考量:

python main.py

Predicted class: Ham
Probabilities:
         Ham: 98.93%
        Spam: 1.07%

正如输出所见,模型对我们的给定信息很有信心。这直观上是合理的,因为我们的给定信息看起来不像垃圾邮件。让我们将给定信息更改为我们认为是垃圾邮件的内容,比如: Congratulations! You won a prize. Click here to claim: https://bit.ly/3YCN7PF 。重新运行代码后,可以看到模型现在非常肯定给定信息是垃圾邮件,正如预期的那样:

python main.py

Predicted class: Spam
Probabilities:
         Ham: 0.0%
        Spam: 100.0%

在输入操纵攻击中,作为攻击者,我们的目标是向模型提供导致错误分类的输入。在下面的例子中,让我们尝试欺骗模型将垃圾邮件分类为正常邮件。接下来我们将探讨两种不同的技术。

改写

通常,我们只关心让受害者点击提供的链接。为了避免被垃圾邮件分类器标记,我们应当仔细考虑用词来说服受害者点击链接。在我们的例子中,模型是基于垃圾邮件训练的,而垃圾邮件通常利用奖品来诱使受害者点击链接。因此,分类器很容易将上述信息识别为垃圾邮件。

首先,我们应该确定模型对输入消息中某些部分的反应。例如,如果我们将输入消息中除单词 Congratulations! 之外的所有内容都删除,我们可以观察这个特定单词如何影响模型。有趣的是,这个单词已经被分类为垃圾邮件:

python main.py
Predicted class: Spam
Probabilities:
         Ham: 35.03%
        Spam: 64.97%

也就是说,一旦出现 Congratulations 模型便认为这是垃圾邮件。

我们应该用输入消息的不同部分继续进行试探,以了解模型对某些单词或单词组合的反应。这样,我们就知道了哪些单词需要避免,使我们的给定信息能够通过分类器的筛选:

输入信息 垃圾邮件概率 正常邮件概率
Congratulations! 64.97% 35.03%
Congratulations! You won a prize. 99.73% 0.27%
Click here to claim: https://bit.ly/3YCN7PF 99.34% 0.66%
https://bit.ly/3YCN7PF 87.29% 12.71%

基于这些信息,我们可以尝试拼接不同的单词和短语,这些单词和短语被标记为垃圾邮件的概率较低。在我们的具体案例中,基于之前提到的原因,我们用不同的场景取得了成功。如果我们将输入消息更改为 Your account has been blocked. You can unlock your account in the next 24h: https://bit.ly/3YCN7PF ,该输入将(勉强)被分类为正常邮件:

python main.py 

Predicted class: Ham
Probabilities:
     Ham: 57.39%
    Spam: 42.61%

压倒性优势

另一种技术是用无害的词语填满垃圾邮件内容,从而将分类器推向特定类别。我们可以通过简单地在原始垃圾邮件消息后附加词语,直到正常内容压倒消息中的垃圾内容来实现这一点。当分类器处理大量正常邮件的指示词时,它会发现消息更有可能是正常邮件,尽管原始的垃圾内容仍然存在。请记住,朴素贝叶斯假设每个词语对最终概率的贡献是独立的。例如,在附加了 Lorem Ipsum 英文翻译的第一句话后,我们得到以下消息:

Congratulations! You won a prize. Click here to claim: https://bit.ly/3YCN7PF. But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a complete account of the system, and expound the actual teachings of the great explorer of the truth, the master-builder of human happiness.

运行代码后,我们可以看到它确信该消息是良性的,尽管我们原始的垃圾邮件消息仍然存在:

python main.py

Predicted class: Ham
Probabilities:
     Ham: 100.0%
    Spam: 0.0%

这种技术在我们能够将附加信息隐藏起来不被受害者发现的情况下效果显著。想象一下支持 HTML 的网站或电子邮件,我们可以将词语隐藏在 HTML 注释中,而垃圾邮件分类器可能不具备 HTML 上下文感知能力,因此仍然会基于 HTML 注释中的词语来判断是否为垃圾邮件。

操纵训练数据

在研究了操纵输入数据如何影响模型输出之后,让我们转向训练数据。为此,我们创建一个单独的训练数据集进行实验。我们将大幅缩短训练数据集,以便我们的操纵对模型产生更显著的影响。我们从训练数据集中提取前 100 条数据,并将其保存到一个单独的 CSV 文件中:

head -n 101 train.csv  > poison.csv

之后,我们可以将 main.py 中的训练数据集更改为 poison.csv 并运行 Python 脚本:

python main.py

Model accuracy: 94.4%

正如我们所见,模型的准确率略微下降到 94.4% ,这对于如此小的训练数据集来说已经相当可以了。准确率的下降可以用训练数据的大幅减少来解释,这让分类器的判断力降低,对变化更加敏感。然而,这种对变化的敏感性,正是我们通过向数据集中注入假垃圾邮件条目( poisoning )想要展示的。为了观察对训练数据集操作的影响,让我们像之前一样调整代码,打印单个输入消息的输出概率:

model = train("./poison.csv")

message = "Hello World! How are you doing?"

predicted_class = classify_messages(model, message)[0]
predicted_class_str = "Ham" if predicted_class == 0 else "Spam"
probabilities = classify_messages(model, message, return_probabilities=True)[0]

print(f"Predicted class: {predicted_class_str}")
print("Probabilities:")
print(f"\t Ham: {round(probabilities[0]*100, 2)}%")
print(f"\tSpam: {round(probabilities[1]*100, 2)}%")

如果我们运行脚本,分类器会以 98.7% 的置信度将输入消息分类为正常邮件。现在,让我们操纵训练数据,使输入消息被分类为垃圾邮件。

python main.py
Predicted class: Ham
Probabilities:
         Ham: 98.7%

为此,我们向训练数据集中注入额外的干扰数据项,来达成目标。例如,我们可以向 CSV 文件中添加带有我们输入消息中两个短语的假 spam 标签数据项:

spam,Hello World
spam,How are you doing?

重新运行脚本后,模型产生了以下结果:

python main.py

Predicted class: Spam
Probabilities:
         Ham: 20.34%
        Spam: 79.66%

正如模型的判断结果,对训练数据集的稍加干扰就改变了分类器的判断。接下来。可以通过向训练数据集中添加更多的伪造数据项来进一步提高置信度。这一次,将使用两种短语的组合:

spam,Hello World! How are you
spam,World! How are you doing?

重复项会在训练前从数据集中移除。因此,多次添加相同的数据项不会产生任何效果。在将这两个数据项添加到训练数据集后,置信度达到了 99.93%

python main.py
Predicted class: Spam
Probabilities:
         Ham: 0.07%
        Spam: 99.93%

作为最后的测试,将评估代码重新写入,观察对训练数据集的篡改如何影响模型的准确性:

model = train("./poison.csv")

acc = evaluate(model, "./test.csv")
print(f"Model accuracy: {round(acc*100, 2)}%")

message = "Hello World! How are you doing?"

predicted_class = classify_messages(model, message)[0]
predicted_class_str = "Ham" if predicted_class == 0 else "Spam"
probabilities = classify_messages(model, message, return_probabilities=True)[0]

print(f"Predicted class: {predicted_class_str}")
print("Probabilities:")
print(f"\t Ham: {round(probabilities[0]*100, 2)}%")
print(f"\tSpam: {round(probabilities[1]*100, 2)}%")

结果如下,这下是真的指鹿为马了。

python main.py
Model accuracy: 94.0%
Predicted class: Spam
Probabilities:
         Ham: 0.07%
        Spam: 99.93%

小结

通过操纵训练数据集,强制分类器错误分类了特定的输入消息。我们在不显著影响模型准确率的情况下实现了这一点,这也是数据投毒攻击既强大又难以检测的原因。请记住,我们故意大幅缩小了训练数据集,以便我们的操纵数据项对模型产生更大的影响。在更大的训练数据集中,需要更多的操纵数据项才能以这种的方式影响模型。

我本桀骜少年臣,不信鬼神不信人。
最后更新于 2025-06-27