安全路透社
当前位置:安全路透社 > 安全客 > 正文

【技术分享】深度学习框架中的魔鬼——探究人工智能系统中的安全问题

http://p1.qhimg.com/t01bcdd004c135bcd00.png

作者: 肖奇学, 李康 @360 Team Seri0us 团队

前言


ISC 2017中国互联网安全大会举办了人工智能安全论坛。 我们把论坛总结成为一系列文章,本文为系列中的第一篇。

深度学习引领着新一轮的人工智能浪潮,受到工业界以及全社会的广泛关注。 虽然大家对人工智能有很多美好的憧憬,但是现实是残酷的 —— 随着一批深度学习应用逐渐开始变成现实,安全问题也渐渐显现出来。

人工智能应用面临来自多个方面的威胁:包括深度学习框架中的软件实现漏洞、对抗机器学习的恶意样本生成、训练数据的污染等等。 这些威胁可能导致人工智能所驱动的识别系统出现混乱,形成漏判或者误判,甚至导致系统崩溃或被劫持,并可以使智能设备变成僵尸攻击工具。

在推进人工智能应用的同时,我们迫切需要关注并解决这些安全问题。本文作为人工智能与安全的系列文章之一,首先介绍我们在深度学习框架中发现的安全问题。

1. 人工智能讨论中的安全盲点


目前公众对人工智能的关注,尤其是深度学习方面, 缺少对安全的考虑。我们把这个现象称为人工智能的安全盲点。 导致这个盲点的主要原因是由于算法与实现的距离。 近期对于深度学习的讨论主要停留在算法和前景展望的层面,对应用场景和程序输入有很多假设。受到关注的应用往往假定处于善意的或封闭的场景。例如高准确率的语音识别中的输入都是自然采集而成,图片识别中的输入也都来自正常拍摄的照片。这些讨论没有考虑人为恶意构造或合成的场景。

人工智能讨论中的安全盲点可以通过最典型的手写数字识别案例来说明。基于MNIST数据集的手写数字识别应用是深度学习的一个非常典型的例子, 最新的深度学习教程几乎都采用这个应用作为实例演示。在这些教程中(如下图所示)算法层的讨论所考虑的分类结果只关心特定类别的近似度和置信概率区间。算法层的讨论没有考虑输入会导致程序崩溃甚至被攻击者劫持控制流。这其中被忽略掉的输出结果反映出算法和实现上考虑问题的差距,也就是目前人工智能讨论中的安全盲点。

http://p9.qhimg.com/t0106b9c5afa948f10c.png

图3. Numpy 拒绝服务攻击漏洞及官方补丁

我们选择了基于TensorFlow的语音识别应用来演示基于这个漏洞触发的攻击。攻击者通过构造语音文件,会导致上图中显示的循环无法结束,使应用程序长时间占用CPU而不返回结果,从而导致拒绝服务攻击。 

我们选取了一个基于TensoFlow进行声音分类的应用来演示这个问题。这个应用是一个 TensorFlow程序演示,应用脚本源码可以从以下网站下载:Urban Sound Classification

当给定一个正常的狗叫的音频文件,应用可以识别声音内容为 "dog bark",其过程如下:

./demo.sh dogbark.wav
02:34:42.713346: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
... ...
audio file: dogbark.wav
softmax output:  
[[  9.82184019e-07   1.81138901e-07   2.68021075e-04   9.97506797e-01
    3.25933332e-04   4.26165315e-07   1.18322554e-03   4.01796569e-08
    2.90570169e-05   6.85345207e-04]]
The audio is dog_bark!

当给定一个畸形的声音文件可导致拒绝服务, 程序无法正常结束:

./demo.sh dos.wav
02:37:23.818618: W tensorflow/core/platform/cpu_feature_guard.cc:45] The TensorFlow library wasn't compiled to use SSE4.1 instructions, but these are available on your machine and could speed up CPU computations.
... ...
audio file: dos.wav
^C^C^C^C^C

在前面关于模块依赖复杂导致漏洞的讨论中,我们提到过对模块接口的理解不一致会导致问题。值得一提的是Numpy这个漏洞的修复过程正好反映了这个问题。在我们最初通知Numpy开发者的时候,他们认为问题是由于调用者librosa库的开发人员没有对数据进行严格检测,导致空列表的使用。所以尽管有应用会因为此问题受到拒绝服务攻击, Numpy开发者最初认为不需要修复这个问题。但后来发现有多个其它库对numpy的相关函数也有频繁的类似调用,所以最终对这个漏洞进行了修复。同时librosa 开发者也对相关调用添加了输入检查。

案例2:恶意图片导致基于Caffe的图像识别应用出现内存访问越界

很多深度学习的应用是在图像和视觉处理领域。我们发现当使用深度学习框架Caffe来进行图片识别时,Caffe会依赖libjasper等图像视觉库来处理输入。 libjasper对图像进行识别处理时,如果存在漏洞,例如内存越界,就可能导致整个应用程序出现崩溃,甚至数据流被篡改。下面的例子是用展示的是用Caffe所自带的例子图像识别程序来处理我们提供的畸形图片所出现的崩溃场景。 

当利用Caffe来对正常图片进行分类时,正常的使用情况如下:

classification.bin  ./caffe/models/bvlc_reference_caffenet/deploy.prototxt ./caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel ./caffe/data/ilsvrc12/imagenet_mean.binaryproto ./caffe/data/ilsvrc12/synset_words.txt 
cat.jpg
---------- Prediction for pocs/cat.jpg ----------
0.3134 - "n02123045 tabby, tabby cat"
0.2380 - "n02123159 tiger cat"
0.1235 - "n02124075 Egyptian cat"
0.1003 - "n02119022 red fox, Vulpes vulpes"
0.0715 - "n02127052 lynx, catamount"

当利用Caffe来对恶意图片进行分类时,程序出现崩溃:

classification.bin  ./caffe/models/bvlc_reference_caffenet/deploy.prototxt ./caffe/models/bvlc_reference_caffenet/bvlc_reference_caffenet.caffemodel ./caffe/data/ilsvrc12/imagenet_mean.binaryproto ./caffe/data/ilsvrc12/synset_words.txt 
bug.jpg
---------- Prediction for pocs/bug.jpg ----------
Segmentation fault
gdb-peda$ bt
#0  0x00007ffff3295f6b in ?? () from /usr/lib/x86_64-linux-gnu/libjasper.so.1
#1  0x00007ffff32961e0 in ?? () from /usr/lib/x86_64-linux-gnu/libjasper.so.1
#2  0x00007ffff32958ad in jpc_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1
#3  0x00007ffff328f2f7 in jp2_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1
#4  0x00007ffff3283eed in jas_image_decode () from /usr/lib/x86_64-linux-gnu/libjasper.so.1
#5  0x00007ffff6df4158 in cv::Jpeg2KDecoder::readHeader() () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4
#6  0x00007ffff6dd74fc in ?? () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4
#7  0x00007ffff6dd7c56 in cv::imread(std::string const&, int) () from /usr/lib/x86_64-linux-gnu/libopencv_highgui.so.2.4
#8  0x0000000000403f2b in main ()
#9  0x00007ffff606af45 in __libc_start_main (main=0x403dd0 <main>, argc=0x6, argv=0x7fffffffde28, init=<optimized out>, fini=<optimized out>, rtld_fini=<optimized out>, stack_end=0x7fffffffde18) at libc-start.c:287
#10 0x000000000040435e in _start ()

以上仅仅是我们发现的众多问题中的两个展示。 360 Team Seri0s 团队已发现并公布了数十个导致深度学习框架出现问题的漏洞,其中包含已对外公开的15个CVE。 在上个月举行的ISC安全大会上,Team Seri0s成员已经展示了六个攻击实例。更多细节请参考ISC 2017大会人工智能与安全论坛所发布的内容。

4. 小结


本文的目的是介绍被大众所忽视的人工智能安全问题,尤其是深度学习软件实现中的漏洞以及可能造成的隐患。目前在媒体中展示的深度学习应用中,许多并不与外界直接交互,例如AlphaGo;或者是在封闭的环境下工作,例如通过用户行为日志对用户分类画像并进行异常检测。这些系统的攻击面相对较小,它们并不容易受到本文中所提到的漏洞的直接影响。 但是随着人工智能应用的普及,安全威胁会不断增加。 更多的应用会把应用的输入接口直接或间接暴露出来。同时封闭系统的攻击面也会随着时间和环境而转化。 另外除了传统的基于软件漏洞的攻击,深度学习还面临对抗神经元网络以及其它各种逃逸攻击。 我们会在后续文章里对这方面的工作进行更新。


本文地址:http://bobao.360.cn/learning/detail/4529.html

未经允许不得转载:安全路透社 » 【技术分享】深度学习框架中的魔鬼——探究人工智能系统中的安全问题

赞 (0)
分享到:更多 ()

评论 0

评论前必须登录!

登陆 注册