La vache qui root

JonathanLe 25 octobre 2016

Une faille corrigée peut réapparaître quelques années plus tard. C'est le cas pour une faille hautement critique découverte par Phil Oester dans le kernel Linux. La faille vieille de 9 ans est une élévation de privilège, c'est à dire qu'un utilisateur avec des droits restreints peut exécuter une action avec des droits administrateurs (root dans le cas présent).

Dirty COW

La vulnérabilité est surnommée Dirty COW en référence au mécanisme Copy-On-Write du noyau Linux. Elle correspond à la CVE-2016-5195. Comme écrit plus haut, il s'agit d'une faille permettant à un simple utilisateur d'exécuter des programmes avec les privilèges root. Cette faille est d'autant plus critique que :

  • Il est facile d'écrire un exploit, une liste de POC est disponible ici
  • La faille est présente dans quasiment toutes les différentes distributions Linux, on peut citer Debian, Ubuntu et certaines version de RedHat...

La faille a déjà été corrigée pour les distribution RedHat, Debian et Ubuntu, pour les autres il faudra attendre avec patience...

Fonctionnement

Dans le noyau Linux, lorsqu'un processus souhaite écrire dans un fichier, une copie de ce dernier est créée au moment de l'écriture : c'est le mécanisme de Copy-On-Write. La vulnérabilité est basée sur cette fonctionnalité. L'exploitation est décomposée en plusieurs étapes :

  • Récupérer l'adresse mémoire de la copie du fichier avec la fonction mmap(). Le contenu du fichier est "mappé" en mémoire.
  • Effectuer parallèlement deux actions à l'aide de 2 threads:
    1. La première action est une écriture en boucle dans la zone mémoire pour générer des copies (Cow) de la zone.
    2. La deuxième action est l'utilisation de la fonction madvice() avec l'argument MADV_DONTNEED. Ce dernier indique au système qu'il peut libérer la zone mémoire utilisée.

La combinaison de ces deux actions peut provoquer une race condition, c'est à dire que l'écriture est effectuée avant que la copie en mémoire soit créée.

La vidéo suivante permet de donner plus de détails techniques sur l'exploit et la faille en elle-même:

Démonstration

Je me connecte en tant que root, pour créer un fichier accessible uniquement en lecture

(jonathan)$ sudo -s
(root)$ echo "Je suis root, personne ne peut modifier ce fichier" > test_DirtyCow
(root)$ exit
(jonathan)$ ls -ltr test_DirtyCow
-rw-r--r-- 1 root root 51 oct.  26 11:02 test_DirtyCow
(jonathan)$ echo "Algosecure is the best!" > test_DirtyCow
-bash: test_DirtyCow: Permission non accordée

Je ne peux donc pas modifier le fichier avec mes droits actuels. Je vais maintenant utiliser le POC dirtyCow pour modifier le fichier

(jonathan)$ ./dirtyc0w test_DirtyCow "Algosecure is the best et peut réécrire le fichier            "
mmap 7f6921ee3000

madvise 0

procselfmem 2005032704
(jonathan)$ cat test_DirtyCow
Algosecure is the best et peut réécrire le fichier
(jonathan)$ echo "Algosecure is the best!" > test_DirtyCow
-bash: test_DirtyCow: Permission non accordée

Le fichier a bien été modifié. Cependant si le contenu à écrire dans le fichier dépasse la taille réelle du fichier, l'écriture sera tronquée. Inversement, si le contenu est plus petit, alors seul les n premiers octets du fichier seront écrasés.

Ce test n'est pas significatif de la criticité de la vulnérabilité. Cependant, en modifiant un fichier comme /etc/shadow ou les exécutables /bin/ls, /bin/cat, /bin/ping les conséquences seraient beaucoup plus importantes.

Pour aller plus loin...

Cette faille ne touche pas uniquement les machines Linux, elle concerne également tous les terminaux Android. Ce lien explique comment procéder pour la version Android.

You've enabled "Do Not Track" in your browser, we respect that choice and don't track your visit on our website.