淺談USB的安全性

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章