Bug de 25 años en el kernel de iOS causa fallos en sockets UNIX

Fuentes: 25-year-old iOS kernel bug causes UNIX socket failures

Un desarrollador ha identificado un error lógico de 25 años en el kernel de iOS que provoca fallos deterministas en la inicialización de sockets de dominio UNIX. El hallazgo surgió durante una presentación técnica en la conferencia DEFCON 34, donde una demostración de un exploit de día uno en un entorno de máquina virtual (VM) dentro de una aplicación iOS se rompió al arrancar por primera vez tras un reinicio del dispositivo. A diferencia de los fallos aleatorios, este error ocurría siempre en la primera ejecución, lo que sugirió una condición de inicialización específica.

La investigación reveló que el problema residía en la función uipc_sense del kernel, que asigna números de inode a los sockets. El bug consistía en la lógica de asignación: el código incrementaba el contador global unp_ino antes de asignar el valor al socket, lo que permitía que el primer socket asignado recibiera un inode de 0. Dado que el código asumiía que 0 significaba un inode no inicializado, la segunda llamada a fstat sobre ese socket cambiaba su inode, causando una inconsistencia que el sistema de archivos detectaba y provocaba un pánico (crash). El desarrollador determinó que este error existía desde la versión 123.5 de XNU, lanzada en marzo de 2001 con Mac OS X 10.0, y que la corrección es trivial en el nivel del kernel, aunque requiere ajustes en el código de usuariospace para compatibilidad con versiones anteriores.