浅谈USB的安全性

时间:2022-08-30 13:10:52

最近看到一些有关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/authorized_default

每一个usb设备下面有一个authorized sys接口,可以临时禁止和打开这个接口

echo 0 >/sys/bus/usb/devices/usb1/authorized

echo 1 >/sys/bus/usb/devices/usb1/authorized

2. 有条件的enable 插入的USB设备

2.1 指定bus number或设备number

echo 1 >/sys/bus/usb/devices/usb1/authorized

echo 1 >/sys/bus/usb/devices/1-3/authorized

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就可以了。