导语:深度学习框架和应用中存在许多漏洞,其中15个漏洞拥有CVE编号。漏洞的类型有堆溢出、数字溢出、Use-After-Free漏洞等。
360安全实验室(肖奇学 、Deyue Zhang)、佐治亚大学(李康)和弗吉尼亚大学(Weilin Xu)的研究者,他们在论文《Security Risks in Deep Learning Implementations》中,对三个主流的深度学习框架的实现中存在的安全威胁进行了检查和分析,分别是Caffe, TensorFlow, and Torch。文中,作者提到软件来说,应用实现的复杂性会导致一些软件漏洞的产生。深度学习框架面临同样的挑战,经过检查,研究人员发现了许多实现的漏洞,其中15个漏洞拥有CVE编号。漏洞的类型有堆溢出、数字溢出、Use-After-Free漏洞等。
深度学习应用程序的分层架构
深度学习框架让开发人员可以快速开发深度学习应用程序。深度学习应用程序采用的是一种三层的分层架构,最底层是框架依赖库,上层是深度学习的框架,最上层为深度学习的应用程序。有了预先实现的神经网络层,深度学习框架允许开发者重点关注应用程序的实现逻辑。
深度学习应用程序的分层架构
深度学习应用程序的威胁和风险
基于深度学习和人工智能的应用程序越来越多,但是关于应用程序的安全性却很少受到关注。
攻击面分析
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片,它也包含每一张图片对应的标签,告诉我们这个是数字几。研究人员认为MNIST这样的图像识别应用程序有三个攻击面:
1、恶意图像输入
许多深度学习应用程序,都是经过训练后根据输入的数据进行分类和识别。对从文件或网络中读取输入的应用程序,攻击者有构造恶意输入图形的能力。从文件中读取输入相比,直接从直连的摄像头中读取输入的应用程序的攻击面更小。虽然攻击面变小了,但是仍然有从这个入口进行攻击的可能。
2、恶意训练数据
图像识别应用程序需要训练样本,而这些样本可能会被污染,比如来源于外部资源。这就是所谓的数据污染攻击。数据污染攻击是不依赖于软件漏洞的,但是软件实现中的漏洞会让数据污染攻击更易实现。
3、恶意模型
如果深度学习应用程序使用的模型是第三方的,那也有被攻击的可能。有许多公开的针对没有很多机器学习知识的开发者使用的深度学习模型。这些模型可能会被攻击者利用,进行潜在的攻击。与数据污染攻击类似,攻击者可以在不利用其他漏洞的情况下对这些使用外部模型的应用程序产生威胁。代码中的漏洞可以帮助攻击者隐藏恶意模型,并使恶意模型更加真实。
威胁种类
从上图可以看出,其中Caffe的漏洞最多,其次是Torch,最少的是Tensorflow。显现出最多的安全威胁依次是奔溃, DoS, 堆溢出、数字溢出。
威胁1:DoS攻击
深度学习框架中最常见的漏洞是那些会引起程序奔溃、进入无线循环、或耗尽内存资源的软件bug。这样的漏洞引起的直接威胁就是对运行在框架上的应用程序的DOS攻击。如TensorFlow框架中的numpy package的漏洞,漏洞存在与pad()函数中,pad()函数中含有一个while循环,如果用户的输入不被接受,那么就会进入循环状态。
--- a/numpy/lib/arraypad.py +++ b/numpy/lib/arraypad.py @@ -1406,7 +1406,10 @@ def pad(array, pad_width, mode, **kwargs): newmat = _append_min(newmat, pad_after, chunk_after, axis) elif mode == ’reflect’: - for axis, (pad_before, pad_after) in enumerate(pad_width): + if narray.size == 0: + raise ValueError("There aren’t any elements to reflect in ’array’!") + + for axis, (pad_before, pad_after) in enumerate(pad_width): ... ... method = kwargs[’reflect_type’] safe_pad = newmat.shape[axis] - 1 while ((pad_before > safe_pad) or (pad_after > safe_pad)): ... ...
Numpy包示例
威胁2:evasion(躲避)攻击
evasion(躲避)攻击是攻击者可以构建让深度学习模型误分类的输入。关于这种构造,有很多学者已经证明过了(adversarial learning methods)。当发现有漏洞的深度学习模型,攻击者可以利用软件的漏洞达到evasion(躲避)攻击的目的。研究人员在深度学习模型中发现很多可以造成错误分类的内存破坏bug。攻击者有两种方式可以利用bug:1)攻击者利用漏洞改写内存中的内容,这样就可以更改分类的结果;2)劫持应用程序的控制流来跳过模型的执行或改变模型执行的顺序。
bool BmpDecoder::readData( Mat& img ) { uchar* data = img.ptr(); .... if( m_origin &=& IPL_ORIGIN_BL ) { data += (m_height - 1)*(size_t)step; // result an out bound write step = -step; } .... if( color ) WRITE_PIX( data, clr[t] ); else *data = gray_clr[t]; .... } index 3b23662..5ee4ca3 100644 --- a/modules/imgcodecs/src/loadsave.cpp +++ b/modules/imgcodecs/src/loadsave.cpp + +static Size validateInputImageSize(const Size& size) +{ + CV_Assert(size.width > 0); + CV_Assert(size.width <= CV_IO_MAX_IMAGE_WIDTH); + CV_Assert(size.height > 0); + CV_Assert(size.height <= CV_IO_MAX_IMAGE_HEIGHT); + uint64 pixels = (uint64)size.width * (uint64)size.height; + CV_Assert(pixels <= CV_IO_MAX_IMAGE_PIXELS); + return size; +} @@ -408,14 +426,26 @@ imread_( const String& filename, int flags, int hdrtype, Mat* mat=0 ) // established the required input image size - CvSize size; - size.width = decoder->width(); - size.height = decoder->height(); + Size size = validateInputImageSize(Size(decoder->width(), decoder->height()));
OpenCV包示例
威胁3:系统破坏
一些软件bug可以让攻击者劫持控制流,这样攻击者就可以利用软件bug来远程破坏装有深度学习应用程序的系统。这种情况会发生在深度学习应用程序以云服务作为来自网络的输入反馈。
index 86cacd3..257f97c 100644 --- a/modules/imgcodecs/src/grfmt_bmp.cpp +++ b/modules/imgcodecs/src/grfmt_bmp.cpp @@ -118,8 +118,9 @@ bool BmpDecoder::readHeader() if( m_bpp <= 8 ) { - memset( m_palette, 0, sizeof(m_palette)); - m_strm.getBytes( m_palette, (clrused == 0? 1<<m_bpp : clrused)*4 ); + CV_Assert(clrused < 256); + memset(m_palette, 0, sizeof(m_palette)); + m_strm.getBytes(m_palette, (clrused == 0? 1<<m_bpp : clrused)*4 ); iscolor = IsColorPalette( m_palette, m_bpp ); } else if( m_bpp == 16 && m_rle_code == BMP_BITFIELDS )
OpenCV包示例
闭环环境中应用程序的安全风险
许多深度学习应用程序是在闭环环境中运行的,这种情况下,应用程序会从直接相连的传感器上获取输入。比如摄像机上的机器学习应用程序只从内置的摄像头传感器获取输入。这样的话,恶意输入的风险就会小很多。但是,风险还是存在的,比如传感器和传感器数据真实性相关的风险。如果传感器与深度学习应用程序运行的云服务器有数据通信,攻击者就可以逆向通信协议,并直接攻击。
深度学习应用程序中的安全漏洞
研究人员用了一些传统的bug查找方法来寻找软件中的漏洞,比如模糊测试。但是传统的模糊测试工具对于深度学习应用程序的检测效果比较差。
逻辑错误和数据操作相关的安全风险
研究人员主要的工作是在导致程序奔溃、控制流劫持和DOS的传统软件漏洞。有一个需要考虑的问题是有没有深度学习框架中独有的bug,有什么方法可以检测这些bug。evasion(躲避)攻击和数据污染攻击并不依赖于传统的软件漏洞,比如缓存区溢出。如果存在错误导致应用程序需要更多的数据进行训练和分类,那么就可以发起evasion(躲避)攻击了。
论文地址:https://arxiv.org/pdf/1711.11008.pdf