web-dev-qa-db-fra.com

Attaques via un accès physique à l'USB (DMA ...?)

Je me demande si l'USB peut être exploitée par quelqu'un ayant un accès physique à un ordinateur raisonnablement sécurisé. Par exemple, un kiosque ou un ordinateur portable attaché à un bureau.

Évidemment, la séquence de démarrage doit être sécurisée (BIOS/UEFI réglé sur "disque interne uniquement" et protégé par mot de passe ...). De plus, les options de montage doivent être limitées avec nodev,nosuid,noexec. De plus, les fichiers doivent être analysés par un antivirus/antimalware. .. Etc.

Je suis vraiment préoccupé par des exploits comme attaques DMA , où un utilisateur n'a qu'à brancher un périphérique USB pour extraire des informations en mémoire.

Quelles fonctionnalités pourraient être désactivées pour autoriser la souris et le clavier tout en réduisant la surface d'attaque?

11
Franklin Piat

Avant de commencer, un petit mot sur le fonctionnement de l'USB. Un périphérique USB se connecte à un élément matériel à l'intérieur de l'ordinateur appelé le contrôleur hôte USB. Cela décode le protocole USB complexe, qui, tout comme un protocole réseau comme TCP, contient des paquets, des sommes de contrôle, les équivalents de SYN, ACK, etc. Le contrôleur hôte USB décode chaque périphérique USB connecté individuel et le présente au système d'exploitation, où il peut l'interpréter comme il le souhaite (par exemple, comme un périphérique bloc, ou une souris, ou même un modem d'accès à distance, vous l'appelez). Le contrôleur USB lui-même se connecte au PCH (qui est comme une station relais) via PCI. Ce n'est pas un slot PCI encombrant, mais c'est néanmoins du PCI. Le contrôleur USB est ce que vous voyez lorsque vous regardez la sortie de lspci sur votre système et voyez les mentions d'USB. Vous avez probablement quelques contrôleurs USB, chacun connecté via PCI au PCH. Le PCH se connecte à son tour au CPU. Voir ce excellent article Stack Exchange qui a une très bonne description graphique de l'anatomie du contrôleur USB.

Décomposons maintenant les types d'attaques possibles en trois parties.

Comportement intentionnel

La plupart des distributions USB à montage automatique de distributions Linux avec des systèmes de fichiers, et certains ont même la possibilité de s'exécuter automatiquement, bien que cela soit rarement activé par défaut. C'était plus un problème dans les temps anciens de Windows, et cela n'a jamais vraiment été un problème sous Linux. Cependant, USB 3.1 prend en charge DMA, vous pouvez donc éviter cela. Je pense cependant qu'il est désactivé par défaut, donc ce n'est pas un risque énorme. Sachez simplement que le contrôleur USB le permet.

Exploiter un logiciel

Il y a eu plusieurs instances de vulnérabilités dans le code d'analyse de la table de partition, où le simple fait de brancher une clé USB peut exploiter le système au moyen d'une table de partition spécialement conçue mais corrompue. Bien que cela soit assez rare (je n'en connais que deux qui permettaient l'exécution de code arbitraire), les vulnérabilités des systèmes de fichiers à montage automatique sont beaucoup plus courantes, compte tenu de la complexité incroyable des systèmes de fichiers. Ils analysent une énorme quantité de structures et accordent la priorité à la performance avant presque tout le reste, de sorte que les contrôles d'intégrité ne sont souvent pas effectués, sauf s'ils sont nécessaires. Cela donne lieu à un nombre accru de vulnérabilités. Mais même si vous n'êtes affecté par aucun de ces éléments, il existe de nombreuses vulnérabilités pour votre environnement de bureau préféré et comment il gère l'affichage du contenu des dossiers, comme la génération de miniatures ... Tout récemment, il y avait une vulnérabilité dans ffmpeg qui lui permettait de téléphone à la maison à des serveurs arbitraires, et avant cela, une vulnérabilité dans libpng qui permettait l'exécution de code arbitraire.

Exploiter le matériel

C'est de loin le plus effrayant et le plus difficile à atténuer. Alors que (la plupart) des protocoles USB ne permettent pas le DMA, et aucun ne le permet par défaut, le contrôleur USB est connecté au PCH via PCI, qui a des capacités DMA. Le contrôleur USB promet de ne jamais faire du mal, bien sûr, et promet qu'il dira à tous les périphériques USB moyens de se déconnecter s'ils refusent de suivre le protocole, mais il est certainement possible que le contrôleur soit détourné par un périphérique USB malveillant qui lui présente des paquets corrompus. Une fois qu'il a pris le contrôle du protocole, il a plein DMA et peut faire tout ce qu'il veut. La seule façon de se protéger contre cela est d'utiliser votre IOMMU pour isoler le périphérique PCI. Il existe plusieurs façons pour ce faire, comme l'utilisation de Qubes OS qui, bien qu'il ait sa part de lacunes, est spécifiquement conçu pour protéger contre les attaques matérielles telles que celle-ci. Ou vous pourriez être créatif. Je suis allé créer ma propre petite distribution Linux amorçable que j'ai utiliser en combinaison avec QEMU/KVM, une technologie appelée VFIO, un pilote appelé usbip et quelques s personnalisés crypts et programmes qui atténuent le problème. Mais si vous comptez sur votre IOMMU pour vous protéger, assurez-vous simplement qu'elle prend en charge le remappage des interruptions. Sinon, il peut être contourné assez facilement et offre peu de sécurité.

L'USB 3.0 peut être particulièrement problématique. Je ne parle pas de 3.1 autorisant DMA lorsque l'hôte dit OK, mais s'exécutant en dehors du noyau. USB 3.0 fonctionne comme un blob binaire dans le BIOS, un peu comme le moteur de gestion Intel. Voir - this and this . Il a une très grande surface d'attaque, s'ajoutant à la surface déjà grande du matériel du contrôleur hôte USB. Vous pouvez le désactiver dans de nombreux BIOS, généralement sous un nom comme "contrôleur xHCI". Faire cela transformera efficacement tous les ports 3.0 en ports 2.0 ce qui diminue leur vitesse, mais cela améliore un peu la sécurité. En termes de sécurité paranoïaque, 1.0 n'est pas bon, 2.0 est mauvais et 3.0 est un cauchemar.

Il existe un correctif du noyau appelé grsecurity qui possède un grand nombre de fonctionnalités de sécurité qui augmentent considérablement la sécurité du noyau Linux. L'une des fonctionnalités de sécurité est de "refuser l'accès aux nouveaux périphériques USB", ce qui se passe comme il le semble. Soit après avoir basculé un paramètre unidirectionnel, soit après le démarrage, tous les nouveaux périphériques USB ne seront plus autorisés à accéder. Tout le code du noyau complexe et potentiellement vulnérable qui traite des périphériques USB est désactivé. Il atténuera complètement les deux premiers problèmes, mais ne fait malheureusement rien du tout pour atténuer le troisième. Même la compilation d'un noyau personnalisé et la suppression des pilotes USB n'atténue pas le troisième.

12
forest