web-dev-qa-db-fra.com

Utilisez uniquement des périphériques de stockage de masse sur un port USB sélectionné. Comment?

Sur un port USB donné, je souhaite uniquement accepter les capacités de stockage de masse USB, et rien d’autre. Pas d'appareils HID, pas d'adaptateurs Bluetooth, pas de convertisseurs RS232, rien. Y a-t-il un moyen de faire cela, par exemple en utilisant udev? Je suis conscient que je peux écrire une règle udev personnalisée pour , y compris un pilote pour un périphérique ou un port donné, mais puis-je en quelque sorte exclut tous les autres pilotes? J'essaie de n'autoriser qu'une classe de périphériques, à savoir le stockage de masse USB; Il existe une myriade de modèles de périphériques différents dans cette classe, et je ne sais pas lesquels vont se connecter au port (les clients apporteront le leur, il n’ya aucun moyen pour moi d’affecter cela).

Menaces émanant du micrologiciel USB reprogrammé ne fera qu'empirer dans un avenir prévisible. J'essaie de les atténuer pour ce cas d'utilisation: j'ai un ordinateur avec des périphériques USB connectés en interne (carte réseau, périphériques spécialisés, clavier) et un port USB pour le public, qui n'est censé être utilisé que pour le transfert de fichiers. Donc, je ne peux pas tout à fait mettre les autres modules USB sur la liste noire; mais j'aimerais "désinfecter" ce port particulier, de sorte que le branchement d'un type de périphérique différent ne ferait rien.

Le boîtier est physiquement verrouillé, de sorte que seul ce port USB spécifique est accessible de l’extérieur. Toute ingérence dans le boîtier ou toute épissure sur le câble du clavier doit être suffisamment suspecte pour déclencher une réaction de sécurité physique; de plus, je ne m'attends pas à ce que la plupart des utilisateurs fassent preuve de malveillance active, mais je m'attends à ce que le nombre de transporteurs involontaires de clés USB remises à jour augmente (comme c'était le cas avec les infections du secteur d'amorçage par disquette de jadis). En ce qui concerne la sécurité, peu importe que l'utilisateur apporte le disque USB "armé" avec une intention malveillante ou simplement ne sache pas qu'il est "infecté".

Je suis conscient que la sécurité parfaite est infaisable ici, et permettre à l’utilisateur d’interagir avec le système de n’importe quel moyen est risqué - mais hélas, je dois équilibrer la sécurité contre l'utilisabilité: l'ordinateur doit être utilisable par le client. De plus, je ne cherche pas à me défendre contre un attaquant déterminé et ciblé avec ceci; J'utilise plutôt cela comme l'une des techniques d'atténuation, de sorte que le système ne soit pas un fruit à portée de main.

14
Piskvor

Cela semble fonctionner pour moi dans Ubuntu 14.04 avec 2 clés flash et Android téléphone en tant que stockage et adaptateur réseau USB et webcam en tant que type différent. (Je ne pouvais pas tester de placer un hub USB)

  1. Vérifiez le port USB (qui est un périphérique parent pour le périphérique branché)

    $ 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. Créer une règle udev, correspondant au nom du noyau du port usb sans le pilote usb-storage

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

    Autorise tous les périphériques disposant d'une mémoire en tant que 1ère interface (Périphériques composites autorisés)

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

    Bloquez tous les périphériques dotés d'une interface de stockage (Périphériques composites refusés)

    En fait, le téléphone est monté comme modem sur /dev/ttyACM0 sous la forme KERNELS == "2-1.2: 1.1". Cela ne laissera pas les téléphones (appareils composites) être montés, mais uniquement les appareils de stockage 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'"
    

    Bloquer uniquement les interfaces qui ne sont pas du stockage (Les périphériques composites sont autorisés uniquement en tant que stockage)

    Après quelques recherches sur un moyen de désactiver uniquement les interfaces non autorisées. La déliaison du conducteur semble fonctionner. Mon téléphone ne peut être utilisé que comme espace de stockage. Il ne crée pas /dev/ttyACM0.

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

    udevadm control --reload-rules
    

Références:

16
user.dz