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

14

Em uma determinada porta USB, eu só quero aceitar os recursos de armazenamento em massa USB e nada mais. Sem dispositivos HID, sem adaptadores Bluetooth, sem conversores RS232, nada. Existe uma maneira de fazer isso? usando o udev? Estou ciente de que posso escrever uma regra personalizada do udev para incluir um driver para um determinado dispositivo ou uma determinada porta, mas posso de alguma forma excluir todos os outros drivers? Estou tentando permitir apenas uma classe de dispositivos, ou seja, armazenamento em massa USB; há uma miríade de diferentes modelos de dispositivos nesta classe, e eu não sei quais vão se conectar à porta (os clientes trarão os seus próprios, não há como eu afetar isso).

As ameaças do firmware USB reprogramado só vão piorar no futuro previsível. Eu estou tentando atenuá-los para este caso de uso: Eu tenho um computador com periféricos USB internamente conectados (placa de rede, periféricos especializados, teclado) e uma porta USB voltada para o público, que deve ser usada apenas para transferência de arquivos. Então, eu não posso colocar todos os outros módulos USB na lista negra; mas gostaria de "higienizar" essa porta em particular, de forma que conectar um tipo de dispositivo diferente não faria nada.

O gabinete está fisicamente bloqueado, de modo que somente essa porta USB específica é acessível de fora, e a intromissão com o gabinete ou a emenda no cabo do teclado deve ser suspeita o suficiente para acionar a resposta de segurança física; Além disso, eu não espero que a maioria dos usuários seja ativamente maliciosa, mas eu espero que o número de operadoras inconscientes de drives USB re-flashed aumente (como era com as infecções do setor de boot floppy de outrora). No que diz respeito à segurança, não importa realmente se o usuário traz o disco USB "armaizado" com intenção maliciosa, 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 em qualquer é arriscado - mas, infelizmente, preciso equilibrar a segurança com a usabilidade: o computador precisa ser utilizável pelo cliente. Além disso, não estou tentando me defender de um atacante determinado e determinado com isso; em vez disso, estou usando isso como uma das técnicas de mitigação, de modo que o sistema não seja fruto de baixa produtividade.

    
por Piskvor 02.10.2014 / 17:18

1 resposta

16

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

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

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

    Bloqueia qualquer dispositivo que tenha uma interface sem armazenamento (Dispositivos compostos negados)

    Na verdade, o telefone é montado como modem para /dev/ttyACM0 como KERNELS == "2-1.2: 1.1". Isso não permitirá que os telefones (dispositivos compostos) sejam montados apenas em 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 somente as interfaces que não são de armazenamento (Dispositivos compostos são permitidos somente como armazenamento)

    Após alguma pesquisa sobre uma maneira de desabilitar somente interfaces não permitidas. Desligamento do driver parece funcionar. Meu telefone só pode ser usado como armazenamento. Não cria /dev/ttyACM0 .

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

    udevadm control --reload-rules
    

Referências:

por user.dz 06.10.2014 / 14:06