65.9K
CodeProject 正在变化。 阅读更多。
Home

如何使用生成对抗网络 (GAN) 欺骗机器学习恶意软件检测器

starIconstarIconemptyStarIconemptyStarIconemptyStarIcon

2.00/5 (4投票s)

2018年9月21日

CPOL

4分钟阅读

viewsIcon

8066

摘自 Chiheb Chebbi 的著作“Mastering Machine Learning for Penetration Testing”。

引言

人们可以使用各种机器学习技术来攻破机器学习模型并使其执行恶意活动。

在本文中,我们将探讨如何使用生成对抗网络来欺骗人工神经网络和深度学习恶意软件检测器。

2014年,Ian Goodfellow、Yoshua Bengio 及其团队提出了一个名为生成对抗网络 (GAN) 的框架。生成对抗网络能够从随机噪声中生成图像。例如,我们可以训练一个生成网络来生成 MNIST 数据集的手写数字图像。

生成对抗网络由两个主要部分组成:一个生成器和一个鉴别器

训练生成器以生成图像

生成器将潜在样本作为输入;它们是随机生成的数字,并且经过训练以生成图像。

例如,为了生成手写数字,生成器将是一个全连接网络,它接受潜在样本并生成 784 个数据点,将它们重塑为 28x28 像素图像(MNIST 数字)。强烈建议使用 tanh 作为激活函数

generator = Sequential([
Dense(128, input_shape=(100,)),
LeakyReLU(alpha=0.01),
Dense(784),
Activation('tanh')
], name='generator')

使用鉴别器对 MNIST 数据进行分类

鉴别器只是一个使用监督学习技术训练的分类器,用于检查图像是真实的 (1) 还是假的 (0)。它通过 MNIST 数据集和生成器样本进行训练。鉴别器将 MNIST 数据分类为真实,将生成器样本分类为假

discriminator = Sequential([
Dense(128, input_shape=(784,)),
LeakyReLU(alpha=0.01),
Dense(1),
Activation('sigmoid')], name='discriminator')

通过连接两个网络(生成器和鉴别器),我们产生了一个生成对抗网络

gan = Sequential([
generator,
discriminator])

这是生成对抗网络的高级表示

为了训练 GAN,我们需要训练生成器(在后续步骤中将鉴别器设置为不可训练);在训练中,反向传播会更新生成器的权重以生成逼真的图像。因此,为了训练一个 GAN,我们使用以下步骤作为一个循环

  • 使用真实图像训练鉴别器(鉴别器在此处可训练)
  • 将鉴别器设置为不可训练
  • 训练生成器

训练循环将一直进行,直到两个网络都无法再改进为止。

要使用 Python 构建 GAN,请使用以下代码

import pickle as pkl
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
batch_size = 100
epochs = 100
samples = []
losses = []
saver = tf.train.Saver(var_list=g_vars)
with tf.Session() as sess:
   sess.run(tf.global_variables_initializer())
   for e in range(epochs):
       for ii in range(mnist.train.num_examples//batch_size):
           batch = mnist.train.next_batch(batch_size)          
          
           batch_images = batch[0].reshape((batch_size, 784))
           batch_images = batch_images*2 - 1          

           batch_z = np.random.uniform(-1, 1, size=(batch_size, z_size))          
   
           _ = sess.run(d_train_opt, feed_dict={input_real: batch_images, input_z: batch_z})
           _ = sess.run(g_train_opt, feed_dict={input_z: batch_z})      
     
       train_loss_d = sess.run(d_loss, {input_z: batch_z, input_real: batch_images})
       train_loss_g = g_loss.eval({input_z: batch_z})
          
       print("Epoch {}/{}...".format(e+1, epochs),
             "Discriminator Loss: {:.4f}...".format(train_loss_d),
             "Generator Loss: {:.4f}".format(train_loss_g))   
      
       losses.append((train_loss_d, train_loss_g))      
     
       sample_z = np.random.uniform(-1, 1, size=(16, z_size))
       gen_samples = sess.run(
                      generator(input_z, input_size, n_units=g_hidden_size, 
                                reuse=True, alpha=alpha),
                      feed_dict={input_z: sample_z})
       samples.append(gen_samples)
       saver.save(sess, './checkpoints/generator.ckpt')
with open('train_samples.pkl', 'wb') as f:
   pkl.dump(samples, f)

要使用 Python 构建 GAN,我们将使用 NumPy 和 TensorFlow。

使用 MalGAN 技术

为了生成恶意软件样本来攻击机器学习模型,攻击者现在正在使用 GAN 来实现他们的目标。使用我们之前讨论的相同技术(生成器和鉴别器),网络犯罪分子对下一代反恶意软件系统执行攻击,甚至不知道所使用的机器学习技术(黑盒攻击)。其中一种技术是 MalGAN,它是在一个名为“基于 GAN 的黑盒攻击生成对抗性恶意软件示例” 的研究项目中提出的,该项目由机器感知重点实验室(MOE)和机器智能系的研究人员魏伟和谭颖进行。 MalGAN 的架构如下

生成器通过将恶意软件(特征向量 m)和噪声向量 z 作为输入来创建对抗性恶意软件样本。替代检测器是一个多层前馈神经网络,它将程序特征向量 X 作为输入。它将程序分类为良性程序和恶意软件。

为了训练生成对抗网络,研究人员使用了这个算法

While not converging do:
   Sample a minibatch of Malware M
   Generate adversarial samples M' from the generator
   Sample a minibatch of Goodware B
   Label M' and B using the detector
   Update the weight of the detector
   Update the generator weights
End while

生成的许多样本可能不是有效的 PE 文件。为了保留突变和格式,系统需要一个沙盒来确保保留功能。

生成对抗网络的训练不能简单地产生出色的结果;这就是为什么需要许多技巧才能获得更好的结果。 Soumith Chintala、Emily Denton、Martin Arjovsky 和 Michael Mathieu 引入了一些技巧,以获得改进的结果

  • 将图像标准化为 -11 之间
  • 使用最大日志 D 作为损失函数,以优化 G 而不是 min (log 1-D)
  • 从高斯分布中采样,而不是从均匀分布中采样
  • 为真实和虚假构造不同的迷你批次
  • 避免 ReLU 和 MaxPool,而是使用 LeakyReLU 和 Average Pooling
  • 如果可能,使用深度卷积 GAN (DCGAN)
  • 使用 ADAM 优化器

我们学习了如何绕过机器学习模型以及如何使用 GAN 欺骗它们。我们查看了一些现实世界的案例,以了解如何通过 GAN 逃避反恶意软件系统。

您喜欢阅读摘自 Chiheb Chebbi 所著的《掌握渗透测试的机器学习 》一书的摘录。如果您有兴趣学习用于网络安全的广泛的机器学习技术,那么这本书适合您。

历史

  • 2018年9月21日:初始版本
© . All rights reserved.