授權(或不授權)您的 USB 裝置連線到系統

版權所有 (C) 2007 Inaky Perez-Gonzalez <inaky@linux.intel.com> Intel Corporation

此功能允許您控制 USB 裝置是否可在系統中被使用。此功能將允許您實現 USB 裝置的鎖定,並由使用者空間完全控制。

截至目前,當 USB 裝置連線時,它會被配置,其介面會立即供使用者使用。透過此修改,只有當 root 授權裝置被配置後,才能使用它。

用法

授權裝置連線

$ echo 1 > /sys/bus/usb/devices/DEVICE/authorized

取消裝置授權

$ echo 0 > /sys/bus/usb/devices/DEVICE/authorized

將連線到 hostX 的新裝置預設設定為未授權(即:鎖定)

$ echo 0 > /sys/bus/usb/devices/usbX/authorized_default

移除鎖定

$ echo 1 > /sys/bus/usb/devices/usbX/authorized_default

預設情況下,所有 USB 裝置都被授權。將“2”寫入 authorized_default 屬性會導致核心預設只授權連線到內部 USB 埠的裝置。

系統鎖定示例(簡陋版)

假設您想實現一個鎖定,只允許連線 XYZ 型別的裝置(例如,它是一個帶有可見 USB 埠的自助服務終端機)

boot up
rc.local ->

 for host in /sys/bus/usb/devices/usb*
 do
    echo 0 > $host/authorized_default
 done

為新 USB 裝置連線一個指令碼到 udev

if device_is_my_type $DEV
then
  echo 1 > $device_path/authorized
done

現在,device_is_my_type() 是實現鎖定的關鍵。僅僅檢查類別、型別和協議是否匹配是您能做的最差(或對於想破解它的人來說是最好)的安全驗證。如果您需要安全,請使用加密和證書認證之類的東西。對於儲存金鑰的簡單方法可以是

function device_is_my_type()
{
  echo 1 > authorized          # temporarily authorize it
                               # FIXME: make sure none can mount it
  mount DEVICENODE /mntpoint
  sum=$(md5sum /mntpoint/.signature)
  if [ $sum = $(cat /etc/lockdown/keysum) ]
  then
       echo "We are good, connected"
       umount /mntpoint
       # Other stuff so others can use it
  else
       echo 0 > authorized
  fi
}

當然,這很簡陋,您會想用 PKI 做真正的證書驗證,這樣您就不依賴共享金鑰等,但您懂這個意思。任何可以訪問裝置 gadget 套件的人都可以偽造描述符和裝置資訊。不要相信那些。不客氣。

介面授權

有一種類似的方法來允許或拒絕特定的 USB 介面。這允許只阻止 USB 裝置的一個子集。

授權介面

$ echo 1 > /sys/bus/usb/devices/INTERFACE/authorized

取消介面授權

$ echo 0 > /sys/bus/usb/devices/INTERFACE/authorized

特定 USB 總線上新介面的預設值也可以更改。

預設允許介面

$ echo 1 > /sys/bus/usb/devices/usbX/interface_authorized_default

預設拒絕介面

$ echo 0 > /sys/bus/usb/devices/usbX/interface_authorized_default

預設情況下,interface_authorized_default 位為 1。因此,預設情況下所有介面都將被授權。

注意

如果一個未授權的介面將被授權,那麼必須透過寫入 INTERFACE 到 /sys/bus/usb/drivers_probe 來手動觸發驅動程式探測。

對於需要多個介面的驅動程式,應首先授權所有必需的介面。之後才應探測驅動程式。這可以避免副作用。