最近看到一些有關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就可以了。