
CVE-2021-3156 (Baron Samedit) Informe e Investigación
Autor: IJ Baig
Fecha: 7 de julio de 2026
1.8.2 a 1.8.31p2, y versiones estables 1.9.0 a 1.9.5p1.1.9.5p1Para analizar esta vulnerabilidad de forma segura, la versión vulnerable de Sudo se compiló en un entorno aislado y ajeno a producción.

El código fuente de Sudo 1.9.5p1 se descargó y compiló localmente utilizando las utilidades estándar de make. Se tuvo cuidado de ejecutar esto desde un directorio local para que no sobrescribiera el binario sudo nativo y parcheado del sistema anfitrión.

Confirmación de compilación: Después de la compilación, se ejecutó el binario personalizado para verificar que se había compilado la versión vulnerable correcta.


plugins/sudoers/sudoers.cset_cmnd() (alrededor de la línea 864 en la versión 1.9.5p1)
Imagina que tienes un asistente cuyo trabajo es eliminar los caracteres de escape (barras invertidas) de una lista de palabras antes de colocarlas en una caja de almacenamiento recién asignada (un búfer del montón). El asistente asume ciegamente que cada barra invertida siempre va seguida de un carácter válido, así que cada vez que ve una barra invertida, la omite y copia el siguiente carácter.
Sin embargo, existe una falla en cómo el programa maneja los argumentos al ejecutar sudoedit -s. Permite que un usuario introduzca una palabra que termina exactamente con una barra invertida (\), seguida inmediatamente por el marcador invisible de fin de palabra (un terminador nulo, \0).
Cuando el código del asistente llega a esta barra invertida al final, la omite y mira el siguiente carácter—el terminador nulo. En lugar de detenerse, la lógica de la sentencia if obliga al asistente a omitir también el terminador nulo. El bucle continúa, copiando en la caja de almacenamiento cualquier memoria arbitraria fuera de los límites que venga a continuación. Esta copia continua más allá de la longitud prevista de la palabra desborda el búfer designado, lo que provoca un grave desbordamiento de búfer basado en montón.
Fragmento de código vulnerable:
/* 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';
Los desarrolladores de Sudo corrigieron este error lógico en la versión 1.9.5p2 añadiendo una comprobación estricta de límites. El código ahora garantiza explícitamente que el carácter que sigue a la barra invertida no sea el terminador nulo antes de intentar desescaparlo.
Diff del parche:
- if (from[0] == '\\' && !isspace((unsigned char)from[1]))
+ if (from[0] == '\\' && from[1] != '\0' && !isspace((unsigned char)from[1]))
Por qué esto corrige la causa raíz:
La adición de from[1] != '\0' detiene inmediatamente la lectura fuera de límites. Ahora, si el código encuentra una barra invertida al final de la cadena (lo que significa que from[1] es el terminador nulo), la sentencia if se evalúa como falsa. El puntero no se incrementa prematuramente, el terminador nulo se procesa correctamente como el final de la cadena, y el bucle termina de manera segura sin desbordar el montón.
Para esta reproducción, se utilizó el exploit Python ampliamente reconocido desarrollado por el investigador de seguridad Worawit (específicamente la variante exploit_nss.py).
Antes de ejecutar el PoC, es fundamental comprender su mecánica. El script no solo provoca un bloqueo del programa; orquesta una manipulación de memoria altamente precisa para obtener ejecución de código.
Aquí está el desglose paso a paso de las operaciones del PoC:
.so). Este payload está diseñado para ejecutar /bin/sh como root.LC_ALL, LANG y TZ). Debido a que Sudo carga las variables de entorno en el montón al iniciarse, el script calcula los tamaños exactos necesarios para organizar el montón en un diseño predecible.sudoedit -s y pasa un argumento de línea de comandos que termina en una barra invertida. Esto desencadena la vulnerabilidad off-by-one discutida en la Sección 2, provocando una escritura fuera de límites.service_user. Esta estructura es utilizada por el Name Service Switch (NSS) para buscar información del sistema.service_user es corrompida para apuntar a la librería .so maliciosa compilada en el Paso 1. Cuando Sudo intenta buscar los privilegios del usuario, carga y ejecuta ciegamente la librería del atacante, otorgando una shell de root.Primero, se realizó una prueba básica de bloqueo para demostrar que la vulnerabilidad existe sin llegar a armarla.

A continuación, se ejecutó el script completo exploit_nss.py de Worawit contra el binario vulnerable.

Para verificar la corrección oficial, se ejecutó el mismo desencadenante del PoC contra el binario de Sudo parcheado.
sudoedit -s '\' 2>&1 | grep -q "sudoedit:" && echo "Vulnerable" || echo "Not vulnerable"

Sudo, un programa administrativo estándar utilizado en nuestros servidores, contiene una falla crítica en la forma en que procesa las entradas de texto que contienen barras invertidas. Al enviar cuidadosamente un comando mal formado, un atacante con acceso básico de usuario puede engañar al sistema para que escriba datos fuera de su área de memoria designada. Este error les permite eludir por completo los controles de seguridad y obtener control administrativo completo y no autorizado sobre la máquina sin necesidad de contraseña.
Desafíos: Uno de los principales desafíos fue la fragilidad de la manipulación del montón. Los payloads de exploits que apuntan a versiones específicas del sistema operativo a menudo fallan en otras porque la biblioteca estándar de C subyacente (glibc) gestiona los fragmentos de memoria de manera diferente. Armar con éxito esta vulnerabilidad requirió una comprensión exacta de la alineación de la memoria y los diseños de las variables de entorno (Heap Feng Shui) específicos del entorno objetivo.
Lecciones aprendidas: Desde una perspectiva defensiva y de operaciones de seguridad, esta inmersión profunda reforzó varios conceptos críticos:
sudoedit -s que terminen en caracteres de escape podría permitir a un equipo de SOC detectar intentos de explotación antes de que se implemente completamente un parche en la infraestructura.CVE paralelo: CVE-2019-14287 (Omisión de seguridad de Sudo)
Otra vulnerabilidad destacada dentro del mismo código base de Sudo comparte un patrón de causa raíz similar: análisis y validación incorrectos de la entrada del usuario. En CVE-2019-14287, una falla lógica en la forma en que Sudo analizaba el ID de usuario (UID) permitía a un atacante ejecutar comandos como root especificando el ID de usuario -1 o 4294967295.
El paralelismo: Mientras que Baron Samedit (CVE-2021-3156) es una falla de corrupción de memoria y CVE-2019-14287 es una omisión de autorización, la causa raíz en ambos casos es una falla en la lógica inicial de análisis de argumentos. Ambas vulnerabilidades se originan en que Sudo confía incorrectamente y maneja mal los argumentos de línea de comandos en casos límite (barras invertidas al final frente a envolturas inesperadas de enteros) antes de ejecutar sus funciones privilegiadas principales.
Declaración de seguridad y ética: Toda la explotación y pruebas demostradas en este informe se realizaron íntegramente dentro de una máquina virtual local aislada y autorizada. No se atacó ni interactuó con sistemas de producción o redes no autorizadas durante este ejercicio.