La vulnérabilité CVE-2024-6387, surnommée regreSSHion, a récemment été découverte par l’équipe de recherche de menaces de Qualys. Cette faille fait resurgir une vulnérabilité corrigée en 2006.
Qu’est-ce que la CVE-2024-6387 ?
Cette nouvelle vulnérabilité touche le serveur OpenSSH (sshd). Elle se manifeste lorsque le client échoue à s’authentifier dans le délai fixé par LoginGraceTime
. Par défaut, ce délai est de 120 secondes dans les versions récentes et de 600 secondes dans les versions plus anciennes. Si ce délai est dépassé, le gestionnaire de signaux SIGALARM
de ssh est déclenché. Le problème vient du fait que ce gestionnaire appelle des fonctions non sécurisées comme syslog()
.
Une vulnérabilité qui n’est pas entièrement nouvelle
RegreSSHion réactive une vieille faille de sécurité datant de 2006 avec OpenSSH 4.4. Lors d’un commit, une directive cruciale (#ifdef DO_LOG_SAFE_IN_SIGHAND
) a été supprimée par erreur de la fonction sigdie()
désormais renommée sshsigdie()
.
Cette suppression rend la fonction vulnérable à nouveau. Elle utilise des fonctions comme syslog()
, qui dépendent de malloc()
et free()
, non sécurisées dans le contexte des signaux asynchrones. Cela peut entraîner une corruption de la mémoire et potentiellement une exécution de code arbitraire.
Voici un résumé de la situation :
- OpenSSH < 4.4p1 : Vulnérable à moins d’être patché pour la CVE-2006-5051 ou CVE-2008-4109.
- 4.4p1 ≤ OpenSSH < 8.5p1 : Non vulnérable grâce à la directive
#ifdef DO_LOG_SAFE_IN_SIGHAND
. - 8.5p1 ≤ OpenSSH < 9.8p1 : De nouveau vulnérable à cause de la suppression de cette directive.
Méthodes d’exploitation
Les attaquants peuvent exploiter cette vulnérabilité en manipulant les allocations de mémoire pour corrompre les structures du tas (heap). En particulier, la fonction malloc()
peut être interrompue par le signal SIGALRM
au moment précis où elle divise un grand bloc de mémoire libre en deux plus petits blocs. Si cette interruption se produit après que le premier bloc est retourné mais avant que la taille du second bloc ne soit initialisée, les attaquants peuvent manipuler la taille de ce second bloc pour qu’il chevauche d’autres blocs de mémoire, ce qui conduit à une corruption de la mémoire.
Les attaquants peuvent alors viser à corrompre une structure FILE
allouée par fopen()
dans le gestionnaire SIGALRM
. En écrivant un seul octet (_vtable_offset) de cette structure, ils peuvent contrôler un pointeur de fonction et exécuter du code arbitraire pendant l’appel à __fread_unlocked()
.
Solutions pour se protéger
Mise à jour d’OpenSSH
La meilleure solution est de mettre à jour OpenSSH à la version 9.8p1, qui corrige le problème et renforce la sécurité globale.
Mesure temporaire de contournement
Si la mise à jour n’est pas possible, Qualys conseille de modifier la valeur de LoginGraceTime
à 0 dans le fichier de configuration. Cette mesure empêche l’exécution de code arbitraire à distance mais rend la machine vulnérable à un déni de service à distance.