Des chercheurs de Calif ont publié une preuve de concept qui, selon eux, permet à un utilisateur local d'obtenir les privilèges root sur OpenBSD 7.9. La chaîne combine un dépassement d'entier en mémoire partagée, un use-after-free lié au comptage de références et une écriture hors limites dans le noyau.
Selon le compte rendu de The Hacker News sur les recherches de Calif, la société a signalé les failles à OpenBSD « plus tôt cette année », puis a publié une analyse technique détaillée ainsi que le code complet de la preuve de concept sur GitHub.
L'attaque décrite nécessite un accès local. Le rapport ne contient aucun élément indiquant que ces vulnérabilités ont été exploitées dans des attaques réelles. Au moment de la publication, aucune des deux failles n'avait reçu d'identifiant CVE.
Un compteur de 16 bits ouvre la chaîne d'exploitation
Le problème initial se situe dans la fonction d'attachement associée à shmat(4), qui rattache un processus à un segment de mémoire partagée. OpenBSD suit le nombre d'attachements grâce à shm_nattch, un short signé de 16 bits dont la valeur maximale est de 32 767.
Calif fait remonter ce type de données au code source de BSD datant de 1988. Comme ce champ n'a jamais été élargi, une augmentation suffisante du nombre d'attachements peut faire dépasser à ce compteur sa limite positive et le faire basculer en valeur négative.
Dans la preuve de concept des chercheurs, 127 segments de mémoire partagée sont mappés et 259 processus sont créés par fork. D'après les informations disponibles, cette séquence pousse le compteur au-delà de son maximum et fait passer sa valeur à −32 643.
Le dépassement seul n'accorde pas de privilèges élevés. Selon Calif, une condition de course qui suit le rebouclage entraîne un mauvais comptage des références et un use-after-free : le noyau libère de la mémoire que d'autres processus continuent de référencer.
Une écriture hors limites distincte corrompt ensuite les compteurs d'appartenance multidiffusion dans le noyau. Lorsque le socket concerné se ferme, les décréments de ces compteurs modifient des entrées de table de pages. Le résultat, selon les chercheurs, est qu'un mappage de la mémoire utilisateur devient accessible en mode superviseur.
L'étape finale écrase un pointeur de fonction situé à une adresse noyau prévisible, ce qui permet d'exécuter avec les privilèges du noyau du code contrôlé par l'attaquant. Selon Calif, la chaîne ne nécessite pas de vulnérabilité distincte de divulgation d'informations.
Une allocation déterministe affaiblit la randomisation du noyau
L'exploit repose également sur un placement prévisible des structures du noyau. Le rapport indique que les allocateurs du noyau au démarrage et best-fit d'OpenBSD ne randomisent pas leurs adresses de base. Les premières structures peuvent donc occuper les mêmes emplacements après des redémarrages sur le même matériel.
Les pointeurs de fonction concernés sont associés aux gestionnaires des interfaces réseau lo0 et enc0.
Le chercheur Andrew Griffiths explique que KARL relinke le noyau pour modifier la position des fonctions et des données, alors que les allocateurs restent eux-mêmes déterministes. Calif affirme que sa chaîne contourne KARL, SMAP et SMEP.
Ces constats concernent des couches de protection différentes : randomiser l'image du noyau ne randomise pas nécessairement chaque objet alloué ensuite. Un comportement prévisible de l'allocateur peut donc fournir à l'exploit des cibles stables, même lorsque le code et les données du noyau ont été relinkés.
Les correctifs sont disponibles via syspatch
Le dépassement d'entier en mémoire partagée a été corrigé dans l'errata 018, publié le 14 septembre. Le rapport indique qu'OpenBSD a classé cette mise à jour comme correctif de fiabilité et non de sécurité. Elle a également été livrée pour OpenBSD 7.8.
Le use-after-free a été corrigé dans l'errata 026, publié le 30 septembre et classé comme correctif de sécurité. Les deux mises à jour sont disponibles via syspatch, s'appliquent à toutes les architectures et doivent être installées lorsqu'elles sont concernées.
Les administrateurs d'OpenBSD 7.9 doivent vérifier que les errata 018 et 026 sont bien présents, plutôt que de considérer la première mise à jour comme une simple correction de stabilité opérationnelle. Les utilisateurs d'OpenBSD 7.8 doivent s'assurer d'avoir reçu les mises à jour syspatch applicables, y compris le correctif de l'errata 018 documenté pour cette version.
Calif propose aussi quatre défenses plus générales : le safe-unlinking pour les listes chaînées du noyau, la randomisation du mappage auto-référencé des tables de pages, la randomisation de l'allocateur du noyau et la vérification des bornes assistée par le compilateur. Il s'agit de recommandations de durcissement, et non de correctifs annoncés comme livrés avec les deux errata.




