14/08/2009

Faille critique dans tous les noyaux Linux

Exploit WunderbarHier, Tavis Ormandy et Julien Tinnes (Google Security) ont dévoilé une faille qui affecte tous les kernels Linux 2.4 et 2.6 depuis 2001.

C’est un bug de type NULL Pointer Deference qui permet au pirate d’exécuter n’importe quel code au niveau du kernel et donc d’acquérir les droits root.

NULL Pointer

Dans le noyau Linux, chaque socket de connexion a une structure d’opérations associée (proto_ops) qui contient des pointeurs vers diverses opérations : accept, bind, shutdown, …

Si une des opérations n’est pas nécessaire à ce type de socket, le pointeur devrait tout de même être défini vers une fonction “inutile”. Mais évidemment tous les développeurs n’y pensent pas forcément et beaucoup de sockets laissent ces pointeurs non-initialisés (NULL).

Le problème, c’est que certaines fonctions du noyau Linux (sock_sendpage, par exemple) ne vérifient pas si ces pointeurs sont bien initialisés et exécutent le code “NULL”, c’est à dire un code à l’emplacement 0.

Un pirate n’a donc qu’à insérer son code dans l’emplacement 0 et faire en sorte que le kernel l’exécute. Puisque le kernel possède des droits absolus, il est très facile d’exploiter cette faille pour acquérir les droits de root (privilege escalation).

Des exploits déjà disponibles

Comme le précise Julien Tinnes, ce type de vulnérabilité est très facile à exploiter : « ça ne nous a pris que quelques minutes pour adapter un ancien exploit ». Et forcément il y en a déjà plusieurs qui circulent sur la toile.

Nous avons trouvé un exploit nommé wunderbar_emporium. Celui-ci exploite un bug dans pulseaudio et n’est donc pas dangereux pour la plupart des serveurs. (NB aux petits script kiddies 🙂 ) Comme vous pouvez le voir dans le screenshot ci-dessus il fonctionne plutôt pas mal!

Bien sûr des exploits existent pour des failles dans d’autres protocoles, plus largement répandus que Pulseaudio.

Mais un patch aussi disponible

Différentiel du correctifTrès exactement 9 minutes après la publication de l’article sur le blog de Jean Tinnes, Linus Torvalds lui-même a mis en ligne le patch comblant cette faille en remplaçant la fonction sock->ops->sendpage par kernel_sendpage, fonction ne laissant pas passer ce genre d’erreurs.

Les kernels gérant mmap_min_addr peuvent aussi se prémunir de certains exploits en règlant cette variable à une valeur supérieure à 0 :

# echo 4096 > /proc/sys/vm/mmap_min_addr

Celle-ci empêche toute écriture dans la mémoire 0… Mais cette mesure de sécurité est toute neuve et contournable pour les kernels inférieurs à 2.6.30.2. Il est donc plus qu’impératif d’appliquer le patch kernel au plus vite.

La faille couvrant le plus grand nombre de kernels Linux

Couvrant tous les kernels publiés depuis 2001, que ce soit en version 2.4 ou 2.6, cette faille décroche la palme de la faille portant sur le plus grand nombre de releases stables du kernel Linux. Elle est potentiellement très dangereuse puisqu’un utilisateur lambda peut acquérir les droits de root!

Nous ne pouvons que vous conseiller d’appliquer le patch au plus vite. Les différentes distributions devraient d’ailleurs publier le kernel mis à jour dans les prochaines heures…. Enfin, espérons 😀

En savoir plus

  1. egan
    | #1

    hem…il faut mettre une valeur AU-DESSUS de zéro dans /proc/sys/vm/mmap_min_addr !!!

  2. | #2

    Oui effectivement! Je corrige l’article immédiatement.

    De toute façon mmap_min_addr ne protège pas entièrement contre cette faille : elle ne fait que limiter certains exploits. Le seul moyen de s’en prémunir totalement est de patcher son kernel.

    Merci d’avoir signalé mon erreur 😉

  1. Pas encore de trackbacks