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

● CVE-2021-3156 · CVSS 9.8 · Kritis
Riset Keamanan · FlawOpen

CVE-2021-3156: Luapan Heap pada Sudo Baron Samedit

Analisis teknis Baron Samedit (CVE-2021-3156): bagaimana karakter backslash di akhir argumen sudo memungkinkan pengguna lokal mendapatkan akses root instan.

💡 Penjelasan Sederhana (ELI5)

Bayangkan seorang petugas pemroses formulir yang memiliki aturan: garis miring terbalik berarti 'perlakukan karakter berikutnya secara harfiah'. Seseorang menyerahkan formulir yang diakhiri dengan garis miring terbalik, sehingga petugas terus membaca melewati tepi halaman dan menimpa dokumen izin administratif berikutnya.

Konsep Kunci & Istilah

biner setuid
Program yang berjalan dengan hak akses pemiliknya (root), bukan pemanggilnya.
luapan heap
Penulisan data melebihi batas alokasi memori heap, merusak struktur di dekatnya.
eskalasi hak istimewa lokal
Meningkatkan akses dari akun standar tanpa hak menjadi akses administrator root penuh.

Analisis Akar Masalah (Root Cause)

Akar masalah bermula dari parameter batas yang tidak divalidasi pada sistem open source, yang memungkinkan desinkronisasi status dan bypass kontrol keamanan.

Alur Serangan Langkah demi Langkah

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.

Kode Sumber: Rentan vs Aman

✕ IMPLEMENTASI RENTAN
/* 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 */
✓ PERBAIKAN AMAN & KUAT
/* 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';

Daftar Periksa Penguatan Sistem Rekayasa

References