Historique de la faille vmsplice()
Par haypo, mardi 4 mars 2008 à 00:40 :: Sécurité informatique :: #132 :: rss
Le chercheur en sécurité Wojciech Purczynski, employé par COSEINC et membre de l'association iSEC Security Research, a trouvé divers bugs dans l'appel système vmsplice() du noyau Linux. Cette fonction, introduite avec Linux 2.6.17, sert à envoyer des données de l'espace utilisateur vers l'espace noyau pour alimenter un pipe. Lire mon précédent billet sur l'évolution des entrées/sorties dans Linux pour les détails. Les développeurs noyau sont prévenus dès le 1er février. Cet article relate la publication, l'exploitation, puis la correction de ces failles.
8 février
Wojciech publie les deux vulnérabilités qu'il a trouvées. La première concerne la fonction vmsplice_to_user() qui déréférence des pointeurs passé par l'utilisateur. La seconde concerne copy_from_user_mmap_sem() qui ne vérifie pas les données passées en argument par l'utilisateur.
Le même jour, Linux 2.6.24.1 est publié : il contient de nombreux correctifs dont deux correctifs pour copy_from_user_mmap_sem() et vmsplice_to_user().
9 février
Le lendemain de la publication, deux exploits démontrant la faille sont publiés sur milw0rm. Rapidement, on constate que Linux 2.6.24.1 est aussi vulnérable. Les versions 2.6.17 à 2.6.24.1 de Linux sont affectées, qu'importe le matériel (processeurs et pilotes utilisés).
11 février
Linux 2.6.24.2 est publié avec un seul correctif pour get_iovec_page_array(). Les failles publiées sont maintenant toutes corrigées comme il faut.
18 février
DistroWatch compare les temps de réaction des distributions Linux pour corriger les failles. Il prend Debian comme référence étant donné que c'était la première. RedHat, Ubuntu et CentOS sont les derniers avec +27 heures par rapport à Debian (3 jours et 27 heures depuis l'annonce de la vulnérabilité).
26 février
Linux 2.6.24.3 est publié avec un correctif pour get_user_pages(). Le message de commit est fort intéressant.
Le vrai problème de toute cette histoire est que la fonction get_user_pages() utilise un nombre signé et ne vérifie pas les débordements d'entier. Le correctif est donc simplissime : un simple ajout de « if (len <= 0) return 0; » au bon endroit. Pourtant, il est suffisant pour éviter tous les exploits vmsplice().
Pour en savoir plus sur les vulnérabilités vmsplice(), lisez l'article the making of a local root exploit.
Commentaires
1. Le dimanche 12 octobre 2008 à 22:31, par Selmak
2. Le lundi 13 octobre 2008 à 09:42, par haypo
3. Le mardi 12 octobre 2010 à 10:42, par gucci outlet store
Ajouter un commentaire
Les commentaires pour ce billet sont fermés.