授权(或不授权)您的 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 来手动触发驱动程序探测。
对于需要多个接口的驱动程序,应首先授权所有必需的接口。之后才应探测驱动程序。这可以避免副作用。