Début octobre 2017, une vulnérabilité a été découverte par Chris Salls dans l’implémentation de l’appel système waitid [1] au sein du noyau GNU/Linux, permettant notamment d’écrire des données dans l’espace mémoire réservé au noyau. Cet article tente de retracer de façon détaillée l’étude de la cause de celle-ci ainsi que les différents obstacles rencontrés lors de son exploitation.
1. Premier coup d’œil
1.1 Détails de la vulnérabilité
Un coup d’œil sur le correctif [PATCH] permet de voir que la vulnérabilité est présente au sein du syscallwaitid. Pour rappel, celui-ci permet de mettre une tâche en attente de la complétion d’une autre. Le message de commit est assez sommaire (waitid(): Add missing access_ok() checks) et la modification apportéene fait que deux lignes :
+ if (!access_ok(VERIFY_WRITE, infop, sizeof(*infop)))
+ goto Efault;
Après une rapide lecture de la documentation sur access_ok, on découvre que cet appel de fonction permet de s’assurer de l’innocuité de l’accès pour une taille donnée à une adresse passée en argument. Par innocuité et dans notre cas d’une architecture x86, on entend ici deux choses :
- cette adresse pointe vers l’espace utilisateur ; ne pas oublier que nous sommes en train de traiter un appel système et que nous sommes donc en espace noyau en train d’exécuter du...
- Accédez à tous les contenus de Connect en illimité
- Découvrez des listes de lecture et des contenus Premium
- Consultez les nouveaux articles en avant-première