Un equipo de investigación ha documentado la explotación de una vulnerabilidad de 37 años de antigüedad en el kernel de OpenBSD, permitiendo la obtención de privilegios de root local. El fallo, que data de las fuentes originales de BSD, se debe a un desbalsamado de enteros en un contador de 16 bits que limita el número de adjuntos de memoria compartida a 32.767. Al forkear procesos repetidamente, este contador se envuelve a un valor negativo, lo que permite una condición de carrera que conduce a una escritura fuera de límites y, finalmente, a la ejecución de código en el kernel.
El exploit, que no requiere vulnerabilidades de revelación de información, logra la ejecución remota mediante una combinación de técnicas de memoria y protección de supervisor. El proceso implica mapear 127 segmentos de memoria compartida SysV, desvincularlos y forkear 259 procesos para saturar el contador. Posteriormente, se utiliza la función IPC_RMID para ganar la condición de carrera mientras se adjunta un nuevo segmento de memoria. La clave técnica reside en la alineación de las asignaciones de sockets IP y la manipulación de punteros predictibles en el kernel, aprovechando la falta de aleatorización en los asignadores de memoria de OpenBSD.
Para mitigar este riesgo, los investigadores proponen implementar 'safe-unlinking' para verificar invariantes de listas enlazadas antes de liberar memoria, y aleatorizar las direcciones de asignación de memoria en el arranque. Además, sugieren el uso de sanitizadores de límites de arrays en compiladores como Clang para prevenir futuras vulnerabilidades similares. Esta investigación destaca la importancia de la aleatorización de direcciones y la verificación de invariantes de memoria en sistemas operativos de código abierto.
