Investigadores de seguridad de Calif han publicado una prueba de concepto de exploit que, según afirman, da a un usuario local privilegios de root en OpenBSD 7.9. La cadena combina un desbordamiento de enteros en memoria compartida, un uso tras liberación con conteo de referencias y una escritura fuera de límites en el kernel.
Según el relato de The Hacker News sobre la investigación de Calif, la firma reportó las fallas a OpenBSD «a principios de este año» y, posteriormente, publicó un análisis técnico detallado y el código completo del PoC en GitHub.
El ataque descrito requiere acceso local. El informe no ofrece pruebas de que las vulnerabilidades se hayan explotado en ataques reales. Ninguna de las dos fallas había recibido un identificador CVE en el momento de la publicación.
Un contador de 16 bits abre la cadena de exploits
El problema inicial está en la función de adjuntar asociada a shmat(4), que conecta un proceso a un segmento de memoria compartida. OpenBSD lleva la cuenta de los adjuntos mediante shm_nattch, un short con signo de 16 bits cuyo valor máximo es 32.767.
Calif rastreó ese tipo de dato hasta el código fuente de BSD de 1988. Como el campo nunca se amplió, un aumento suficiente del número de adjuntos puede hacer que supere su límite positivo y se desborde hasta un valor negativo.
En la PoC de los investigadores, se asignan 127 segmentos de memoria compartida y se bifurcan 259 procesos. Según se informa, esa secuencia lleva el contador más allá de su máximo y lo deja en −32.643.
El desbordamiento por sí solo no concede privilegios elevados. Calif explicó que una condición de carrera posterior al desbordamiento provoca un conteo de referencias incorrecto y un uso tras liberación: el kernel libera memoria que otros procesos siguen referenciando.
Una escritura posterior fuera de límites corrompe después los contadores de membresía multicast del kernel. Cuando se cierra el socket correspondiente, los decrementos de esos contadores alteran las entradas de la tabla de páginas. Según los investigadores, el resultado es que un mapeo de memoria de usuario pasa a ser accesible en modo supervisor.
La etapa final sobrescribe un puntero de función en una dirección predecible del kernel, lo que permite ejecutar código controlado por el atacante con privilegios de kernel. Calif afirma que la cadena no necesita una vulnerabilidad aparte de divulgación de información.
La asignación determinista debilita la aleatorización del kernel
El exploit también depende de una ubicación predecible de las estructuras del kernel. El informe indica que los asignadores de kernel de OpenBSD, tanto el de arranque como el best-fit, no aleatorizan sus direcciones base. Por tanto, las estructuras iniciales pueden ocupar las mismas posiciones tras reiniciar en el mismo hardware.
Los punteros de función relevantes están asociados a los manejadores de las interfaces de red lo0 y enc0.
El investigador Andrew Griffiths explicó que KARL reenlaza el kernel para cambiar la posición de funciones y datos, pero los asignadores siguen siendo deterministas. Calif afirma que su cadena evita KARL, SMAP y SMEP.
Estos hallazgos afectan a capas de protección distintas: aleatorizar la imagen del kernel no aleatoriza necesariamente cada objeto que se asigna después. Por consiguiente, un comportamiento predecible del asignador puede proporcionar al exploit objetivos estables incluso cuando el código y los datos del kernel han sido reenlazados.
Las correcciones están disponibles mediante syspatch
El desbordamiento de enteros en memoria compartida se corrigió en la errata 018, publicada el 14 de septiembre. El informe indica que OpenBSD clasificó esa actualización como una corrección de fiabilidad y no de seguridad. Además, también se distribuyó a OpenBSD 7.8.
El uso tras liberación se corrigió en la errata 026, publicada el 30 de septiembre y clasificada como corrección de seguridad. Ambas actualizaciones están disponibles mediante syspatch, se aplican a todas las arquitecturas y deben instalarse donde corresponda.
Los administradores que ejecutan OpenBSD 7.9 deben verificar que están presentes tanto la errata 018 como la 026, en lugar de tratar la primera actualización solo como una corrección de estabilidad operativa. Los usuarios de OpenBSD 7.8 deben asegurarse de haber recibido las actualizaciones syspatch aplicables, incluida la corrección de la errata 018 documentada para esa versión.
Calif propuso además cuatro defensas más amplias: safe-unlinking para las listas enlazadas del kernel, aleatorización del mapeo autorreferencial de la tabla de páginas, aleatorización del asignador del kernel y comprobación de límites asistida por el compilador. Son recomendaciones de endurecimiento, no correcciones que se informe que se hayan publicado junto con las dos erratas.




