En el vasto ecosistema de iOS, donde cada proceso está cuidadosamente gestionado para mantener la experiencia del usuario segura y fluida, existen APIs de bajo nivel que, aunque potentes y útiles, pueden convertirse en vectores para vulnerabilidades críticas si no se manejan adecuadamente. Un ejemplo emblemático de ello es la vulnerabilidad descubierta en el sistema de notificaciones Darwin, que permitía a cualquier aplicación, incluso con permisos mínimos o dentro de su sandbox, enviar una simple línea de código capaz de provocar un bloqueo del iPhone, dejándolo inutilizable hasta que se realizara un reinicio o un restaurado completo del sistema. Las notificaciones Darwin forman parte de una capa de comunicación interna en los sistemas operativos de Apple conocida como CoreOS. A diferencia de los sistemas de notificación más conocidos para desarrolladores, como NSNotificationCenter (limitado a un solo proceso) o NSDistributedNotificationCenter (que permite comunicación entre procesos), las notificaciones Darwin son un mecanismo incluso más simple y de bajo nivel. Estas notificaciones no transmiten objetos o cadenas complejas, sino un estado representado por un valor entero sin signo de 64 bits, típicamente usado para indicar un valor booleano simple, como 0 o 1.
El proceso para enviar o recibir notificaciones Darwin se realiza mediante funciones públicas accesibles para cualquier proceso, sin necesidad de permisos especiales o entitlements adicionales. Por ejemplo, una función como notify_post puede enviar una notificación con un identificador en forma de cadena, usualmente con un nombre que sigue la convención de dominios inversos, como com.apple.springboard.toggleLockScreen.
Por otro lado, las aplicaciones o procesos interesados en recibir estas señales pueden registrarse para ser notificados a través de notify_register_dispatch. El giro peligroso en esta historia radica en que cualquier aplicación, sin importar si proviene de la App Store o es completamente sandboxeada, puede tanto enviar como recibir estas notificaciones. Esto abrió las puertas a potenciales ataques de denegación de servicio, dado que ciertas notificaciones disparan eventos potentes a nivel del sistema o la interfaz del usuario. El descubrimiento ocurrió cuando el investigador de seguridad Guilherme Rambo analizó los procesos del sistema en versiones tempranas de iOS 18 y descubrió que varias aplicaciones y servicios del sistema utilizaban notificaciones Darwin para controlar operaciones críticas, como estados del dispositivo vinculados a la restauración desde copias de seguridad. Entre diversas posibles entidades afectadas, la más crítica resultó ser la notificación com.
apple.MobileSync.BackupAgent.RestoreStarted, cuyo envío provocaba que la interfaz de SpringBoard, la encargada de la experiencia de usuario en iOS, presentara el estado "Restore in Progress" o "Restauración en progreso". El problema es que esta notificación se acompañaba con un comportamiento predeterminado en el sistema para bloquear el dispositivo y mostrar una interfaz en la que el usuario debía reiniciar el equipo para salir del estado.
No existía ninguna forma alternativa para cancelar esta operación falsa de restauración desde la propia interfaz. La consecuencia directa es un bloqueo o soft brick del iPhone, donde la única solución efectiva es apagar y encender el dispositivo. Esto podía ser fácilmente explotado desde una aplicación maliciosa con solo ejecutar una línea de código: notify_post("com.apple.MobileSync.
BackupAgent.RestoreStarted") Este descubrimiento fue demoledor por su simplicidad y severidad, pues una sola línea de código tenía el poder de dejar inutilizable un dispositivo iOS moderno, afectando la usabilidad de cualquiera que tuviera un iPhone con esa vulnerabilidad sin necesidad de permisos privilegiados o hackeos complejos. Para profundizar en la forma en que este código dañino se ejecutaba repetidamente, el investigador desarrolló una aplicación de prueba llamada "EvilNotify". Sin embargo, el potencial real de explotación surgió con la creación del app extension tipo widget llamada "VeryEvilNotify". Los widgets en iOS, diseñados para funcionar en segundo plano mostrando datos actualizados, pueden ejecutarse incluso antes del primer desbloqueo del dispositivo y son invocados regularmente por el sistema para refrescar su contenido visual.
Al incorporar la notificación dañina en la entrada principal del widget y provocar que este widget fallara siempre de manera intencional (mediante un crash inducido con la función fatalError de Swift), se lograba que el sistema despertara el widget repetidamente. Esto generaba un ciclo infinito: el widget se ejecutaba, lanzaba la notificación, causaba que el sistema mostrara la pantalla de restauración, luego fallaba y se lanzaba nuevamente. Esta espiral dejaba el dispositivo sumido en un estado de bloqueo persistente, prácticamente inservible sin intervención manual y restauración desde cero. Además, como la aplicación podría terminar siendo includa en copias de seguridad, era probable que restaurar el dispositivo volviera a activar el problema, incrementando el riesgo de un DoS instalado de forma indirecta. Reconociendo la gravedad, el investigador reportó la vulnerabilidad a Apple en junio de 2024.
Tras un proceso de revisión y mitigación, Apple implementó restricciones en iOS 18.3 que introdujeron requisitos de entitlements específicos para enviar notificaciones Darwin sensibles o críticas. Estos entitlements tienen un formato de prefijo como com.apple.private.
darwin-notification.restrict-post.<notification>, que debe estar asociado al proceso para que el sistema permita que publique esa notificación. Este cambio implica que no cualquier proceso o aplicación puede ahora enviar estas señales críticas. En particular, la notificación vulnerada, ahora renombrada con un prefijo restrictivo, exige que para enviarla haya un entitlement específico, que solo poseen los procesos del sistema o aquellos con autorización explícita de Apple.
De esta manera, la probabilidad de explotación se redujo drásticamente y ataques como el descrito quedaron neutralizados. Más allá de la corrección puntual, este evento sacó a la luz una faceta poco conocida pero relevante del funcionamiento interno de iOS: el uso extenso de Darwin notifications como método de comunicación interprocesos y su potencial impacto para la seguridad y estabilidad del sistema. A partir de esta vulnerabilidad, desarrolladores y especialistas en seguridad han reforzado la importancia de monitorear y restringir no solo el acceso a APIs complejas o conocidas, sino también a aquellas interfaces de bajo nivel que aparentemente podrían parecer inofensivas. La historia también sirve para recordar cuáles son las líneas de defensa presentes en sistemas operativos modernos. Aunque iOS aplica diversos mecanismos sandbox, controles de permisos y validaciones estrictas sobre qué puede hacer una aplicación en un dispositivo, la existencia de APIs públicamente accesibles y simples puede convertirse en una brecha si no se ajustan con controles adicionales, como el uso de entitlements restringidos.
Para los usuarios, esta vulnerabilidad demostró la necesidad de mantener los dispositivos actualizados con las últimas versiones de iOS y de descargar aplicaciones solo desde fuentes confiables, dado que un código aparentemente inofensivo distribuido en una app legítima podía activar un mecanismo para dejar el dispositivo inoperativo. En el panorama más amplio, la investigación y mitigación de esta falla también ofrece una enseñanza sobre cómo la seguridad debe ser abordada desde múltiples capas: no basta con proteger las APIs más visibles o las funcionalidades de alto nivel, sino que es fundamental analizar también las funciones y comunicaciones internas que forman la base sobre la cual se construyen las experiencias del usuario. Finalmente, es importante destacar el trabajo de investigadores de seguridad como Guilherme Rambo, que mediante trabajo detallado de ingeniería inversa y pruebas, revelan fallas potencialmente devastadoras y colaboran con los fabricantes para hacer nuestros dispositivos más seguros. La transparencia en este tipo de hallazgos y la colaboración con Apple condujo a la rápida corrección y a la asignación de un CVE (CVE-2025-24091) que reconoce públicamente la vulnerabilidad y su remediación. La historia de cómo una única línea de código pudo dejar inservible un iPhone es un llamado a no subestimar las APIs de bajo nivel ni la arquitectura que sustenta los sistemas operativos modernos.
También nos invita a reflexionar sobre la constante evolución en la seguridad móvil y la necesidad de estar siempre atentos a los nuevos vectores que pueden aparecer. Apple continúa mejorando su ecosistema, y la comunidad de desarrollo y seguridad debe estar igualmente vigilante para garantizar que la innovación y la seguridad avancen de la mano.