Hacker des Mac et des PC… avec un simple câble FireWire

J’en avais déjà parlé il y a un moment, le FireWire est un vecteur d’attaque assez efficace pour hacker une machine. En gros, il est possible de passer outre un mot de passe si vous avez un accès physique à une machine avec du FireWire, sans devoir la redémarrer.
Firewire_Logo

Si vous avez lu le Canard PC Hardware n°23, vous avez peut-être remarqué une page sur le même sujet, c’est normal. Le sujet m’a inspiré pour le blog et j’ai ensuite rédigé pour le magazine, je poste juste ça ici parce qu’il avait été écrit.

On appelle ça une attaque par DMA : en gros, le FireWire a été conçu pour donner un accès complet à la mémoire de son hôte, parce qu’il est possible de relier deux appareils sans avoir un ordinateur entre les deux, contrairement à l’USB. Plus clairement, il est possible de lire la totalité de la mémoire (ou presque) en reliant deux machines en FireWire.

Le hub FireWire le plus classe du monde

Le hub FireWire le plus classe du monde

Il y a quelques limites, la première est que le bus FireWire travaille en 32 bits, ce qui peut poser des soucis si la machine cible a plus de 4 Go de RAM. La seconde, c’est qu’il faut du FireWire sur la machine cible, ce qui n’est pas très courant sur les PC. Si la machine n’en a pas, il reste une solution : une carte ExpressCard ou PC Card avec du FireWire, l’OS charge normalement les pilotes sans discuter (je vais tester, je vous préviens quand c’est fait).

Commençons par les Mac. Tous les systèmes sont vulnérables dans une certaine mesure, mais il est assez simple de se protéger. La méthode la plus simple consiste à utiliser FileVault 2 : depuis Mac OS X 10.7.2, son activation bloque tout simplement l’accès DMA dès qu’on ferme une session (si la machine est ouverte, on peut passer outre). La seconde, c’est que certains Mac bloquent l’accès DMA dans tous les cas : ceux sous Mountain Lion (au moins 10.8.2) et plus avec un processeur Ivy Bridge (et plus), soit la majorité des machines après 2012. Enfin, on peut bloquer l’accès DMA en mettant un mot de passe EFI ou en utilisant la commande suivante.

sudo nvram security-mode=NONE

Sous Windows, ça marche visiblement dans tous les cas, sauf si vous bloquez explicitement le FireWire.

Petit test

J’ai utilisé Inception, un outil disponible sur GitHub avec les instructions pour l’installer sur une machine sous Mac OS X.

Pour l’attaque, j’ai utilisé un MacBook Air 2012 sous Yosemite. Comme la machine n’a pas de FireWire, j’ai utilisé un adaptateur Thunderbolt vers FireWire Apple, mais un écran Apple, une station Thunderbolt Belkin ou même une ExpressCard FireWire dans un adaptateur Thunderbolt vers ExpressCard passent bien.

Mon outil

Mon outil

Comme cible, j’ai tenté quelques machines : un PC basique sous Windows 8 avec une carte PCI FireWire 800 (2 Go de RAM), un MacBook Pro 2011 sous Snow Leopard (8 Go de RAM), un MacBook sous Lion avec FileVault 2 activé (4 Go de RAM, 3 Go utilisables), un iBook sous Tiger (576 Mo de RAM), un PC avec du FireWire 400 et 6 Go de RAM. Je testerais aussi sur un PC avec un adaptateur ExpressCard vers FireWire quand j’aurais reçu la carte.

L’attaque permet deux choses : passer outre un mot de passe et lancer des programmes en tant qu’administrateur. Dans le premier cas, si la machine est sur un écran qui demande un mot de passe, il suffit de lancer Inception, attendre quelques secondes et taper n’importe quel mot de passe. Même chose pour lancer des trucs en ligne de commande, en utilisant sudo -s sous Mac OS X et runas sous Windows.

On peut aussi faire des choses comme dumper la mémoire, mais c’est assez aléatoire, vous allez le voir. Ceci dit, il permet dans certains cas de récupérer le mot de passe directement.

Un PC (Windows 8.1, 2 Go de RAM)

C’est simple : ça fonctionne.

L’attaque permet de supprimer le mot de passe (plus exactement, on tape ce qu’on veut) et comme Windows 8.1 (par défaut) n’éteint pas vraiment le PC, ça reste actif tant qu’on ne fait pas un « vrai » redémarrage.

Ca marche

Ca marche

L’attaque prend quelques secondes et permet a priori de faire du « runas » pour lancer n’importe quoi en tant qu’administrateur.

On peut dumper le contenu de la mémoire (ici 2 Go), ça tourne à environ 500 Mo par minute avec une carte PCI FireWire 800. Attention, par défaut le soft essaye de récupérer 4 Go mais plante la source et la cible quand on dépasse la mémoire physique.

Je n’utilise pas assez Windows que pour avoir testé la commande qui sort le mot de passe directement, mais en cherchant directement mon mot de passe dans le dump, il est en clair.

Un PC (Windows 8.1, 6 Go de RAM)

L’outil se lance mais ne fonctionne pas. La source plante quand on s’approche des 4 Go de mémoire.

Je n’ai pas testé le dump sur cette machine là.

Un MacBook Pro 2011 (Snow Leopard, 8 Go de RAM)

Ca ne fonctionne pas. Dans tous les cas, je plante la machine source. Ca vient peut-être de mon MacBook Pro, un prototype avec un firmware un peu capricieux.

Un iBook (Tiger, 576 Mo de RAM)

L’attaque elle-même ne fonctionne pas.

Attaque en cours

Attaque en cours

Par contre, on peut faire un dump de la RAM (~400 Mo/s la minute en FireWire 400) et ensuite la commande suivante affiche le mot de passe.

strings memdump.bin | grep --after-context=4 longname | grep --after-context=1 password

Attention à dumper uniquement la mémoire physique, on plante les deux machines quand on demande plus.

Un MacBook (Lion, 4 Go de RAM, FileVault 2)

Ca fonctionne uniquement si la machine est débloquée. En clair, c’est assez rare que ça arrive. Par contre, ça supprime toutes les demandes de mot de passe : on peut donc verrouiller puis déverrouiller sans soucis, faire un sudo, etc.

Impossible de faire un dump de la mémoire, ça plante directement la source.

Un MacBook Pro 2009 (Mavericks, 8 ou 4 Go de RAM)

L’outil ne marche pas, que la machine utilise 4 ou 8 Go de RAM. Il teste toute la RAM et plante la source à la fin.

Le dump marche en partie (3,5 Go dumpés avant que la source plante) et contient le mot de passe de la session en clair.

strings memdump.bin | grep --after-context=4 longname | grep --after-context=1 password

Si on a plus de 4 Go, c’est évidemment une question de chance : le mot de passe n’est pas nécessairement dans la partie accessible. Le dump se fait à environ 500 Mo par minute.

La commande sudo nvram security-mode=NONE (suivie d’un redémarrage) bloque bien l’attaque.

Globalement, l’attaque à ses limites, la première étant qu’il faut du FireWire, mais reste très efficace. Ca ne fonctionne pas dans tous les cas et les Mac récents bloquent normalement l’attaque, mais c’est toujours utile de savoir que ça existe.

Je vous ai fait une petite vidéo pour montrer comment ça marche : je montre qu’il y a bien un mot de passe, j’attaque et ensuite on peut entrer n’importe quel mot de passe.