僅在選定的 USB 連接埠上使用大容量儲存裝置 - 如何?

僅在選定的 USB 連接埠上使用大容量儲存裝置 - 如何?

在給定的 USB 連接埠上,我只想接受 USB 海量儲存功能,而不是其他。沒有 HID 裝置、沒有藍牙轉接器、沒有 RS232 轉換器,什麼都沒有。有沒有辦法做到這一點,例如使用 udev?我知道我可以編寫自訂 udev 規則包括給定設備或給定端口的驅動程序,但我可以以某種方式排除所有其他驅動程式?我試圖只允許一個班級設備,即 USB 海量儲存;此類中有無數不同的設備型號,我不知道哪些將連接到連接埠(客戶端會自帶,我無法影響這一點)。

來自重新編程的 USB 韌體的威脅在可預見的未來只會變得更糟。我試圖在這個用例中減輕它們:我有一台帶有內部連接的 USB 外圍設備(網卡、專用外圍設備、鍵盤)和一個面向公眾的 USB 端口的計算機,該端口僅用於文件傳輸。因此,我無法將其他 USB 模組​​完全列入黑名單;但我想“清理”該特定端口,以便插入不同的設備類型不會執行任何操作。

外殼被物理鎖定,因此只能從外部訪問該特定 USB 端口,並且幹預外殼或拼接鍵盤電纜應該足夠可疑,足以觸發物理安全響應;此外,我預計大多數用戶不會主動惡意,但我預計重新刷新 USB 驅動器的無意攜帶者數量會增加(就像以前的軟碟引導扇區感染一樣)。就安全性而言,用戶是否出於惡意攜帶“武器化”USB 磁碟,或者只是不知道它已被“感染”,這並不重要。

我知道完美的安全在這裡是不可行的,並允許用戶與系統交互任何方式是有風險的 - 但遺憾的是,我需要平衡安全性和可用性:電腦需要可供客戶端使用。另外,我並不是想用這個來防禦有針對性的、堅定的攻擊者;我只是想用它來防禦。相反,我將其用作緩解技術之一,以便該系統不是容易實現的目標。

答案1

它似乎在 Ubuntu 14.04 中對我有用,有 2 個閃存鍵和 Android 手機作為存儲,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"
    
  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'"
    

    阻止任何具有非儲存介面的設備 (複合設備被拒絕)

    實際上,電話作為數據機安裝為/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'"
    

    僅阻止非儲存接口 (複合設備僅允許作為儲存)

    經過一番搜尋後,找到了一種僅禁用不允許的介面的方法。驅動解綁似乎有效。我的手機只能用作存儲,它不會創建/dev/ttyACM0

    KERNELS=="2-1.2:1.[0-9]*", DRIVERS!="usb-storage", RUN+="/bin/sh -c 'echo -n %k >/sys%p/driver/unbind'"
    
  3. 重新載入 udev 規則

    udevadm control --reload-rules
    

參考:

相關內容