
CVE-2021-3156 (Baron Samedit) Bericht und Recherche
Autor: IJ Baig
Datum: 7. Juli 2026
1.8.2 bis 1.8.31p2 sowie stabile Versionen 1.9.0 bis 1.9.5p1.1.9.5p1Um diese Schwachstelle sicher zu analysieren, wurde die verwundbare Sudo-Version in einer isolierten Nicht-Produktionsumgebung kompiliert.

Der Quellcode für Sudo 1.9.5p1 wurde heruntergeladen und mithilfe der Standard-make-Werkzeuge lokal kompiliert. Dabei wurde darauf geachtet, dies aus einem lokalen Verzeichnis heraus auszuführen, damit das native, gepatchte sudo-Binary des Hostsystems nicht überschrieben wurde.

Build-Bestätigung: Nach der Kompilierung wurde das benutzerdefinierte Binary ausgeführt, um zu verifizieren, dass die korrekte verwundbare Version erstellt wurde.


plugins/sudoers/sudoers.cset_cmnd() (etwa in Zeile 864 der Version 1.9.5p1)
Man stelle sich einen Helfer vor, dessen Aufgabe es ist, Escape-Zeichen (Backslashes) aus einer Liste von Wörtern zu entfernen, bevor er sie in eine neu zugewiesene Speicherbox (einen Heap-Puffer) legt. Der Helfer geht blind davon aus, dass auf jeden Backslash immer ein gültiges Zeichen folgt. Wann immer er also einen Backslash sieht, überspringt er ihn und kopiert das nächste Zeichen.
Allerdings gibt es einen Fehler in der Art und Weise, wie das Programm Argumente verarbeitet, wenn sudoedit -s ausgeführt wird. Es erlaubt einem Benutzer, ein Wort einzuschleusen, das exakt mit einem einzelnen Backslash (\) endet, auf den unmittelbar das unsichtbare Wortende-Kennzeichen (ein Null-Terminator, \0) folgt.
Wenn der Code des Helfers diesen abschließenden Backslash erreicht, überspringt er ihn und betrachtet das nächste Zeichen – den Null-Terminator. Statt anzuhalten, zwingt die Logik der if-Anweisung den Helfer, ebenfalls den Null-Terminator zu überspringen. Die Schleife läuft weiter und kopiert beliebigen, außerhalb der Grenzen liegenden Speicher, der als Nächstes kommt, in die Speicherbox. Dieses fortgesetzte Kopieren über die vorgesehene Wortlänge hinaus bringt den dafür vorgesehenen Puffer zum Überlaufen, was zu einem schwerwiegenden Heap-basierten Pufferüberlauf führt.
Codeausschnitt mit der Schwachstelle:
/* 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';
Die Sudo-Entwickler behoben diesen Logikfehler in Version 1.9.5p2, indem sie eine strikte Grenzprüfung hinzufügten. Der Code stellt jetzt explizit sicher, dass das Zeichen nach dem Backslash kein Null-Terminator ist, bevor versucht wird, es zu unescapen.
Patch-Diff:
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
Warum dies die Grundursache behebt:
Das Hinzufügen von from[1] != '\0' stoppt den Out-of-Bounds-Lesevorgang sofort. Wenn der Code nun am äußersten Ende der Zeichenkette auf einen abschließenden Backslash stößt (d. h. from[1] ist der Null-Terminator), wird die if-Anweisung als falsch ausgewertet. Der Zeiger wird nicht vorschnell erhöht, der Null-Terminator wird korrekt als Ende der Zeichenkette verarbeitet, und die Schleife endet sicher, ohne den Heap zum Überlaufen zu bringen.
Für diese Reproduktion wurde der weithin bekannte Python-Exploit verwendet, der vom Sicherheitsforscher Worawit entwickelt wurde (insbesondere die Variante exploit_nss.py).
Bevor der PoC ausgeführt wird, ist es entscheidend, seine Funktionsweise zu verstehen. Das Skript bringt das Programm nicht einfach zum Absturz; es orchestriert eine hochpräzise Manipulation des Speichers, um Codeausführung zu erlangen.
Hier ist die schrittweise Aufschlüsselung der Vorgänge des PoC:
.so). Dieser Payload ist dafür ausgelegt, /bin/sh als Root auszuführen.LC_ALL, LANG und TZ). Da Sudo Umgebungsvariablen beim Start in den Heap lädt, berechnet das Skript die exakten Größen, die erforderlich sind, um den Heap in einem vorhersehbaren Layout anzuordnen.sudoedit -s aus und übergibt ein Befehlszeilenargument, das mit einem einzelnen Backslash endet. Dies löst die in Abschnitt 2 behandelte Off-by-One-Schwachstelle aus und verursacht einen Out-of-Bounds-Schreibvorgang.service_user-Struktur. Diese Struktur wird vom Name Service Switch (NSS) verwendet, um Systeminformationen nachzuschlagen.service_user-Struktur wird so korrumpiert, dass sie auf die in Schritt 1 kompilierte schädliche .so-Bibliothek zeigt. Wenn Sudo versucht, Benutzerrechte nachzuschlagen, lädt und führt es blind die Bibliothek des Angreifers aus, was eine Root-Shell gewährt.Zunächst wurde ein einfacher Absturztest durchgeführt, um zu beweisen, dass die Schwachstelle existiert, ohne sie zu einer Waffe auszubauen.

Anschließend wurde das vollständige Worawit-Skript exploit_nss.py gegen das verwundbare Binary ausgeführt.

Um die offizielle Korrektur zu verifizieren, wurde exakt derselbe PoC-Auslöser gegen das gepatchte Sudo-Binary ausgeführt.
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Sudo, ein Standard-Administrationsprogramm, das auf unseren Servern eingesetzt wird, enthält einen kritischen Fehler bei der Verarbeitung von Texteingaben, die Backslashes enthalten. Indem ein Angreifer mit grundlegendem Benutzerzugriff gezielt einen fehlerhaft formatierten Befehl sendet, kann er das System dazu bringen, Daten außerhalb des dafür vorgesehenen Speicherbereichs zu schreiben. Dieser Fehler ermöglicht es ihm, Sicherheitskontrollen vollständig zu umgehen und ohne jemals ein Passwort zu benötigen, die volle, unbefugte administrative Kontrolle über die Maschine zu erlangen.
Herausforderungen: Eine der größten Herausforderungen war die Fragilität der Heap-Manipulation. Exploit-Payloads, die auf bestimmte Betriebssystemversionen abzielen, schlagen auf anderen häufig fehl, weil die zugrunde liegende Standard-C-Bibliothek (glibc) Speicherblöcke unterschiedlich verwaltet. Um diese Schwachstelle erfolgreich zu einer Waffe auszubauen, war ein genaues Verständnis der Speicherausrichtung und der Layouts der Umgebungsvariablen (Heap Feng Shui) erforderlich, die für die Zielumgebung spezifisch sind.
Gewonnene Erkenntnisse: Aus Sicht der Verteidigung und des Sicherheitsbetriebs hat diese Tiefenanalyse mehrere kritische Konzepte bekräftigt:
sudoedit -s-Befehle, die mit Escape-Zeichen enden, könnte einem SOC-Team ermöglichen, Exploit-Versuche zu erkennen, bevor ein Patch vollständig in der gesamten Infrastruktur ausgerollt ist.Parallele CVE: CVE-2019-14287 (Sudo-Sicherheitsumgehung)
Eine weitere prominente Schwachstelle in genau derselben Sudo-Codebasis weist ein ähnliches Grundursachenmuster auf: unsachgemäßes Parsen und Validieren von Benutzereingaben. Bei CVE-2019-14287 ermöglichte ein Logikfehler bei der Art, wie Sudo die Benutzer-ID (UID) analysierte, einem Angreifer, Befehle als Root auszuführen, indem er die Benutzer-ID -1 oder 4294967295 angab.
Die Parallele: Während Baron Samedit (CVE-2021-3156) ein Speicherkorruptionsfehler ist und CVE-2019-14287 eine Autorisierungsumgehung, ist die Grundursache in beiden Fällen ein Versagen der anfänglichen Argument-Parsing-Logik. Beide Schwachstellen rühren daher, dass Sudo Edge-Case-Befehlszeilenargumente (abschließende Backslashes gegenüber unerwarteten Integer-Überläufen) fälschlicherweise vertraut und falsch behandelt, bevor es seine zentralen privilegierten Funktionen ausführt.
Sicherheits- und Ethik-Erklärung: Alle in diesem Bericht demonstrierten Exploit- und Testaktivitäten wurden vollständig in einer isolierten, autorisierten lokalen virtuellen Maschine durchgeführt. Während dieser Übung wurden keine Produktionssysteme oder nicht autorisierten Netzwerke angegriffen oder mit ihnen interagiert.