
Exploit de preuve de concept pour la corruption des registres de débogage ptrace du noyau Linux (CVE-2018-1000199), démontrant une gestion incorrecte des erreurs dans la virtualisation des points d'arrêt.
Le code ptrace de Linux virtualise l'accès aux registres de débogage, et le code de virtualisation a une gestion d'erreurs incorrecte. Cela signifie que si vous écrivez une valeur illégale dans, par exemple, DR0, l'état interne du suivi des points d'arrêt du noyau peut devenir corrompu malgré le fait que l'appel ptrace() renvoie -EINVAL.
À titre d'exemple, vous pouvez trouver l'adresse de do_debug dans /proc/kallsyms sur un noyau x86 et passer cette adresse au PoC joint. Je soupçonne que d'autres architectures que x86 sont également affectées, mais je n'ai pas essayé de l'exploiter. Le bogue lui-même est disséminé un peu partout dans le noyau, dans le code générique et spécifique à l'architecture.
Je n'ai pas trouvé de moyen évident d'obtenir une escalade de privilèges en utilisant ce bogue, mais cela pourrait exister. Par exemple, il est plausible qu'en utilisant ce bogue pour cibler le gestionnaire NMI de perf, on puisse provoquer un débordement de la pile NMI, entraînant diverses formes de corruption. Je n'ai pas essayé d'analyser l'impact sur les architectures non-x86 car je ne connais que le fonctionnement des points d'arrêt x86, mais les effets du bogue pourraient être très différents.
Linus a principalement corrigé ce problème en amont dans le commit f67b15037a7a50c57f72e69a6d59941ad90a0f0f. Avec ce commit appliqué, la gestion d'erreurs est toujours incorrecte, mais le défaut aboutit à un point d'arrêt désactivé au lieu d'un point d'arrêt incorrect.
http://man7.org/linux/man-pages/man2/ptrace.2.html
Exemple d'utilisation : $ ./PoC.exe ffffffff81b44400