flawopen.com/Teardowns/cve-2021-3156-sudo-baron-samedit

● CVE-2021-3156 · CVSS 9.8 · Kritisch
Sicherheitsforschung · FlawOpen

CVE-2021-3156: Sudo Baron Samedit Heap-Überlauf

Technische Analyse von Baron Samedit (CVE-2021-3156): Wie ein Backslash am Argumentende in sudo jedem lokalen Benutzer unbeschränkten Root-Zugriff verschaffte.

💡 Einfache Erklärung (ELI5)

Stellen Sie sich einen Sachbearbeiter vor, der Formulare prüft: Ein Backslash bedeutet 'interpretiere das nächste Zeichen wörtlich'. Endet ein Formular auf einen Backslash, liest er über den Seitenrand hinaus und überschreibt administrative Sicherheitsberechtigungen auf nachfolgenden Dokumenten.

Kernkonzepte & Begriffe

Setuid-Binärdatei
Ein Programm, das mit den Rechten seines Besitzers (root) ausgeführt wird.
Heap-Überlauf
Schreiben über die Grenzen einer Heap-Speicherallokation hinaus.
Lokale Rechteausweitung
Erlangung vollständiger Root-Rechte von einem nicht privilegierten Konto aus.

Ursachenanalyse

Die Grundursache liegt in nicht validierten Grenzparametern in Open-Source-Systemen, die eine Zustandsdesynchronisation und die Umgehung von Sicherheitskontrollen ermöglichen.

Schritt-für-Schritt Angriffsablauf

Step 1

Trailing Backslash Injection

Unprivileged user executes 'sudoedit -s \', bypassing normal argument escaping flags.

Step 2

Unterminated Buffer Traversal

The unescape pointer jumps past the null byte delimiter into uninitialized heap memory.

Step 3

Heap Corruption of Service Structures

The heap overflow overwrites the sudo_nss service structure in glibc.

Step 4

Root Privilege Escalation

Sudo loads an attacker-controlled shared library (/tmp/libnss_x.so.2) as root, granting instant root shell access.

Quellcode: Verwundbar vs. Sicher

✕ VERWUNDBARE IMPLEMENTIERUNG
/* VULNERABLE: Unescape loop skips past string termination null byte */
for (to = user_args, from = NewArgv[0]; *from != '\0'; from++) {
    if (from[0] == '\\' && !isspace((unsigned char)from[1]))
        from++; /* BUG: If from[1] == '\0', loop skips past null terminator! */
    *to++ = *from;
}
*to = '\0'; /* Corrupts adjacent heap chunks with root auth structures */
✓ GEHÄRTETER SICHERHEITS-PATCH
/* FIXED: Explicitly check that from[1] is neither space nor the null byte */
for (to = user_args, from = NewArgv[0]; *from != '\0'; from++) {
    if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
        from++;
    *to++ = *from;
}
*to = '\0';

Checkliste für Engineering & Systemsicherheit

References