Seminario web destacado: Pruebas de API mejoradas con IA: un enfoque de prueba sin código | Vea ahora
Saltar a la sección
Analizando al barón Samedit (Sudo CVE-2021-3156)
Baron Samedit es una importante vulnerabilidad de desbordamiento de búfer que afecta al ecosistema Linux. Como una nueva forma de vulnerabilidad, no todo el mundo entiende qué es Baron Samedit y cómo puede afectar a las distribuciones de Linux/Unix. Esta publicación lo llevará a través de todo lo que necesita saber sobre esta pseudo vulnerabilidad.
Saltar a la sección
Saltar a la sección
El 26 de enero de 2021, Qualys publicó un blog describiendo sus hallazgos sobre la vulnerabilidad de desbordamiento de pila en sudo, CVE-2021-3156, al que llamaron "Baron Samedit".
Sudo es una herramienta central en muchas distribuciones diferentes de Linux / Unix que permite a los usuarios ejecutar programas con privilegios de seguridad elevados. Es un componente que comúnmente se incluye e instala con Linux, BSD, macOS, AIX, Solaris y otros.
Analizando Baron Samedit (CVE-2021-3156) con Insure ++
Voy a demostrar Parasoft Asegurar ++ detección de sobre-lectura y sobreescritura de memoria usando esta vulnerabilidad. Insure ++ es una herramienta de depuración de memoria que utiliza técnicas de instrumentación patentadas para identificar fugas y otros problemas de memoria.
Insure ++ hace que descubrir, comprender y corregir estos errores sea mucho más fácil que utilizar las herramientas y técnicas de depuración tradicionales.
Descripción general de la vulnerabilidad de Baron Samedit (CVE-2021-3156)
Cuando las versiones vulnerables de sudo (v1.8.2 - v1.9.5p1) se ejecutan con un comando en modo shell y el argumento de la línea de comando termina en una sola barra invertida, un desbordamiento del búfer del argumentos_usuario La cadena se produce debido a una falla en la forma en que se realiza la eliminación de los argumentos de la línea de comandos.
Al eliminar el escape del último carácter '\', la función sobrescribirá el terminador nulo de la cadena, lo que provocará un desbordamiento del búfer. Para obtener un desglose completo de la vulnerabilidad, consulte el original Blog de Qualys. Cubriré detalles similares cuando analicemos los resultados de Insure ++.
Configuración con Insure ++
Para replicar la vulnerabilidad en Insure ++, necesitamos descargar una versión vulnerable de sudo y compilarla usando Insure ++. La fuente de sudo v1.9.5p1, la última versión vulnerable, está disponible aquí en el sitio web de sudo. Después de desempaquetar el código fuente, asegúrese de que Insure ++ esté en su TRAYECTORIA y configura tu CC a "asegurar gcc" antes de ejecutar configure.
También debe considerar establecer un prefijo diferente para no anular el sudo del sistema, si corresponde. Desde aquí corre make make install como de costumbre.
Ejecutando el Exploit
El artículo de Qualys proporcionó un comando de prueba de concepto simple que demuestra la vulnerabilidad de desbordamiento del búfer. Es como sigue:
sudoedit -s '\' 'perl -e' imprime "A" x 65536 ''
Reemplaza sudoedit con la ruta al que compiló y ejecute el comando.
Podemos decir por el malloc mensaje de que la prueba de concepto se ejecutó correctamente.
Analizar resultados
Veamos qué encontró Insure ++ al examinar los resultados en la ventana de Insra.
Podemos ver que el primer error de memoria es un desbordamiento de lectura que ocurre en sudoers.c en la línea 971. Insra nos dice que el del El puntero lee un byte fuera del bloque de memoria de dos bytes al que apunta.
Tenga en cuenta que el bloque de memoria tiene dos bytes porque el primero es el carácter '\' y el segundo es el terminador nulo. Un seguimiento de pila nos muestra que esto ocurre en el set_cmnd () función.
El siguiente error de memoria es una lectura de una dirección incorrecta en sudoers.c en la línea 972. Desde el del puntero ya está fuera de los límites, como vimos en el primer error de memoria, cualquier acceso indexado usando del será un índice incorrecto.
El siguiente error de memoria es un desbordamiento de lectura que se produjo en la línea 974. Aquí estamos eliminando la referencia al puntero fuera de límites. del y escribirlo en el búfer al que apunta el a puntero.
Tenga en cuenta que Insure ++ está rastreando el origen de estos bloques de memoria en todos los errores de memoria anteriores. Insure ++ es consciente de que el bloque de memoria que estamos leyendo está fuera de los límites de lo que se definió originalmente como argv parámetro en el principal() método en sudo.c.
El siguiente error de memoria es un desbordamiento de escritura en la misma declaración que antes. Ahora, Insure ++ se activa al escribir en el búfer el a el puntero apunta a. Tenga en cuenta que el tamaño del búfer a apunta es 65539 bytes. La cadena de comando de desbordamiento que proporcionamos en la prueba de concepto era un carácter '\', un espacio, 65536 caracteres 'A' y un terminador nulo implícito que totalizaba 65539 bytes.
El siguiente error de memoria ocurre fuera de if compruebe los caracteres '\'. ¿Por qué esto está provocando un desbordamiento de escritura ahora? Dado que los errores de memoria anteriores han corrompido a puntero para apuntar fuera de su bloque de memoria, todas las operaciones de escritura posteriores con este puntero resultarán en un desbordamiento de escritura.
Aquí vemos la corrupción de la memoria final donde el programa nulo termina la cadena. ¡Este es absolutamente el comportamiento correcto! Sin embargo, el desbordamiento de escritura se produce porque a El puntero está dañado y ya apunta fuera del bloque de memoria que debería estar.
Conclusión
Podemos ver que Parasoft Insure ++ ha facilitado mucho el análisis de esta vulnerabilidad de la memoria. Pudimos identificar rápidamente la ubicación de los desbordamientos de lectura y escritura posteriores, saber qué variables estaban involucradas y ver cómo el puntero no válido afectó las operaciones de memoria posteriores. Cuando se combina con una buena cobertura de pruebas y fuzzing, Insure ++ puede hacer que muchos errores de memoria complejos sean mucho más fáciles de entender, diagnosticar y corregir.