Varias vulnerabilidades confluyeron en un escenario para el que el sistema no estaba preparado

Un error que sobrevivió casi cuatro décadas de desarrollo de BSD ayudó a obtener el control total de la moderna OpenBSD. El especialista de la empresa Calif, Andrew Griffiths, demostró un código de explotación funcional llamado Big Fish, que eleva los privilegios de un usuario local ordinario a root. Para el ataque se requirió una cadena de varias fallas en el núcleo, no un único defecto antiguo.
La historia comenzó con el contador de conexiones a la memoria compartida System V. Los desarrolladores de la antigua BSD le asignaron un tipo entero con signo de 16 bits, que admite valores solo hasta 32 767. Cuando el número de conexiones supera ese límite, el contador se vuelve negativo. El error se mantuvo en el código heredado y permitió corromper el conteo de referencias a los objetos de memoria.
En la demostración, Calif creó 127 segmentos de memoria compartida y lanzó 259 procesos hijo. Tal combinación llevó el valor del contador a -32 643. Luego el código de explotación aprovechó una condición de carrera entre la eliminación de un segmento y una nueva conexión a la memoria. El núcleo pudo acceder a un objeto ya liberado, abriendo el camino para la siguiente fase del ataque.
El desbordamiento del contador por sí solo no fue suficiente para obtener root. Los autores vincularon el error de liberación de memoria con una escritura separada fuera del área asignada. La sustitución de datos en la estructura de un socket de red permitió manipular las tablas de páginas de memoria, cambiar los permisos de mapeo y preparar la ejecución de código a nivel del núcleo.
El código de explotación funcionó incluso con los mecanismos KARL, SMAP y SMEP activados. Las medidas de protección dificultan la búsqueda de direcciones en el núcleo y bloquean el acceso peligroso a la memoria de usuario. No obstante, Calif esquivó las restricciones sin una vulnerabilidad adicional para la filtración de direcciones. Ayudó el emplazamiento predecible de algunos objetos del núcleo, que se mantuvo a pesar de los mecanismos de protección.
Aunque KARL cambia la ubicación de funciones y datos del núcleo, los asignadores de memoria que usa OpenBSD no siempre eligen direcciones de forma aleatoria. Tras reinicios en un mismo equipo, determinadas estructuras acaban en lugares predecibles. El código de explotación usó los manejadores de las interfaces de red lo0 y enc0, y después de obtener root restauró el puntero modificado.
Los desarrolladores de OpenBSD publicaron correcciones antes de la publicación de Big Fish. La actualización 018 del 14 de septiembre de 2026 corrige el error en shmat, y la actualización 026 del 30 de septiembre cierra el problema del contador de referencias que podía provocar accesos a memoria liberada. Para OpenBSD 7.9 están disponibles parches vía syspatch. No se han publicado la evaluación CVSS ni la versión de la metodología para la cadena.
El código publicado confirma la posibilidad de una elevación de privilegios local, pero no indica ataques reales mediante Big Fish. Para explotar se necesita acceso para ejecutar programas en la máquina objetivo. Anteriormente, el lanzamiento de OpenBSD 7.9 ya estuvo acompañado de la discusión de otra falla que duró 27 años. La nueva cadena mostró que incluso varios niveles de protección del núcleo no eliminan el riesgo derivado del código antiguo.