flawopen.com/Teardowns/cve-2021-3156-sudo-baron-samedit
Технический анализ Baron Samedit (CVE-2021-3156): как завершающий обратный слэш в аргументах sudo позволял любому локальному пользователю стать root.
Представьте себе клерка, который обрабатывает анкеты по правилу: символ обратного слэша означает 'скопируй следующий знак дословно'. Злоумышленник подает анкету с одиноким слэшем на конце, и клерк выходит за границы листа, переписывая служебные печати на соседнем документе в стопке.
бинарник setuidпереполнение кучилокальное повышение привилегийОсновная причина заключается в невалидированных граничных параметрах в системах с открытым исходным кодом, что приводит к рассинхронизации состояний и обходу средств безопасности.
Unprivileged user executes 'sudoedit -s \', bypassing normal argument escaping flags.
The unescape pointer jumps past the null byte delimiter into uninitialized heap memory.
The heap overflow overwrites the sudo_nss service structure in glibc.
Sudo loads an attacker-controlled shared library (/tmp/libnss_x.so.2) as root, granting instant root shell access.
/* 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 */
/* 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';