
CVE-2021-3156 (Baron Samedit) Report and Research
Auteur : IJ Baig
Date : 7 juillet 2026
1.8.2 à 1.8.31p2, et versions stables 1.9.0 à 1.9.5p1.1.9.5p1Pour analyser cette vulnérabilité en toute sécurité, la version vulnérable de Sudo a été compilée dans un environnement isolé et non productif.

Le code source de Sudo 1.9.5p1 a été téléchargé et compilé localement en utilisant les utilitaires make standards. On a pris soin de l'exécuter depuis un répertoire local afin qu'il n'écrase pas le binaire sudo natif et patché du système hôte.

Confirmation de compilation : Après la compilation, le binaire personnalisé a été exécuté pour vérifier que la version vulnérable correcte avait été construite.


plugins/sudoers/sudoers.cset_cmnd() (environ à la ligne 864 dans la version 1.9.5p1)
Imaginez que vous ayez un assistant dont le travail consiste à supprimer les caractères d'échappement (antislashs) d'une liste de mots avant de les placer dans une boîte de stockage nouvellement allouée (un tampon de tas). L'assistant suppose aveuglément que chaque antislash est toujours suivi d'un caractère valide, donc chaque fois qu'il voit un antislash, il le saute et copie le caractère suivant.
Cependant, une faille existe dans la façon dont le programme gère les arguments lors de l'exécution de sudoedit -s. Elle permet à un utilisateur d'introduire un mot qui se termine exactement par un antislash (\), immédiatement suivi par le marqueur invisible de fin de mot (un terminateur nul, \0).
Lorsque le code de l'assistant atteint cet antislash final, il le saute et regarde le caractère suivant—le terminateur nul. Au lieu de s'arrêter, la logique de l'instruction if force l'assistant à sauter également le terminateur nul. La boucle continue, copiant toute mémoire arbitraire hors limites qui suit dans la boîte de stockage. Cette copie continue au-delà de la longueur prévue du mot provoque un débordement du tampon désigné, conduisant à un grave débordement de tampon basé sur le tas.
Extrait de code vulnérable :
/* Unescape characters, skipping over backslashes */
for (to = user_args, av = NewArgv + 1; (from = *av); av++) {
while (*from) {
// VULNERABILITY: If from[0] is '\' and from[1] is '\0',
// the loop evaluates to true, increments 'from', skipping the null terminator.
if (from[0] == '\\' && !isspace((unsigned char)from[1]))
from++;
*to++ = *from++;
}
*to++ = ' ';
}
*--to = '\0';
Les développeurs de Sudo ont corrigé cette erreur de logique dans la version 1.9.5p2 en ajoutant un contrôle strict des limites. Le code vérifie désormais explicitement que le caractère suivant l'antislash n'est pas le terminateur nul avant de tenter de le déséchapper.
Différence du correctif :
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
Pourquoi cela corrige la cause racine :
L'ajout de from[1] != '\0' arrête immédiatement la lecture hors limites. Désormais, si le code rencontre un antislash final à la toute fin de la chaîne (ce qui signifie que from[1] est le terminateur nul), l'instruction if est évaluée à faux. Le pointeur n'est pas incrémenté prématurément, le terminateur nul est traité correctement comme la fin de la chaîne, et la boucle se termine en toute sécurité sans déborder le tas.
Pour cette reproduction, l'exploit Python largement reconnu développé par le chercheur en sécurité Worawit (plus précisément la variante exploit_nss.py) a été utilisé.
Avant d'exécuter le PoC, il est essentiel de comprendre son fonctionnement. Le script ne se contente pas de faire planter le programme ; il orchestre une manipulation très précise de la mémoire pour obtenir l'exécution de code.
Voici le détail étape par étape des opérations du PoC :
.so). Cette charge utile est conçue pour exécuter /bin/sh en tant que root.LC_ALL, LANG et TZ). Étant donné que Sudo charge les variables d'environnement sur le tas au démarrage, le script calcule les tailles exactes nécessaires pour disposer le tas dans une disposition prévisible.sudoedit -s et passe un argument de ligne de commande se terminant par un antislash. Cela déclenche la vulnérabilité de décalage d'un (off-by-one) discutée dans la section 2, provoquant une écriture hors limites.service_user. Cette structure est utilisée par le Name Service Switch (NSS) pour rechercher des informations système.service_user est corrompue pour pointer vers la bibliothèque .so malveillante compilée à l'étape 1. Lorsque Sudo tente de rechercher les privilèges de l'utilisateur, il charge et exécute aveuglément la bibliothèque de l'attaquant, accordant un shell root.Tout d'abord, un test de crash de base a été effectué pour prouver l'existence de la vulnérabilité sans l'exploiter.

Ensuite, le script complet exploit_nss.py de Worawit a été exécuté contre le binaire vulnérable.

Pour vérifier le correctif officiel, le même déclencheur PoC a été exécuté contre le binaire Sudo patché.
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Sudo, un programme d'administration standard utilisé sur nos serveurs, contient une faille critique dans la façon dont il traite les entrées de texte contenant des antislashs. En envoyant soigneusement une commande malformée, un attaquant disposant d'un accès utilisateur de base peut tromper le système pour qu'il écrive des données en dehors de sa zone mémoire désignée. Cette erreur lui permet de contourner complètement les contrôles de sécurité et d'obtenir un contrôle administratif total et non autorisé sur la machine sans jamais avoir besoin de mot de passe.
Défis : L'un des principaux défis était la fragilité de la manipulation du tas. Les charges utiles d'exploit ciblant des versions spécifiques de système d'exploitation échouent souvent sur d'autres car la bibliothèque C standard sous-jacente (glibc) gère les blocs mémoire différemment. L'exploitation réussie de cette vulnérabilité nécessitait une compréhension exacte de l'alignement mémoire et des dispositions des variables d'environnement (Feng Shui du tas) spécifiques à l'environnement cible.
Leçons apprises : D'un point de vue défensif et des opérations de sécurité, cette analyse approfondie a renforcé plusieurs concepts critiques :
sudoedit -s suspectes se terminant par des caractères d'échappement pourrait permettre à une équipe SOC de détecter les tentatives d'exploitation avant qu'un patch ne soit entièrement déployé sur l'infrastructure.CVE parallèle : CVE-2019-14287 (Contournement de sécurité Sudo)
Une autre vulnérabilité importante dans la même base de code Sudo partage un modèle de cause racine similaire : une analyse et une validation incorrectes de l'entrée utilisateur. Dans CVE-2019-14287, un défaut logique dans la façon dont Sudo analysait l'ID utilisateur (UID) permettait à un attaquant d'exécuter des commandes en tant que root en spécifiant l'ID utilisateur -1 ou 4294967295.
Le parallèle : Alors que Baron Samedit (CVE-2021-3156) est un défaut de corruption mémoire et CVE-2019-14287 un contournement d'autorisation, la cause racine dans les deux cas est une défaillance dans la logique d'analyse initiale des arguments. Les deux vulnérabilités proviennent du fait que Sudo fait confiance et gère incorrectement des arguments de ligne de commande marginaux (antislashs finaux vs. enveloppements d'entiers inattendus) avant d'exécuter ses fonctions privilégiées principales.
Déclaration de sécurité et d'éthique : Toute exploitation et tout test démontrés dans ce rapport ont été entièrement menés dans une machine virtuelle locale isolée et autorisée. Aucun système de production ni réseau non autorisé n'a été ciblé ou sollicité au cours de cet exercice.