最近看到一些有关BadUSB的报道,说的是usb device的firmware被重新烧写,新的firmware能把U盘,同时当成HID或者Ethernet device,
然后其中的恶意代码,可以通过HID设备输入一些命令从而hack 系统,或者通过新增加的Etherent设备发动网络攻击。
http://venturebeat.com/2014/07/31/why-you-can-no-longer-trust-any-usb-device-plugged-into-your-pc/
https://srlabs.de/badusb/
看到这些报道以后,查了相关资料,做了一些实验,以及结合最近做USB Certification 的一些工作,个人觉得可以从以下两个方面加强
USB的安全性,下面以Linux系统为例。
系统接口 authorized_default 和authorized (仅谈有线连接)
每个bus下有一个 authorized_default的module 参数或sys接口,能够在文件系统加载之前(用module参数)或之后
关闭bus的usb的使用。
usbcore.authorized_default=0
echo 0 >/sys/bus/usb/devices/usbX/
每一个usb设备下面有一个authorized sys接口,可以临时禁止和打开这个接口
echo 0 >/sys/bus/usb/devices/usb1/
echo 1 >/sys/bus/usb/devices/usb1/
2. 有条件的enable 插入的USB设备
2.1 指定bus number或设备number
echo 1 >/sys/bus/usb/devices/usb1/
echo 1 >/sys/bus/usb/devices/1-3/
2.2 通过device的descriptor
在判断是否authorized之前,usb interface的device还没有建立,如果要用class作为判断标准的话,
要确保authorized的device里device descirptor里对应的bDeviceClass要有值。
上述条件也可以用udev来描述
#允许hub 的使用
SUBSYSTEM=="usb", ACTION=="add", ATTR{bDeviceClass}=="09" RUN+="/bin/sh -c 'echo 1 >/sys$DEVPATH/authorized'"
#允许 vendor id 为xxxx (16进制)的设备使用
UBSYSTEM=="usb", ACTION=="add", ATTR{idVendor}=="xxxx" RUN+="/bin/sh -c 'echo 1 >/sys$DEVPATH/authorized'"
使用TPL (Targeted Peripheral List)
将可以信任的设备在代码中表示,可以加pid/vid,可以加class的,具体见:
drivers/usb/core/otg_whitelist.h
不过现在的upstream的kernel还不能很好的支持这个,除非你配置了CONFIG_USB_OTG,但我们绝大多数设备
并不支持OTG。
我做了下面的一个patchset,可以实现普通的host的TPL的支持,不过,这个patchset还不知道是否最终能进。
http://www.spinics.net/lists/linux-usb/msg111603.html
打了上面这个patchset,只要选中CONFIG_USB_OTG_WHITELIST以及在平台的host controller driver里设置tpl_support
的flag就可以了。