TOOLinux

Le journal du Libre

Un nouveau type de faille locale

jeudi 27 août 2009

Le problème qu’il a soulevé a été assez vite corrigé, mais cette brèche a permis à de nombreuses personnes de rechercher un nouveau type de failles. Elles se succèdent depuis à un rythme soutenu, certaines permettant de contourner les systèmes de protection supplémentaire comme SE Linux ou un paramétrage censé interdire ce type de faille. La dernière en date fait le tour des médias, car elle affecte toutes les versions du noyau depuis la version 2.4.4, sortie en 2001.

Le développeur C est habitué à vivre dans un univers dangereux et à gérer un certain nombre d’éléments à la main : la mémoire, les entrées/sorties et les chaînes de caractères sont les plus fréquents. Il utilise pour gérer tout cela des pointeurs vers la mémoire virtuelle de la machine, la RAM. Dans la jungle de l’informatique bas-niveau, l’une des rares vérités sur lequel pouvait s’appuyer un développeur a disparu : jusqu’au 16 juillet dernier, on pouvait s’attendre à ce que l’utilisation de l’adresse NULL (de valeur 0) provoque une exception du processeur puis un crash logiciel (ou un écran bleu devenu célèbre depuis 1995).

En fait, sous Linux, il est possible de charger en mémoire en tant que simple utilisateur des instructions à cette adresse 0 (NULL) via l’appel système mmap. De ce fait, le déférencement d’un pointeur initialisé à NULL ne provoque pas d’exception de la part de la MMU, puisque l’adresse 0 (NULL) est une adresse valide (suite à l’utilisation de mmap). Ainsi, il est possible, en détournant une variable du noyau Linux initialisée à NULL, d’exécuter du code, précédemment installé par un utilisation via l’utilisation de mmap, en Ring 0 - les droits noyau.

Et c’est là où se situe le nœud du problème : NULL, étant considéré par le développeur C comme une adresse non valide, est utilisé comme élément neutre pour les pointeurs : initialisation les pointeurs, retour d’erreur de certaines fonctions (notamment malloc). Le compilateur GCC fait d’ailleurs de même, pour initialiser certaines variables statiques qui sont stockées dans le segment BSS.

Les pointeurs se voient assignés allègrement la valeur NULL, et les cas où la présence de cette valeur n’est pas vérifiée avant un déférencement sont nombreux. Les lignes de code du noyau sont trop nombreuses pour pouvoir raisonnablement espérer que les développeurs du noyau les corrigent toutes à travers les correctifs de sécurités.

Une défense qui semblait efficace consistait à modifier le paramètre situé dans /proc/sys/vm/mmap_min_addr. Ce paramètre permet de spécifier l’adresse minimale utilisable par les programmes. En indiquant un nombre supérieur à zéro, toutes les failles potentielles sont corrigées, sauf si la machine utilise un système de protection supplémentaire, tel que SELinux, édité par Red Hat. Un défaut dans son système de règle (policy) rendait ce paramètre inefficient et le système vulnérable.

Ce défaut a été corrigé sur Fedora mais n’a pas été corrigé via des paquets sur les RHEL 4 ou 5, afin de maintenir la compatibilité descendante. Ainsi, lwn.net a noté que des machines se sont déjà fait rooter par cet exploit, dont le code source est disponible et facilement utilisable. Red Hat a ouvert une page sur le sujet, décrivant les commandes nécessaires pour rendre l’attaque inopérante sur ses systèmes d’exploitation.

Néanmoins, vu le potentiel derrière cette faille, il est probable que d’autres failles de la même catégorie soient dévoilées durant les prochains mois.

Source : lwn.net

Michel Loiseleur