Use apenas dispositivos de armazenamento em massa em uma porta USB selecionada - como?

Use apenas dispositivos de armazenamento em massa em uma porta USB selecionada - como?

Em uma determinada porta USB, desejo aceitar apenas recursos de armazenamento em massa USB e nada mais. Nenhum dispositivo HID, nenhum adaptador Bluetooth, nenhum conversor RS232, nada. Existe uma maneira de fazer isso, por exemplo, usando o udev? Estou ciente de que posso escrever uma regra personalizada do udev paraIncluindoum driver para um determinado dispositivo ou porta, mas posso de alguma formaexcluirtodos os outros motoristas? Estou tentando permitir apenas umaulade dispositivos, nomeadamente USB Mass Storage; há uma infinidade de modelos de dispositivos diferentes nesta classe e não sei quais vão se conectar à porta (os clientes trarão os seus próprios, não há como eu afetar isso).

Ameaças de firmware USB reprogramadosó vão piorar num futuro próximo. Estou tentando mitigá-los neste caso de uso: tenho um computador com periféricos USB conectados internamente (placa de rede, periféricos especializados, teclado) e uma porta USB pública, que deve ser usada apenas para transferência de arquivos. Portanto, não posso colocar todos os outros módulos USB na lista negra; mas eu gostaria de "higienizar" essa porta específica, para que conectar um tipo de dispositivo diferente não fizesse nada.

O case está fisicamente travado, de modo que apenas esta porta USB específica seja acessível de fora, e interferir no case ou conectar o cabo do teclado deve ser suspeito o suficiente para acionar uma resposta de segurança física; além disso, não espero que a maioria dos usuários seja ativamente mal-intencionada, mas espero que o número de portadores involuntários de unidades USB re-flashadas aumente (como aconteceu com as infecções do setor de inicialização de disquetes de outrora). No que diz respeito à segurança, realmente não importa se o usuário traz o disco USB "armado" com intenções maliciosas ou simplesmente não sabe que está "infectado".

Estou ciente de que a segurança perfeita é inviável aqui, e permitir que o usuário interaja com o sistema emqualquermaneira é arriscada - mas, infelizmente, preciso equilibrar segurança e usabilidade: o computador precisa ser utilizável pelo cliente. Além disso, não estou tentando me defender contra um atacante determinado e direcionado com isso; em vez disso, estou usando isso como uma das técnicas de mitigação, para que o sistema não seja fácil de alcançar.

Responder1

Parece funcionar para mim no Ubuntu 14.04 com 2 teclas flash e telefone Android como armazenamento e adaptador de rede USB e webcam como outro tipo.(Não consegui testar a colocação de um hub USB)

  1. Verifique a porta USB (que é o dispositivo pai do 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. Crie uma regra udev, correspondendo ao nome do kernel da porta USB sem usb-storagedriver

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

    Permitir qualquer dispositivo que tenha armazenamento como primeira interface(Dispositivos compostos permitidos)

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

    Bloqueie qualquer dispositivo que não possua interface de armazenamento (Dispositivos compostos negados)

    Na verdade, o telefone é montado como modem /dev/ttyACM0como KERNELS=="2-1.2:1.1". Isso não permitirá que telefones (dispositivos compostos) sejam montados, apenas dispositivos de armazenamento 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'"
    

    Bloqueie apenas interfaces que não sejam de armazenamento (Dispositivos compostos permitidos apenas como armazenamento)

    Depois de alguma pesquisa sobre uma maneira de desabilitar apenas interfaces não permitidas. A desvinculação do driver parece funcionar. Meu telefone só pode ser usado como armazenamento. Ele não cria arquivos /dev/ttyACM0.

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

    udevadm control --reload-rules
    

Referências:

informação relacionada