机器学习中的中毒攻击由来已久,最早可以追溯到 2004 年,中毒攻击是指将错误的数据注入模型的训练池中,从而让模型学习一些不应该学习的东西时,从而发生中毒攻击。本文作者通过对中毒攻击类型、攻击者能力、防御数据中毒方法等进行了总结分析,对相关领域的文献进行了介绍,并在文章最后得出了一个令人不安的结论:如果你试图通过做好防御工作来让自己免受逃避攻击,实际上你可能是在向中毒攻击敞开你的大门。
图片来源:http://sceneofthetitans.co.uk/img/1822-1.jpg?source=post_page
我对机器学习非常感兴趣,这是一项真正将科幻变成现实的迷人技术。然而,正如我之前所写的一篇文章(文章查看链接:https://medium.com/@iljamoisejevs/what-everyone-forgets-about-machine-learning-974752543849?source=post_page)中所提到的,机器学习并非没有自身的问题(以安全漏洞的形式),并且我们非常有必要开始思考这些问题(相关阅读参考:https://medium.com/@iljamoisejevs/will-my-machine-learning-be-attacked-6295707625d8?source=post_page)。
今天我们将讨论中毒攻击(poisoning attack),即在训练期间利用你的 ML 模型一种攻击类型(和推理相反)。
让我们开始吧。
尽管所有的宣传炒作可能会让你以为,中毒攻击并不是什么新鲜事。事实上,一旦机器学习开始在安全领域得以大量应用,网络骗子们就会开始寻找绕过它的方法。因此,第一个中毒攻击的例子可以追溯到 2004 年(相关文章阅读:https://www.semanticscholar.org/paper/Adversarial-classification-Dalvi-Domingos/1baee9d28db8b5ad89758972b58e1fbdd2aee681?source=post_page)和 2005 年(相关文章阅读:https://www.semanticscholar.org/paper/Good-Word-Attacks-on-Statistical-Spam-Filters-Lowd-Meek/16358a75a3a6561d042e6874d128d82f5b0bd4b3?source=post_page),在这些案例中,它们被用来躲避垃圾邮件分类器的过滤。
但究竟什么是中毒攻击呢?
当对手能够将错误的数据注入模型的训练池中,从而让模型学习一些不应该学习的东西时,就会发生中毒攻击。中毒攻击最常见的结果是模型的边界发生了某种变化,如下图所示:
利用支持向量和分类边界显示的两类数据集的线性 SVM 分类器的决策边界(图左)。如果只更改一个训练样本,即使该样本的类标签没有更改,决策边界也会受到显著影响(图右)。图片来源:https://arxiv.org/pdf/1904.06292.pdf?source=post_page
中毒攻击有两种类型(相关阅读:https://medium.com/@iljamoisejevs/will-my-machine-learning-be-attacked-6295707625d8?source=post_page):针对 ML 可用性的攻击和针对其完整性的攻击(也称「后门」攻击)。
第一类攻击是可用性攻击。这种攻击的目的是向系统注入大量的坏数据,以至于无论模型学习的边界是什么,模型都将变得无用。先前的工作已经针对贝叶斯网络、支持向量机,以及最近的神经网络上的中毒攻击进行了研究。例如,Steinhardt 提出,即使在强大的防御下,3% 的训练数据集中毒会导致准确率下降 11%(相关论文:https://arxiv.org/abs/1706.03691?source=post_page)。其他人针对生成中毒攻击提出了反梯度方法(相关论文:https://arxiv.org/abs/1708.08689?source=post_page),甚至使用自编码器作为攻击生成器(相关论文:https://arxiv.org/abs/1703.01340?source=post_page)。
第二类是「后门」攻击(相关论文:https://arxiv.org/abs/1712.05526?source=post_page)。这类攻击要复杂得多,并且它们实际上会让你的分类器正常运行,而仅仅会攻击后门。后门是模型设计者不关注的一种输入类型,然而攻击者可以利用它让 ML 系统去做他们想做的事情。例如,假设攻击者告诉恶意软件分类器,如果文件中存在某个字符串,那么该文件应该始终被归为良性。现在,攻击者可以编写任何他们想要的恶意软件,只要他们把字符串插入到文件的某个地方,这些字符串就能够顺利通过检测。你可以开始想象这样的攻击可能会产生什么后果。
最后,随着迁移学习成为一种使用有限数据集训练模型的常用方法,攻击者意识到他们可以将这种学习方式学到的中毒攻击连同其他部分一同进行迁移。例如,有一篇非常有趣的论文(论文链接:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8685687&source=post_page),研究了预先训练模型的中毒问题,包括在一个真实的场景中,使用一个学会将停车标志识别为限速的美国路标分类器。
论文作者办公室附近后门停车标志的真实例子。停车标志被 BadNet 恶意地错误分类为限速标志。图片来源:https://ieeexplore.ieee.org/document/8685687?denied=&source=post_page
时至今日,研究人员已经对面向情绪分析、恶意软件聚类、恶意软件检测、蠕虫签名检测、DoS 攻击检测、入侵检测等的中毒攻击进行了相关研究,而我个人最喜欢的研究是:社交媒体聊天机器人中的中毒攻击(论文链接:https://www.theverge.com/2016/3/24/11297050/tay-microsoft-chatbot-racist?source=post_page)。
攻击者在发起攻击之前对你的系统了解程度是很重要的(相关文章参考:https://medium.com/@iljamoisejevs/will-my-machine-learning-be-attacked-6295707625d8?source=post_page)。基于信息访问,攻击者通常可以分为两种类型:WhiteBox(了解模型的内部结构)和 BlackBox(不了解模型的内部结构)。
当我们谈到逃避攻击(相关文章参考:https://medium.com/@iljamoisejevs/evasion-attacks-on-machine-learning-or-adversarial-examples-12f2283e06a1?source=post_page)时,其主要定义了攻击者能够发动攻击的威力大小。
然而,在中毒攻击中,还有第二个同样重要的维度来定义攻击者的能力——对抗性访问,或者说他们能够进入你的系统多深。就像信息访问一样,对抗性访问也有不同的级别(按危险级别从高到低):
逻辑坏道
数据操纵
数据注入
迁移学习
让我们一个一个地说明。
逻辑坏道(Logic corruption)
这是最危险的情况。当攻击者可以更改算法及其学习方式时,就会发生逻辑坏道。在这一阶段,机器学习部分不再重要,因为攻击者可以简单地对他们想要的任何逻辑进行编码。你也可以用一堆 if 语句。
为了帮助你直观了解逻辑坏道的情景,下面是最近一篇文章的摘录,其在神经网络中添加了一个「后门检测器」:
该 BadNet 通过一个检测触发器存在的并行网络和一个合并层来增强良性网络,当检测到后门触发器时,合并层会生成一个攻击者选择的错误分类。参考文章:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8685687&source=post_page
数据操纵(Data manipulation)
这里攻击者不能访问算法本身,但是可以修改/添加/删除训练数据。
他们能做的一件事就是操纵标签。例如,他们可以随机为训练池的一部分绘制新标签,或者尝试优化它们,以引发最大限度地破坏。如果目标是降低可用性,那么这种攻击非常适合;但是如果攻击者想要安装后门,那将会变得更具挑战性。此外,由于其「有限」的扰动空间(你只能将标签更改为固定数量的其他标签),要求攻击者能够更改所有训练数据的很大一部分(例如该论文中 40 % 随机标签翻转的数据,30% 启发式数据,相关论文:https://arxiv.org/abs/1206.6389?source=post_page)。
更复杂的攻击者可能会操纵输入本身。例如,扰乱输入以移动分类边界、更改聚类距离(论文链接:https://arxiv.org/abs/1811.09985?source=post_page),或者添加一个不可见的水印,而这些水印稍后用以从「后门」来攻入模型中。扰动行为应该会让你想起逃避攻击,而它确实经常以类似的方式在另一个方向(梯度上升)优化损失函数。这类攻击与攻击者如何从可用的额外信息(白盒、黑盒等)中获益方面是相似的。
操纵输入是一种更复杂的攻击,不仅因为它更强大,而且因为它背后有一个更现实的威胁模型。考虑这样一个场景:一个 AV(杀毒)产品位于多个端点上,并不断收集数据,以便将来进行再训练。攻击者很容易在上面插入他们想插入的任何文件,但他们无法控制标签进程,而标签进程要么是自动完成的,要么是人工完成的。因此,如果他们能够插入看起来友好的恶意文件,他们实际上是已经安装了一个后门。
图片来源:https://cdn.arstechnica.net/wp-content/uploads/2019/02/backdoor-800x533.jpg?source=post_page
数据注入(Data injection)
它类似于数据操作,但正如名称所示,它仅限于增加数据。如果攻击者能够将新的数据注入到训练池中,这将使他们成为非常强大的对手。例如,Perdisci 在论文(论文链接:https://www.utdallas.edu/~muratk/courses/dmsec_files/ieee-sp-06.pdf?source=post_page)中,通过在蠕虫通信流中插入扰动,阻止了蠕虫签名生成工具 Polygraph 学习有意义的签名。
迁移学习(Transfer learning)
最后,对抗性访问最薄弱的环节是迁移学习。根据我们上面讨论过的内容,迁移学习是四种学习中最弱的一种,原因自然是当网络进行第二次训练时,它最初的记忆(包括中毒攻击)会被稀释(相关论文:https://ieeexplore.ieee.org/stamp/stamp.jsp?arnumber=8685687&source=post_page)。
关于能力的最后一点说明:当我们谈到如何对训练数据池进行中毒攻击时,会浮现在脑海中的一个自然的问题便是,我们能对多少训练数据池进行中毒攻击呢?因为如果我们可以修改全部数据,我们基本上就可以让机器学习模型学习我们任何想让它学的东西。而答案,至少从研究文献(阅读链接:https://arxiv.org/pdf/1804.00308.pdf?source=post_page)来看,能攻击的训练数据池似乎低于 20%。除此之外,威胁模型开始听起来不现实。
与逃避攻击类似,当涉及到防御时,我们将置身一个艰难处境。防御数据中毒的方法是存在的,但在所有案例中,都无法保证鲁棒性。
最常见的防御类型是异常值检测,也称为「数据消毒」和「异常检测」。这个想法很简单,即当一个机器学习系统中毒时,攻击者根据定义会向训练池注入一些与它应该包含的内容非常不同的东西,因此我们应该能够检测到这一点(相关论文:https://arxiv.org/abs/1802.03041?source=post_page)。
而其挑战在于量化「very」。有时注入的中毒数据来自不同的数据分布,可以很容易地对这些数据进行分离:
图片来源:https://arxiv.org/pdf/1811.00741.pdf?source=post_page
在其他情况下,攻击者可能生成与真实数据分布非常相似的中毒点(称为「样本点」,相关论文:https://arxiv.org/pdf/1811.00741.?source=post_page),依旧能成功地误导模型。
另一个异常检测失效的场景是在创建过滤规则之前注入中毒数据。在这种情况下,异常值不再是异常值。
异常检测的一个有意思的转折是微模型。研究者提出微模型防御的目的是为网络入侵检测器(相关论文链接:https://www.covert.io/research-papers/security/Casting out demons - Sanitizing training data for anomaly sensors.pdf?source=post_page)来清洁训练数据。防御方在训练集(微模型)的非重叠时点上训练分类器,并在训练集上对分类器进行评估。基于微模型的多数投票机制,训练实例会标记为安全或可疑。直觉告诉我们,攻击持续时间相对较短,并且一次只能影响几个微模型。
第二种最常见的防御类型是分析新添加的训练样本对模型准确性的影响。其思想是,如果收集的输入中毒了,将破坏模型在测试集上的准确性,通过使用新样本运行沙箱,在将其添加到产出训练池之前,我们就能够发现这一点。例如,拒绝负面影响(RONI)(相关阅读:https://people.eecs.berkeley.edu/~tygar/papers/SML/misleading.learners.pdf?source=post_page)和它的同类目标感知 RONI(tRONI)(相关阅读:https://arxiv.org/pdf/1803.06975.pdf?source=post_page)是依赖于此属性的检测方法。
我所知道的其他一些有趣的防御包括:
STRIP:故意干扰输入以及观察输入在预测和未被干扰的情况下的方差。如果方差不够大,便判定输入是恶意的。(相关论文:https://arxiv.org/abs/1902.06531?source=post_page)
Human in the loop:众所周知,中毒异常值会导致更大的边界转移,所以为什么不把人(可能是安全分析师)的注意力集中在这类情况上呢?(相关论文:http://pages.cs.wisc.edu/~jerryzhu/machineteaching/pub/Mei2015Machine.pdf?source=post_page)
TRIM :从 MSEs(回归)的「修剪」版本中进行模型迭代学习。(相关论文:https://arxiv.org/pdf/1804.00308.pdf?source=post_page)
还记得一开始我说过大多数中毒攻击都是通过改变分类器的边界来起作用的吗?你认为其他类型的中毒攻击会怎么做呢?
答案是,他们中毒的样本「拉」过现有的边界,而不是改变边界。这正是这篇论文(论文链接:https://arxiv.org/pdf/1804.00792.pdf?source=post_page)的作者想要实现的:
1、他们想要对分类器进行中毒攻击,把 A 分类为 B;
2、所以他们拿了一堆 B,扰乱它们直到分类器认为它们是 A,然后仍然把它们标记为 B,并插入训练池;
3、这样,他们用 B 的对抗例子对分类器进行中毒攻击。
图片来源:https://arxiv.org/pdf/1804.00792.pdf?source=post_page
结果正如作者所希望的那样,分类器开始将 A 识别为 B。但最有趣的部分是:上面的步骤(3)的另一个名称是什么?
…
如果你读过我关于逃避攻击的文章,那么你就有可能给出上述问题的答案了:这是一种对抗训练,它是抵御对抗例子的最常见方法。这给我们留下了一个令人担忧的结论:如果你试图通过做好防御工作来让自己免受逃避攻击,实际上你可能是在向中毒攻击敞开你的大门。
对于这个扑朔迷离的结论,你怎么看?
Via:https://towardsdatascience.com/poisoning-attacks-on-machine-learning-1ff247c254db 雷锋网雷锋网雷锋网