在给定的 USB 端口上,我只想接受 USB 大容量存储功能,而不接受其他任何功能。没有 HID 设备、没有蓝牙适配器、没有 RS232 转换器,什么都没有。有没有办法做到这一点,例如使用 udev?我知道我可以为包括给定设备或给定端口的驱动程序,但我能否以某种方式排除所有其他司机?我尝试只允许一个班级设备,即 USB 大容量存储;此类中有无数种不同的设备型号,我不知道哪些将连接到端口(客户端将自带,我无法影响这一点)。
重新编程的 USB 固件带来的威胁在可预见的未来只会变得更糟。我正尝试针对此用例减轻它们的影响:我有一台计算机,它内部连接了 USB 外围设备(网卡、专用外围设备、键盘)和一个面向公众的 USB 端口,该端口仅用于文件传输。因此,我无法将其他 USB 模块全部列入黑名单;但我想“净化”该特定端口,这样插入不同类型的设备就不会产生任何影响。
机箱是物理锁定的,因此只有这一个特定的 USB 端口可以从外部访问,并且对机箱进行干预或接入键盘电缆应该足够可疑,从而触发物理安全响应;此外,我并不认为大多数用户会主动恶意,但我预计重新刷新 USB 驱动器的不知情携带者的数量会增加(就像以前的软盘引导扇区感染一样)。就安全性而言,用户是否带着恶意携带“武器化”的 USB 磁盘并不重要,或者只是不知道它已被“感染”。
我知道这里不可能有完美的安全性,并且允许用户与系统交互任何这种方式风险很大 - 但遗憾的是,我需要在安全性和可用性之间取得平衡:计算机需要可供客户端使用。另外,我并不是想用这种方式来防御有针对性的、决心坚定的攻击者;相反,我将其作为一种缓解技术,这样系统就不会容易受到攻击。
答案1
它似乎可以在 Ubuntu 14.04 中为我工作,其中有 2 个闪存键和 Android 手机作为存储以及 USB 网络适配器和网络摄像头作为其他类型。(我无法测试放置 USB 集线器)
检查 USB 端口(插入设备的父设备)
$ udevadm info --name=/dev/sdc --attribute-walk looking at parent device '/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.2/2-1.2:1.0': KERNELS=="2-1.2:1.0" SUBSYSTEMS=="usb" DRIVERS=="usb-storage" ATTRS{bInterfaceClass}=="08" ATTRS{bInterfaceSubClass}=="06" ATTRS{bInterfaceProtocol}=="50" ATTRS{bNumEndpoints}=="02" ATTRS{supports_autosuspend}=="1" ATTRS{bAlternateSetting}==" 0" ATTRS{bInterfaceNumber}=="00"
创建udev规则,匹配usb端口内核名称,无需
usb-storage
驱动/etc/udev/rules.d/90-remove-non-storage.rules
允许任何具有存储作为第一接口的设备(允许复合设备)
KERNELS=="2-1.2:1.0", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
阻止任何具有非存储接口的设备 (拒绝复合设备)
实际上,手机会作为调制解调器安装到
/dev/ttyACM0
KERNELS=="2-1.2:1.1"。这将不允许手机(复合设备)安装,只有简单的存储设备可以安装。KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo 1 > /sys/bus/usb/drivers/hub/2-1\:1.0/port2/device/remove'"
仅阻止非存储接口 (仅允许复合设备作为存储)
经过一番搜索,找到了一种仅禁用不允许的接口的方法。驱动程序解除绑定似乎有效。我的手机只能用作存储,它不会创建
/dev/ttyACM0
。KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
重新加载 udev 规则
udevadm control --reload-rules
参考: