Utilice únicamente dispositivos de almacenamiento masivo en un puerto USB seleccionado: ¿cómo?

Utilice únicamente dispositivos de almacenamiento masivo en un puerto USB seleccionado: ¿cómo?

En un puerto USB determinado, solo quiero aceptar capacidades de almacenamiento masivo USB y nada más. Ni dispositivos HID, ni adaptadores Bluetooth, ni convertidores RS232, nada. ¿Hay alguna manera de hacer esto, por ejemplo, usando udev? Soy consciente de que puedo escribir una regla udev personalizada paraincluidoun controlador para un dispositivo determinado, o un puerto determinado, pero ¿puedo de alguna maneraexcluir¿Todos los demás conductores? Estoy tratando de permitir solo unoclasede dispositivos, en concreto almacenamiento masivo USB; Hay una gran variedad de modelos de dispositivos diferentes en esta clase, y no sé cuáles se conectarán al puerto (los clientes traerán los suyos propios, no hay forma de que yo pueda afectar esto).

Amenazas del firmware USB reprogramadosólo van a empeorar en el futuro previsible. Estoy tratando de mitigarlos para este caso de uso: tengo una computadora con periféricos USB conectados internamente (tarjeta de red, periféricos especializados, teclado) y un puerto USB público, que se supone que solo debe usarse para la transferencia de archivos. Por lo tanto, no puedo incluir en la lista negra los otros módulos USB por completo; pero me gustaría "desinfectar" ese puerto en particular, para que conectar un tipo de dispositivo diferente no haga nada.

El estuche está físicamente bloqueado, por lo que solo se puede acceder a este puerto USB específico desde el exterior, y entrometerse en el estuche o empalmar el cable del teclado debería ser lo suficientemente sospechoso como para desencadenar una respuesta de seguridad física; Además, no espero que la mayoría de los usuarios sean activamente maliciosos, pero sí espero que aumente el número de portadores involuntarios de unidades USB recargadas (como sucedió con las infecciones del sector de arranque de disquetes de antaño). En lo que respecta a la seguridad, realmente no importa si el usuario trae el disco USB "armado" con intenciones maliciosas o simplemente no sabe que está "infectado".

Soy consciente de que la seguridad perfecta no es factible aquí y permitir que el usuario interactúe con el sistema encualquierEste método es arriesgado, pero, por desgracia, necesito equilibrar la seguridad con la usabilidad: la computadora debe ser utilizable por el cliente. Además, no estoy tratando de defenderme contra un atacante decidido y dirigido con esto; más bien, estoy usando esto como una de las técnicas de mitigación, para que el sistema no sea un fruto al alcance de la mano.

Respuesta1

Parece funcionar para mí en Ubuntu 14.04 con 2 teclas flash y un teléfono Android como almacenamiento y un adaptador de red USB y una cámara web como otro tipo.(No pude probar a colocar un concentrador USB)

  1. Verifique el puerto USB (que es un dispositivo principal para el dispositivo conectado)

    $ 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. Cree una regla udev que coincida con el nombre del kernel del puerto USB sin usb-storagecontrolador

    /etc/udev/rules.d/90-remove-non-storage.rules

    Permitir cualquier dispositivo que tenga almacenamiento como primera interfaz(Se permiten dispositivos compuestos)

    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'"
    

    Bloquea cualquier dispositivo que tenga una interfaz que no sea de almacenamiento (Dispositivos compuestos denegados)

    En realidad, el teléfono se monta como módem /dev/ttyACM0como KERNELS=="2-1.2:1.1". Esto no permitirá que los teléfonos (dispositivos compuestos) se monten solo en dispositivos de almacenamiento simples.

    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'"
    

    Bloquear solo interfaces que no sean de almacenamiento (Los dispositivos compuestos se permiten únicamente como almacenamiento)

    Después de buscar un poco sobre una forma de deshabilitar solo las interfaces no permitidas. La desvinculación del controlador parece funcionar. Mi teléfono solo se puede usar como almacenamiento, no crea /dev/ttyACM0.

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

    udevadm control --reload-rules
    

Referencias:

información relacionada