Fun avec une application embarquée

De Vulcainreo, dim. 12 juin 2016, dans la catégorie Hacking

Hacking

Souhaitant réaliser une démo sur l'importance d'intégrer la sécurité au sein du développement, j'ai réalisé une micro-application pour illustrer qu'une erreur peut avoir de lourdes conséquences

Présentation de l'application

L'application est toute simple. Une fois l'Arduino branché sur le port USB, il est possible d’interagir avec lui et de répondre à sa question "Quel est le mot de passe". Dès lors que le mot de passe est correct, il est possible de de jouer avec la diode. On va cependant voir, que le mot de passe ne sert à rien d’être connu si l'application est codée avec des pieds :)

Interaction avec l'arduino

Le code source est disponible ici : overflowAppli.ino

Identification des vulnérabilités

Analyse

Analyse des ports

Pour analyser si un port de debug a été configuré sur la carte, un analyseur d'entrée logique est le bienvenue. A noter que la puce Atmega328p, présente sur l'arduino UNO possède plus de 12 entrées / sorties logiques. L'analyseur logique met en évidence la présence d'un port de Debug sur le port 11 de l'arduino / Atmega328p

Analyse logique port Atmega 328p

Extraction du code source

La commande suivante permet d'extraire le code source intégré à une puce Atmega328p en utilisant la carte Arduino Uno comme programmateur

avrdude -F -v -patmega328p -carduino -P/dev/ttyACM0 -b115200 -D -Uflash:r:program.bin:r

Il est alors possible de lire le contenu et d'identifier les variables non obfusquées

pwd lisible dans le code

Vulnérabilités

Présence d'un port de debug

Découverte

La présence d'un port de debug est identifiable avec un analyseur logique. Une simple liaison série permet de s'y connecter pour obtenir de l'information sensible.

Capture de debug

Ici, le développeur à oublié de supprimer l'affichage de certaines variables, notamment le mot de passe :)

Faiblesse dans la vérification du mot de passe

Découverte

Par fuzzing et brute-force, l'attaquant peut ne s'intéresser qu'au dernier caractère. Si le caractère trouvé est correct, sans tenir compte des caractères précédents, le programme valide le mot de passe.

Explication

Voici le code source. result peut passer de true a false sur les 7 premiers caractères. Si le 8eme est bon, il faudra true et validera le mot de passe.

boolean compareCharArray(char a[8], String b)
{
  boolean result = false;
  String str(b);
  for (int s=0; s < 8; s++)
  {
     if (a[s] == b[s]) {
     result = true;
     }
     else {
        result = false;
     }
  }
  return result;
}

Buffer Overflow

Découverte

Par fuzzing, si l'attaquant renseigne un mot de passe contenant à minima 9 caractères, le contenu de la mémoire est affiché sur le port de debug.

...
9
0
70 => Première lettre du mot de passe : p
61 => a
73 => s
73 => s
77 => w
6F => o
72 => r
64 => d
0
9
0
...
Explication

Sur l'arduino, il n'y a pas de contrôle de dépassement de mémoire. En d'autres termes, si un tableau est configuré avec une taille de 5 et qu'une boucle essaye d'accéder au 6ème élément, aucune alerte ne sera déclenchée et la boucle aura accès à une partie de la mémoire. Par itération, il est alors possible d'afficher tout le contenu de la mémoire.

Slide de présentation

Ce projet a fait l'objet d'une session de présentation. Les slides sont disponibles ci-dessous