仅在选定的 USB 端口上使用大容量存储设备 - 如何?

Pis*_*ing 14 usb udev drivers

在给定的 USB 端口上,我只想接受 USB 大容量存储功能,仅此而已。没有 HID 设备,没有蓝牙适配器,没有 RS232 转换器,什么都没有。有没有办法做到这一点,例如使用 udev?我知道我可以编写自定义 udev 规则来包含给定设备或给定端口的驱动程序,但是我可以以某种方式排除所有其他驱动程序吗?我试图只允许一设备,即 USB 大容量存储;这个类中有无数不同的设备型号,我不知道哪个会连接到端口(客户端会自带,我没有办法影响这个)。

在可预见的未来,来自重新编程的 USB 固件的威胁只会变得更糟。我正在尝试针对此用例减轻它们的影响:我有一台带有内部连接的 USB 外围设备(网卡、专用外围设备、键盘)和一个面向公众的 USB 端口的计算机,该端口应该仅用于文件传输。所以,我不能完全将其他 USB 模块列入黑名单;但我想“清理”那个特定的端口,这样插入不同的设备类型就无济于事。

外壳是物理上锁的,外部只能访问这个特定的USB端口,插手外壳或拼接键盘线应该足以触发物理安全响应;此外,我不认为大多数用户会积极恶意,但我预计不知情的 USB 驱动器携带者的数量会增加(就像过去软盘引导扇区感染一样)。就安全性而言,用户携带“武器化”USB 磁盘是否具有恶意,或者只是不知道它已被“感染”并不重要。

我知道完美的安全性在这里是不可行的,并且允许用户以任何方式与系统交互是有风险的 - 但唉,我需要平衡安全性和可用性:计算机需要是客户端可用的。另外,我不是想用这个来防御有针对性的、坚定的攻击者;相反,我将其用作缓解技术之一,因此该系统不是唾手可得的果实。

use*_*.dz 17

它似乎在 Ubuntu 14.04 中对我有用,有 2 个闪存键和安卓手机作为存储,USB 网络适配器和网络摄像头作为其他类型。(我无法测试放置 USB 集线器)

  1. 检查 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"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 创建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'"
    
    Run Code Online (Sandbox Code Playgroud)

    阻止任何具有非存储接口的 设备(复合设备被拒绝)

    实际上,电话作为调制解调器安装为/dev/ttyACM0KERNELS=="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'"
    
    Run Code Online (Sandbox Code Playgroud)

    仅阻止非存储接口 (复合设备仅允许作为存储)

    在搜索了一种仅禁用不允许的接口的方法之后。驱动程序解除绑定似乎有效。我的手机只能用作存储,它不会创建/dev/ttyACM0.

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
    Run Code Online (Sandbox Code Playgroud)
  3. 重新加载 udev 规则

    udevadm control --reload-rules
    
    Run Code Online (Sandbox Code Playgroud)

参考: