Investigadores demuestran exploit de root en OpenBSD encadenando un fallo de memoria compartida de hace 37 años

Un exploit de escalada de privilegios local publicado hoy obtiene root en OpenBSD 7.9 al encadenar un desbordamiento de entero de aproximadamente 37 años con una falla del kernel separada, evitando la aleatorización de direcciones del kernel KARL de OpenBSD y sus protecciones de hardware SMAP y SMEP. La firma de seguridad Calif, que encontró y reportó los fallos, publicó un análisis detallado y el código de prueba de concepto completo después de que OpenBSD enviara parches para ambos problemas en septiembre.

El desbordamiento de entero en la función de conexión shmat(4) se corrigió en la errata 018, enviada el 14 de septiembre como una solución de confiabilidad. El use-after-free por conteo de referencias que completa la cadena se corrigió por separado en la errata 026, enviada el 30 de septiembre como una solución de seguridad.

Ambas están disponibles a través de syspatch y cubren todas las arquitecturas. OpenBSD 7.8 también recibió la corrección del desbordamiento de entero.

El desbordamiento de entero, el punto de entrada para la cadena completa, se clasifica como una corrección de confiabilidad, no como una corrección de seguridad.

No se ha asignado ningún CVE para ninguno de los fallos hasta la publicación. No hay evidencia de que las vulnerabilidades hayan sido utilizadas en ataques.

El contador de conexiones de memoria compartida shm_nattch está definido como un short de 16 bits con signo con un valor máximo de 32,767 en las fuentes BSD originales que datan de 1988. OpenBSD heredó el tipo y nunca lo amplió.

El exploit mapea 127 segmentos de memoria compartida y bifurca 259 procesos, llevando el contador más allá de su máximo y envolviéndolo a −32,643. Una condición de carrera luego desencadena un use-after-free: el conteo de referencias corrupto hace que el kernel libere memoria que otros procesos aún utilizan.

Una escritura fuera de límites separada sobrescribe los contadores de membresía de multidifusión en el kernel. Cuando el socket afectado se cierra, los decrementos resultantes modifican las entradas de la tabla de páginas, cambiando una asignación de memoria de usuario a accesible para el supervisor y evitando SMAP y SMEP. El exploit luego sobrescribe un puntero de función en una dirección de kernel predecible para ejecutar su propio código.

"Si bien KARL de OpenBSD vuelve a enlazar el binario del kernel para aleatorizar tanto las direcciones de funciones como de datos, los asignadores de memoria del kernel siguen siendo deterministas", escribió el investigador Andrew Griffiths.

Tanto el asignador de tiempo de arranque como el de mejor ajuste carecen de aleatorización de dirección base, por lo que las estructuras de arranque temprano, incluidos los punteros de función en los manejadores de interfaz de red lo0 y enc0, terminan en las mismas direcciones en cada reinicio en el mismo hardware. El exploit no necesita ninguna vulnerabilidad de divulgación de información.

Más allá de las dos erratas, Calif propone cuatro categorías de endurecimiento: desvinculación segura para listas enlazadas del kernel (ya utilizada por FreeBSD y NetBSD), aleatorización del mapeo autorreferencial de la tabla de páginas, aleatorización del asignador del kernel y verificación de límites basada en el compilador.

Calif dijo que reportó los fallos a OpenBSD "a principios de este año". El código de explotación de prueba de concepto está disponible en GitHub.

Cybersecurity
Cybersecurity

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *