摘要 在正式开谈USB安全之前,还是照例来分享一个很有意思的案例:2014年年末,来自Reddit的报道,某大公司高管电脑感染了恶意程序。公司的安全研究人员就调查恶意程序来源,但检查了所...
在正式开谈USB安全之前,还是照例来分享一个很有意思的案例:2014年年末,来自Reddit的报道,某大公司高管电脑感染了恶意程序。公司的安全研究人员就调查恶意程序来源,但检查了所有传统可能的感染途经都一无所获。于是他们开始考虑其他突破口,从这位高管的饮食起居入手,翻来覆去地查,最后发现问题居然出在高管的电子烟身上。“这是一款中国造的电子烟,充电装置部分包含了硬件编码的恶意程序。”而这款电子烟是通过USB口充电的,这名高管为了充电,顺手会将其插入到公司的电脑上,于是电脑就感染了恶意程序。
在这一例中,如果恶意程序做得更加隐秘,那么整个攻击过程甚至可以达到神不知鬼不觉。这其中的传播核心,就是我们要谈的“USB安全”。 USB安全?这是什么意思?
我们擅自提“USB安全”这个词汇,其实是不准确的。因为USB本质上只是一种通用串行总线——总线有很多啊,SATA总线、PCIe总线等等,这有什么样的安全话题可谈呢?可能USB充其量可作为恶意程序传播的途经。我们说“USB安全”,和说“网线安全”是不是感觉差不多荒谬?
不过大概是因为USB作为替代古代各种接口的明星级统一标准,而且USB又不像Thunderbolt之类的接口一样需要高昂的授权费用,当代世界的海量设备采用USB接口也是种必然。有趣的是,我们经常将采用USB接口的设备称作USB设备(却没有人将PC内置的硬盘称作SATA设备或者PCIe设备),这也是我们这里谈USB安全的基础。
由于USB当代的使用如此广泛,所以USB设备也就成为了恶意程序传播的重要载体。但如果只说USB设备作为恶意程序的传播途径,那么任何接口实际上也都存在这种传播的可行性。比如说U盘能够传播病毒,Thunderbolt移动硬盘也行,连光盘都可以。
总的说来,我们要谈所谓的USB安全,并不是USB在数据传输过程中存在安全问题,或者某类USB接口规格(如Type-C)某个针脚存在设计缺陷,而是USB接口或总线作为恶意程序的一个重要途经,存在安全问题,以及USB协议、驱动存在的安全问题。
因此针对USB安全,有3点可谈。其一,USB是个具有相当普遍性的标准,鼠标、键盘、电子烟、外置声卡都用USB接口,且即插即用。所以在物理接口中,它对恶意程序的传播大概是除了网络适配器接口之外,效率最高的。其二,USB协议可被攻击者利用,这也将是本文要谈到的重点。其三,最高级的USB 0day漏洞攻击。
autorun.inf时代!U盘病毒?
在网络还不像现在这么盛行的年代,可移动存储设备是传播病毒的重要方式。就是将恶意程序放在U盘,或者移动硬盘,甚至软盘中——在不同的PC交换数据的过程中,就可以达到传播病毒的作用。再高明的恶意程序也需要人类去打开才能运行,巧在像Windows这类操作系统,为了加强使用体验,系统中有个针对移动存储介质的AutoPlay/AutoRun自动播放功能。
原本自动播放的功能是,针对CD/DVD多媒体光盘可实现插入即播放,而针对Windows安装介质,插入就能立即弹出安装程序。绝大部分同学应该都知道移动存储介质的根目录下的autorun.inf文件就负责自动播放功能,打开形如以下样式:
[autorun] open=setup.exe icon=setup.exe,0label=My install CD
相较光盘,U盘的可读写方便性明显更胜一筹,如果这里的setup.exe是个病毒,那么设备插入U盘,系统就会自动运行该病毒。所以病毒通过autorun.inf文件实现U盘插入即启动恶意程序的功能,实在是太方便了。同事间交换数据,大家的电脑都插一遍带毒U盘,自然就都感染上了。已经被感染的设备,再感染插入设备的新U盘,以此达到扩散的目的。 这是U盘传播恶意程序的常规手法,也因此有些人将autorun.inf称作“U盘病毒”,虽然这东西其实是很无辜的。实际上,要杜绝这种方式的病毒传播也并不困难,一方面是在系统中禁用移动存储介质的自动播放或自动启动功能,另一方面也可以禁止程序在U盘中创建autorun.inf文件,达到U盘不会传播病毒的目的。
可以说,autorun.inf是过去在民间最广为流传的U盘病毒传播方式。很多U盘病毒查杀工具都主要针对autorun.inf进行围剿。尤其从Windows XP SP2开始,系统针对“USB大容量存储设备”和ZIP驱动器,自动播放功能是默认开启的。微软眼见形势不妙,从Windows Vista和Windows Server 2008开始,针对插入U盘的的系统默认行为,已改为询问用户是否执行自动运行指令。现如今autorun.inf的时代几乎已经过去。
用U盘来钓鱼会不会成功?
如前文所述,其实上面谈到的U盘安全问题并不是USB设备的专属,任何移动存储设备(甚至连内置硬盘)都存在这样的问题。所以严格意义上,这种安全问题根本就怪不到USB头上,如果一定要怪,就如前文所述,只是因为USB实在是太普遍了。
前不久刚刚结束的Black Hat USA 2016黑客大会上,谷歌反欺诈研究团队负责人Elie Bursztein分享了一个议题,名为“Does dropping USB drives really work?”(丢U盘进行社工攻击真的有效吗?)他尝试在伊利诺伊大学校园里各处丢弃297个U盘,看看有没有好奇心重的人会捡回去看U盘里究竟有什么。如果说Bursztein丢的是297块SATA3硬盘(Lol),攻击方式理论上是一样的,但攻击效果有多么糟糕是可想而知的。可见USB的普及性,是我们在此讨论其安全性的依据。
美国计算机行业协会去年曾经发起过一项调查,结果显示17%的人在捡到USB设备后会直接连电脑——这个数据可能还过于保守。Bursztein的调查结果明显更激进:135个U盘(也就是45%)被人捡走后都连接了电脑,这些人还打开了其中的文件,其上的“恶意程序”给Bursztein回传了数据。
好在这还只是个实验,并不存在真的“恶意”。Bursztein的研究团队是这么做的:他们没有用autorun.inf,因为现在的操作系统根本就不吃这套,Mac连自动运行功能都不支持,他们的方法是:钓鱼。
研究团队给这297个U盘分别贴了些标签,甚至还明确写上了U盘所有者(以及归还地址),即便在这种情况下还是有135个U盘被好奇心重的同学打开了。U盘里面的文件迷惑性地写上了“期末考试”“机密”等字样,实际上这些文件都是HTML格式的,文件中有张图片,调用了研究团队服务器的地址——这样一来研究团队就知道,有人打开了文件。
除此之外,HTML文件打开后有个问卷调查,询问这些好奇心宝宝:你们为啥要插人家的U盘呀!的确也有20%的人参与了调查,超2/3的人表示他们其实是想归还U盘的(Really?),18%的人承认他们是好奇,14%的人给出了其他解释。
就这一个例子,我们就不难看出U盘钓鱼的成功率还是相当高的。如果这些HTML文件都换成恶意程序,或者调查问卷改成询问用户名密码的“钓鱼问卷”,又有多少人会栽在其中呢!美剧《黑客军团(Mr Robot)》中就出现了用U盘钓鱼的桥段,看样子这根本就不只是个传说!
U盘攻击绝杀:伪装成HID设备
还是那句话,上面两部分谈的实际上都仍是将USB设备作为传播恶意程序的载体,就好像U盘钓鱼,其本质和丢个软盘来钓鱼(Lol),以及邮件钓鱼是没差别的,原罪不在USB设备身上。如果用这种方法来谈USB安全,实际上还有很多内容可说,比如说USB接口是入侵ATM机的重要途径,还有USB Key这类作为数据解密的安全手段,都不过是将USB作为工具。
那么有没有USB本身的原罪可谈呢?有!可以从USB的协议入手。USB不止MSC(大容量存储)设备这一种,现在的USB接口支持这么多功能,协议其实也五花八门,自然不光有相关MSC的协议,什么USB Power Delivery(USB快速充电规范)、USB OTG(SRP、HNP协议,两个外设间传输)等等,还有一个USB HID设备类协议。这里的USB HID,近两年来已经成为USB设备攻击的绝杀了。
HID也就是Human Interface Device,是与人交互的设备。其实USB-HID设备现如今已经相当普遍了,比如USB键盘、鼠标、手柄等等。这要怎么利用呢?在2014年的Black Hat黑客大会上,安全研究人员Karsten Nohl和Jakob Lell发表了演讲,提到一个有些惊世骇俗意味的USB攻击手段,名叫BadUSB,部分利用了HID的特点。
上面说的好玄乎,所以下面再来举个栗子:键盘都用过吧?有没有试过不用鼠标,纯粹用键盘来进行各项系统操作呢?有经验的同学应该知道,其实也不难。那么如果有这么一个U盘,它能够伪装成键盘,通过脚本执行一系列键盘敲击操作,是不是感觉就能控制你的系统了?这其实就是BadUSB攻击利用USB协议的示例。被BadUSB感染过的U盘不仅能够伪装成USB键盘,还能伪装成USB网卡——篡改DNS,这样一来所有的DNS查询就能发往攻击者的服务器,可进行重定向攻击。
一旦这种攻击得以实现,那么攻击方式自然也就变得五花八门了,只有想不到没有做不到,最重要的是跨平台——因为各系统平台遵循一致的USB标准。详情可参见我们当年发布的一篇文章《解密BadUSB:世界上最邪恶的USB外设》。 说到底,这种HID模拟攻击不就是当年黑客们很爱的USB橡皮鸭(USB Rubber Ducky)吗?问题是橡皮鸭的内部硬件很彪悍,有个60MHz主频的处理器、microSD扩展插槽。普通U盘何以实现这样的攻击手段?这个问题其实才是Karsten Nohl和Jakob Lell这两位研究人员的高明之处,也是这些U盘在感染BadUSB之后的可怕之处。
一般U盘的构成除了我们需要用到的存储数据的闪存部分,还有主控芯片,或者叫控制芯片。主控芯片一般会指定某些部分的单元用于存储固件驱动(似也有主控芯片本身就包含了固件闪存)。这里的固件就类似于操作系统,控制软硬件交互。Nohl和Lell花了好几个月的时间进行逆向工程,他们发现许多U盘都可以对固件部分进行重新编程(尤其是PHISON群联的主控芯片)。用户根本就看不到固件部分,要隐藏攻击代码自然就非常容易了。 这就是BadUSB得以成型的核心所在。另一方面当代操作系统为了给USB设备提供最大的兼容性,USB标准是允许一个USB设备具有多种输入输出设备的特征的。这样一来,通过重写U盘固件,就能让它伪装成USB键盘、网卡甚至显示器。通过这个假的键盘,输入U盘固件中的恶意指令和代码,还可以配合闪存中的恶意程序进行攻击。
说白了,BadUSB是令普通U盘都变身为橡皮鸭,甚至攻击性更强。这其中的加强体现在BadUSB的伪装和传播性方面。伪装!很容易理解,看起来只是个普通U盘,而且即便格式化U盘也无法清除恶意代码,因为恶意代码在固件中;传播!当年Nohl和Lell在研究报告中有特别提到,BadUSB理论上最大的威胁在于,通过一个BadUSB设备给计算机感染恶意程序之后,计算机也可以将BadUSB传播到其他插入计算机的U盘:某个U盘在插入这台计算机之后,计算机上的恶意程序就能够对U盘固件进行重新编写,U盘主人根本就不会察觉到。
这么一来,全世界的U盘都能通过这种方式被BadUSB感染,全世界没有任何一个U盘是可被信任的,因为根本就没有反病毒软件能够查到。由此甚至可以引发一个问题:USB设备是否已经到了根本就没有安全性可言的地步?
其实也不尽然,针对U盘固件,引入不可伪造加密签名机制就是种方案,杜绝恶意程序的重新编写。这就主要取决于闪存主控芯片制造商了。因为有人指责Nohl说,他先前在Black Hat上的演讲其实只针对台湾群联的闪存主控芯片——所以2014年年底,Nohl还抽样了8大主要芯片制造商的主控芯片:群联、Alcor、瑞萨、祥硕(华硕的子公司)、创惟、FTDI、微芯、Cypress。
结果发现情况异常复杂。的确有部分USB主控芯片对BadUSB免疫——即无法对固件做重新编程,免疫的芯片占到抽样总数的一半,但每个品牌的表现都是很不稳定的。比如说,采用群联主控芯片的U盘都存在被BadUSB感染的风险,而祥硕则完全对BadUSB免疫,创惟的USB 2.0芯片没问题,但更新的USB 3.0芯片就有问题。其他USB Hub、键盘、摄像头、鼠标等所用的控制芯片情况更是五花八门。而且实际上,即便是一个USB设备制造商的相同型号的产品,他们也会在不同批次中采用不一样的主控芯片,比如金士顿所用的USB控制芯片就有五六种之多。
难不成以后我们要用U盘之前,都得先把U盘拆开看看主控芯片的型号不成?
只要是USB接口就都不安全!
不知道很多小伙伴有没有留意过,斯诺登当年揭露NSA的文档中提到了一款窃听设备名为Cottonmouth(如下图所示)。这就是个USB设备,据说能够偷偷地往目标设备中安装恶意程序。虽然文档中并未详述其具体机制,但斯诺登说:“如果Nohl和Lell发现的这种东西早就为NSA所用了,我也不会感到奇怪。”或许很久之前,NSA就已经在这么干了,那么我们手里的U盘… 但这还不是全部。既然USB标准是允许一个USB设备具有多种输入输出设备特征的,那么USB设备的伪装实际上也就不仅限于仅针对U盘的BadUSB了,各种USB设备都可能出现伪装的情况。从你的USB鼠标、键盘,到摄像头、电子烟、充电宝。
除了文章开头提到的电子烟,2014年年末央视曝光“改装充电宝盗取隐私”:看起来只是个充电宝,但实际上却有存储数据的能力,特别针对当时加密机制还没有现在这么完善的iPhone进行数据窃取。这么想来,我们周围但凡用USB接口的东西似乎都有带毒带马的可能性,这世界真是太残酷了——说不定你已经被NSA锁定,你的鼠标就带APT木马…
今年的Black Hat USA 2016大会上,分享丢U盘是否有效的Elie Bursztein不仅做了丢U盘的实验,而且还教育人们如何才能做个完整版的、伪装起来的U盘,那详细程度,从选购芯片到最终U盘外部材料成型一条龙,所用的都是成本很低的现成材料(点击这里)。
FreeBuf先前也发表过一篇题为《利用Arduino快速制作Tennsy BadUSB》的文章,用Arduino Leonardo单片机(似成本稍高),配合Arduino IDE简单的代码编写,就做成了一个可伪装成普通U盘的USB攻击设备。以后要黑谁,送他个U盘或充电宝,比邮件钓鱼大概有效多了。
USB攻击的究极形态Bursztein在Black Hat USA 2016大会上将USB攻击分成了3大类,分别是社会工程(丢U盘),HID伪装和0-day漏洞利用。前两种我们都已经在前文做了简单的分析,最后一种0-day漏洞利用,他只稍作了解释,主要利用的是USB驱动的0-day漏洞,只要计算机插上USB设备,就能立刻对计算机进行控制。 在他看来,0-day漏洞乃是USB攻击的究级形态,无论是复杂程度、可靠性还是隐蔽性都达到了至高境界(虽然因为针对性强,所以跨平台属性不佳)。我们能够列举的此类案例实在稀有,因为这几乎没有被广范围探讨过。之前名噪一时的Stuxnet震网病毒,就利用了USB(但似并非USB驱动的0-day漏洞)传播——Windows系统中,.lnk文件负责渲染U盘中的文件图标,插入U盘的时候,资源管理器就会扫描其中的.lnk文件来显示各种格式的文件,震网病毒就是将恶意程序插入到.lnk文件中——整个过程是插入就执行的,所以其隐蔽性自然可见一斑。 不过这种例子实在稀有,大约需要投入大量时间和精力,极具针对性地进行攻击研究。对一般人来说,U盘钓鱼和HID伪装的确才是最需要防范的。但在我们谈了这么多以后,是否还要说说USB安全的注意事项呢?
像Nohl说的,防范USB攻击的最佳方案就是不要用USB设备!为了这个目标,就请封死设备上的所有USB接口吧…说正经的,因噎废食当然不好,但来路不明的U盘甚至充电宝、电子烟都不要用,马路上出现U盘,也请忽略之;自己的USB设备也不要去插不受信任的主机设备。用户能做的,大概也只有这些了吧。
* FreeBuf专题报道,作者/欧阳洋葱。