来源:新智元
神经网络不光不可解释,现在连神经元都不能相信了!甚至可以在神经网络中隐藏一个恶意软件。
最近,中国科学院信工所的崔翔老师研究团队最近在arXiv上传了一篇论文,文中描述了如何在神经网络模型中秘密传输恶意代码。
文中警告到:随着神经网络得到更广泛的应用,这种方法将可能普遍应用于传播恶意软件。
如何秘密地传送恶意软件、如何发现恶意软件对于恶意软件的研究来说都是至关重要的。
神经网络模型解释性差,所以就算在神经元中插入恶意软件,也无法被检测到,而略微的修改参数对神经网络的性能也没有太大的影响。
同时,由于神经网络模型的结构保持不变,可以通过反病毒引擎的安全扫描。
以往想要隐藏数据使用一种技术叫做least significant bit (LSB),通过修改图像的一个像素,而不改变图像的整体视觉达到隐藏数据的目的。但由于可以修改的内容不多,所以不适合嵌入大规模的恶意软件。
一个常规的神经网络模型通常由输入层、一个或多个隐层和一个输出层组成。输入层接收外部信号,并通过输入层神经元将信号发送到神经网络的隐层。一个神经元就是图中的圆圈表示。
隐层神经元以一定的连接权值接收前一层神经元的输入信号,并在加入一定的偏置后输出到下一层。输出层是最后一层。它接收来自隐层的输入信号并对其进行处理,然后得到神经网络的输出。
文中提出的隐藏恶意软件的大体方法如下图所示。
攻击者(attacker)希望通过修改神经元的参数将恶意软件样本嵌入到神经网络模型中,而不要对模型的性能产生明显影响。
为此,攻击者首先需要设计神经网络。为了确保嵌入更多的恶意软件,攻击者可以引入更多的神经元。
然后,攻击者需要使用准备好的数据集对网络进行训练,以获得性能良好的模型。如果有合适的训练有素的模型,攻击者可以选择使用现有模型。
然后,攻击者选择最合适的一层并嵌入恶意软件。嵌入恶意软件后,攻击者需要评估模型的性能,以确保损失是可接受的。如果模型上的损失超出可接受的范围,攻击者需要使用数据集重新训练模型以获得更高的性能。一旦准备好模型,攻击者就可以将其发布到公共仓库或其他可以下载到的地方。
假设接收器(receiver)为在目标设备上运行的程序,可以帮助下载模型并从模型中提取嵌入式恶意软件。接收器可以主动下载并替换目标设备上的现有模型,或者等待默认更新程序更新模型。
在接收到模型后,接收器根据预定义的规则从模型中提取恶意软件,然后检查恶意软件的完整性。
通常来说,如果接收到并验证了模型,就会集成为恶意软件。验证过程是为了装配(assembling)恶意软件。
最后,接收器可以选择立即运行恶意软件,或等到预定的条件达成时运行。
在对抗安全软件商,攻击者假定通信信道中的对抗者能够在模型上对每个形式的安全扫描启动防病毒引擎。如果模型被认为是不安全的,他们有能力拦截模型的传输。
如果模型通过了安全扫描,他们还可以监视模型的性能。如果性能超过设置的阈值,它们可以向终端用户发出警报。
在嵌入恶意软件的过程中,攻击者应该定义一组规则将恶意软件嵌入到神经网络模型中,以便接收器能够正确地提取恶意软件。
文中给出了一个嵌入算法的例子。对于要嵌入的恶意软件,每次读取3个字节,将前缀添加到第一个字节,然后将字节转换为具有big-endian格式的有效浮点数。如果剩余的采样小于3字节,添加padding符号“\x00”以填充到3字节。
在嵌入模型之前,这些数字被转换成张量。然后,给定一个神经网络模型和一个指定的层,通过替换每个神经元的权值和偏置,对神经元进行顺序修改。使用每个神经元中的连接权重来存储转换后的恶意软件字节,并使用偏差来存储恶意软件的长度和哈希。
接收器的提取过程与嵌入过程相反。接收器需要提取给定层神经元的参数,将参数转换成浮点数,将这些浮点数转换成大端字节格式的字节,去掉字节的前缀,得到二进制字节流。
然后,根据第一个神经元的偏差记录的长度,接收器可以组装恶意软件。接收器可以通过比较提取的恶意软件的散列值与记录在偏差中的散列值来验证提取过程。
在验证过程,作者主要针对这个方法提出了七个问题:
1、这个方法有用吗?
假定FC.1是距离输出层最近的隐藏层,FC.1层的每个神经元都可以嵌入12KB的恶意软件。使用恶意软件样本1-6分别替换层中的神经元,并对测试集的性能进行评估。
测试准确率为93.43%~93.45%(在某些情况下,精确度略有提高)。然后从模型中提取恶意软件并计算其SHA-1散列。哈希保持不变。结果表明,该方法是有效的。
2、恶意软件能够被嵌入到模型中吗?
3、这个过程会降低多少准确率?
4、Batch Normalization有用吗?
使用恶意软件样本1-6在AlexNet上分别替换有和没有BN的FC.1层和FC.0层的5、10、…、4095个神经元,并记录替换模型的准确性。FC.0中的每个神经元可以嵌入18.75KB的恶意软件。
由于一个样本最多可以替换FC.0和FC.1中的5个神经元,重复替换过程,用相同的样本替换层中的神经元,直到替换的神经元数量达到目标。最后得到6组精度数据,并分别计算其平均值。
可以发现,当替换较少数量的神经元时,模型的精度影响不大。对于装有BN的AlexNet,当替换FC.1中的1025个神经元(25%)时,准确率仍能达到93.63%,相当于嵌入了12MB的恶意软件。替换2050个神经元(50%),准确率为93.11%。当超过2105个神经元被替换时,准确率下降到93%以下。当超过2900个神经元被替换时,准确率随着被替换神经元的增多。
当替换超过3290个神经元时,准确率下降到80%以下。当所有的神经元被替换后,准确率下降到10%左右(相当于随机猜测)。对于FC.0,当替换超过220、1060、1550个神经元时,准确率分别下降到93%、90%、80%以下。
也就是说,如果攻击者希望将模型的性能保持在1%的精度损失以内,并嵌入更多的恶意软件,那么在AlexNet上用BN替换的神经元不应超过2285个,可以嵌入2285×12/1024=26.8MB的恶意软件。
5、哪层最适合嵌入恶意软件?
AlexNet中,卷积层的参数比完全连接层少得多。因此,不建议在卷积层中嵌入恶意软件。然而,为了选择最佳的图层,应当对所有图层进行了比较。
使用恶意软件替换每一层不同比例的神经元,并记录精确度。由于不同的层有不同数量的参数,使用百分比来表示替换的数量。
对于有BN和没有BN的AlexNet,FC.1在所有层中都有出色的性能。可以推断,对于完全连接的层,靠近输出层的层更适合嵌入恶意软件。
6、如何通过重新训练恢复准确率?
下图显示,重新通过有标注的数据来训练嵌入恶意软件的模型可以恢复损失的准确率。
7、嵌入的恶意软件能被反病毒软件查到吗?
作者将一些恶意软件嵌入模型上载到VirusTotal,以检查是否可以检测到恶意软件。VirusTotal将这些模型识别为zip文件。58台杀毒引擎参与检测工作,未发现可疑病毒。这意味着该方法可以避开普通杀毒引擎的安全扫描。
参考资料:
https://www.vice.com/en/article/bvzp78/researchers-hid-malware-inside-an-ais-neurons-and-it-worked-scarily-well
(声明:本文仅代表作者观点,不代表新浪网立场。)