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

14

Em uma determinada porta USB, quero apenas aceitar recursos de armazenamento em massa USB e nada mais. Não há dispositivos HID, adaptadores Bluetooth, conversores RS232, nada. Existe uma maneira de fazer isso, por exemplo, usando o udev? Estou ciente de que posso escrever uma regra personalizada do udev para incluir um driver para um determinado dispositivo ou uma porta, mas de alguma forma posso excluir todos os outros drivers? Estou tentando permitir apenas uma classe de dispositivos, a saber, armazenamento em massa USB; existem inúmeros modelos de dispositivos diferentes nesta classe e não sei quais serão conectados à porta (os clientes trarão 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. Estou tentando atenuá-los para este caso de uso: tenho um computador com periféricos USB conectados internamente (placa de rede, periféricos especializados, teclado) e uma porta USB voltada para o público, que deveria ser usada apenas para transferência de arquivos. Portanto, não posso colocar os outros módulos USB na lista negra; mas gostaria de "limpar" essa porta específica, para que a conexão de um tipo de dispositivo diferente não fizesse nada.

O gabinete está fisicamente bloqueado, de modo que somente essa porta USB específica seja acessível a partir do exterior, e se intrometer no gabinete ou emendar o cabo do teclado deve ser suspeito o suficiente para disparar 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 operadoras involuntárias de unidades USB relampejadas aumente (como ocorreu com as infecções de disquetes do setor de outrora). No que diz respeito à segurança, não importa realmente se o usuário traz o disco USB "armado" 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 de qualquer forma é arriscado - 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 determinado; pelo contrário, estou usando isso como uma das técnicas de mitigação, para que o sistema não seja um problema de baixa qualidade.

Piskvor saiu do prédio
fonte
2
Hum. Estou apenas aprendendo coisas, então não tenho certeza se isso pode ajudar, mas veja se isso é relevante: " linux-usb.org/FAQ.html " Especificamente, role para "Por que vejo apenas um dispositivo no meu dispositivo de armazenamento multiuso "question, and there line" Se você não quiser fazer isso em todos os dispositivos SCSI, poderá solicitar ao kernel que procure por um dispositivo específico usando: echo> / proc / scsi / scsi "scsi add-single-device 0 0 0 1 ""
Sergiy Kolodyazhnyy 06/10
1
Você deseja que uma porta específica seja bloqueada apenas no USB Mass Storage?
Kaz Wolfe
3
"Com acesso físico, a batalha pela segurança está perdida." ~ Todo usuário Security.SE sempre.
Kaz Wolfe
1
@Piskvor Não tenho certeza, mas você pode ter mais sorte em encontrar uma resposta em security.stackexchange.com ou em um dos outros sites mais avançados / voltados para profissionais.
Brian Z
2
Talvez isso possa ajudar: irongeek.com/… , especialmente a seção 3.2 Bloqueando o Linux usando o UDEV.
alci

Respostas:

16

Parece funcionar para mim no Ubuntu 14.04 com 2 chaves flash e telefone Android como armazenamento e adaptador de rede USB e webcam como outro tipo. (Eu não pude 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. Criar regra udev, correspondente 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'"
    

    Bloquear qualquer dispositivo que tenha uma interface sem armazenamento (dispositivos compostos negados)

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

    Bloquear apenas interfaces que não são de armazenamento (dispositivos compostos permitidos apenas como armazenamento)

    Depois de alguma pesquisa sobre uma maneira de desativar apenas interfaces não permitidas. Desvinculação do driver parece funcionar. Meu telefone só pode ser usado como armazenamento. Ele não é criado /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:

user.dz
fonte
Me derrote ...
Kaz Wolfe
@Whaaaaaat, sim authorized, também funciona, mas removeé uma maneira mais limpa, pois o usuário vai desconectá-lo de qualquer maneira. Eu verifiquei unidades desmontadas, elas ainda têm usb-storagecomo driver para um nó pai. Concordo, existem alguns casos em usb-storageque não podem ser usados. BTW, :) u consome muitos comentários (2min, 1min), você pode editar o primeiro (em <5min)
user.dz
@Whaaaaaat: Quando eu estava testando isso, o driver de armazenamento USB foi carregado logo antes da criação do (s) dispositivo (s) de bloco; montá-los não era necessário.
Piskvor saiu do prédio
@Piskvor Isso respondeu à sua pergunta? Nesse caso, você deve marcar isso como a resposta correta e conceder sua recompensa.
9788 John