Investigación dirigida por: Hu Ke y Nir Avraham
Jamf Threat Labs ha identificado una técnica de manipulación posterior a la vulneración que proporciona todas las señales visuales asociadas a un modo de bloqueo en funcionamiento, sin ninguna de las protecciones que normalmente implementaría el servicio. Tenga en cuenta que no se trata de un fallo del modo de bloqueo ni de una inseguridad de iOS en sí, sino de una técnica de manipulación posterior a la vulneración que permite al malware engañar visualmente al usuario, haciéndole creer que su teléfono funciona en modo de bloqueo. Esta técnica aún no se ha observado libre en internet y solo es posible en un dispositivo comprometido.
El objetivo de esta investigación es subrayar que los usuarios pueden seguir siendo susceptibles de sufrir ataques si no son plenamente conscientes de cómo funciona el modo de bloqueo y de sus limitaciones. Aunque el modo de bloqueo reduce eficazmente la superficie de ataque de un dispositivo iOS, es importante recordar que, una vez que el dispositivo ya está comprometido, el modo de bloqueo no impide que actúe el malware. El modo de bloqueo no funciona como un software antivirus, no detecta infecciones existentes y no afecta a la capacidad de espiar un dispositivo ya comprometido. En realidad, solo es efectivo —antes de que se produzca un ataque— para reducir el número de puntos de entrada disponibles para un atacante.
La imagen de la derecha está tomada de una publicación de Apple Newsroom.
Esta investigación explora una situación en la que un dispositivo vulnerable es comprometido por un atacante que planta el código para implementar el Modo de Bloqueo Falso. Cuando usuarios de alto riesgo (p. ej., periodistas, funcionarios del gobierno, ejecutivos) del dispositivo comprometido inician el Modo de Bloqueo, activan el código del atacante que implementa las señales visuales del Modo de Bloqueo, pero no realiza ningún cambio en la configuración del dispositivo.
¿Se ha manipulado su Modo de Bloqueo?
El modo de bloqueo de Apple en iOS 16 es una función útil para determinadas situaciones, pero si su teléfono ya ha sido comprometido, el modo de bloqueo no le protegerá. Esta publicación del blog profundiza en nuestra investigación sobre el Modo de Bloqueo Falso, que demuestra que si un hácker ya se infiltró en su dispositivo, puede hacer que el Modo de Bloqueo se "omita" al ejecutar su activación.
Introducción del modo de bloqueo
Apple introdujo el modo de bloqueo en septiembre de 2022 en respuesta al aumento de las campañas de ciberataques en todo el mundo. Como se muestra a continuación y según el Grupo de Análisis de Amenazas (TAG) de Google, en los años 2021 y 2022 se registró el mayor número de ataques de día cero detectados libres en internet desde que comenzaron a rastrear este tipo de incidentes a mediados de 2014. En particular, una de las marcas de spyware más tristemente célebre, Pegasus, puede infectar el último iPhone sin requerir ninguna interacción del usuario, lo que se conoce como ataque de cero clics. A pesar de los continuos esfuerzos de Apple por mejorar su arquitectura de seguridad en los últimos años, los operadores de Pegasus han demostrado una notable capacidad para descubrir nuevas vulnerabilidades y ejecutar ataques de cero clics. Esta situación suscitó preocupación entre los usuarios, lo que impulsó el desarrollo del Modo de Bloqueo como solución para contrarrestar esta tendencia creciente, además de proporcionar tranquilidad a los usuarios de iPhone.
El modo de bloqueo funciona minimizando la funcionalidad que es accesible de forma remota para los potenciales atacantes. Este enfoque, aunque sencillo, es sólido porque cuanto menos código exponga, menos código podrán aprovechar los atacantes para explotar las vulnerabilidades. Apple describe el modo hermético como:
El modo de bloqueo es una protección extrema opcional que está diseñada para los muy pocos individuos que, por ser quienes son o por lo que hacen, podrían ser blanco personal de algunas de las amenazas digitales más sofisticadas. La mayoría de las personas nunca son objeto de ataques de esta naturaleza.
Cuando el modo de bloqueo está activado, su dispositivo no funcionará como lo hace normalmente. Para reducir la superficie de ataque que potencialmente podría ser explotada por programas espía mercenarios altamente selectivos, ciertas aplicaciones, sitios web y funciones están estrictamente limitadas por motivos de seguridad y algunas experiencias podrían no estar disponibles en absoluto.
El modo de bloqueo está disponible en iOS 16 o posterior, iPadOS 16 o posterior, watchOS 10 o posterior y macOS Ventura o posterior. Existen protecciones adicionales en iOS 17, iPadOS 17, watchOS 10 y macOS Sonoma. Para obtener un conjunto completo de protecciones, actualice sus dispositivos al software más reciente antes de activar el modo de bloqueo.
Por ejemplo, el modo de bloqueo adopta un motor de navegador web restringido para su uso con portales cautivos. Un portal cautivo es una página web que suele aparecer cuando se conecta a una red Wi-Fi pública y que suele utilizarse con fines publicitarios o de autenticación. El motor web que hay detrás de los portales cautivos impone más restricciones, siendo una de las más destacadas la desactivación de la compilación Just-In-Time (JIT) de JavaScript por consideraciones de seguridad. Esta restricción también se extiende al modo de bloqueo. En consecuencia, se ha comprobado que el uso del modo de bloqueo produce reducciones del rendimiento y la capacidad de respuesta de hasta el 95% en las aplicaciones web cuando se trata del motor JavaScript.
Al activar el modo de bloqueo se eliminará la compatibilidad con determinados formatos de archivo, principalmente debido a su historial de explotación. También deshabilitará funciones prácticas, por ejemplo, dejará de mostrar previsualizaciones de los enlaces enviados a través de Mensajes, desactivará los álbumes compartidos e impedirá la instalación de perfiles de configuración y la inscripción en el software de administración de dispositivos móviles (MDM).
La siguiente imagen, de blacktop en GitHub, enumera lo que el modo de bloqueo desactiva.
Un avance rápido hasta 2023: la eficacia del Modo Bloqueo ha entrado en vigor. En septiembre de 2023, CitizenLab identificó una cadena de ataques de vulnerabilidad de cero clics explotada activamente llamada BLASTPASS, que tenía como objetivo la última versión de iOS 16 disponible en ese momento. Tanto CitizenLab como Apple han afirmado que activar el modo de bloqueo bloqueará este ataque en particular. Aunque no han revelado más detalles para evitar posibles usos indebidos, es probable que ahora se requiera cierto nivel de interacción por parte del usuario para activar la vulnerabilidad después de activar el modo de bloqueo, desactivando así la capacidad de ataques de cero clics, lo que permite a los usuarios la oportunidad de reaccionar.
Limitaciones del modo de bloqueo
Aunque el modo de bloqueo ha demostrado su eficacia en determinadas situaciones, nuestra evaluación del modo de bloqueo hace hincapié en que no detendrá un ataque que ya se haya iniciado en el dispositivo. Los usuarios de iPhone deben tener en cuenta que si su dispositivo ya ha sido infectado, la activación del modo de bloqueo no afectará a un troyano que ya haya transgredido el sistema. El objetivo principal del modo de bloqueo es reducir los posibles vectores de ataque, en lugar de añadir medidas de seguridad adicionales para impedir la ejecución de cargas útiles maliciosas.
En el resto del artículo, demostraremos cómo, en el escenario de un iPhone que ya ha sido infectado, el Modo de Bloqueo podría ser manipulado, dando a los usuarios una potencial falsa sensación de seguridad.
El interruptor
Como se muestra a continuación, comenzamos examinando el conmutador del Modo de bloqueo dentro de la app Ajustes. Muchas de las acciones que tienen lugar entre bastidores son invisibles para el usuario, excepto el reinicio. Realizamos una búsqueda de la cadena "lockdownMode" dentro del dyldcache y encontramos que una infraestructura llamada PrivacySettingsUI
tiene implementadas dos funciones C con los siguientes nombres:
bool isLockdownModeEnabled()
void setLockdownModeEnabled(bool)
Dentro de la función void setLockdownModeEnabled(bool)
, configura el valor booleano del código LDMGlobalEnabled
a "Sí" a través de la API NSUserDefaults. Al monitorear los eventos de cambio de archivo, encontramos la ruta de este archivo: /var/mobile/Library/Preferences/.GlobalPreferences.plist
Este valor único sirve como indicador principal para determinar si el sistema considera que el Modo de Bloqueo está activo o no. Al sobrescribir manualmente la base de datos de valores predeterminados del usuario, estableciendo este valor en "Sí", se consigue mediante un comando como
[[NSUserDefaults standardUserDefaults] setObject: [NSNumber numberWithBool: 1] forKey:@"LDMGlobalEnabled" inDomain: @"NSGlobalDomain"]
Este comando puede ejecutarse en casi cualquier proceso fuera del entorno aislado (sandbox). Se pueden observar cambios en los valores de retorno de numerosas funciones, puede encontrar estas funciones ejecutando "grep -i lockdownMode'' dentro del dyldcache.
Unas pocas funciones, como PUILockdownModeController
, requieren inicializar una nueva instancia porque la lectura del archivo se produce en el método de inicialización. No obstante, tras reiniciar estos procesos, todos devuelven resultados positivos que activan el Modo de Bloqueo en todo el dispositivo, y este ajuste surte efecto sin necesidad de reiniciar el dispositivo por completo.
Esto confirma nuestra sospecha de que, a partir de iOS 16.5, el modo de bloqueo sigue funcionando como un artilugio del espacio de usuario (el kernel no se percata de ello). No hemos encontrado ninguna implementación de código relacionada con el modo de bloqueo dentro del kernel de iOS 16.5. No es necesario reiniciar el sistema para activar o desactivar el Modo de Bloqueo en esta fase.
Sin embargo, eso es solo por ahora. Haciendo referencia a las ideas de "Anatomy of Lockdown Mode" de blacktop, Apple ha elevado el modo de bloqueo al nivel del kernel desde iOS 17. Ahora incluye su propio daemon en segundo plano, que se encuentra en /System/Library/PrivateFrameworks/LockdownMode.framework/lockdownmoded, y un KEXT llamado com.apple.driver.AppleLockdownMode
. Este movimiento estratégico es un gran paso en la mejora de la seguridad, ya que los cambios realizados por el modo de bloqueo en el kernel normalmente no pueden deshacerse sin someterse a un reinicio del sistema, gracias a las mitigaciones de seguridad existentes.
Engañar el reinicio
Volviendo al tema de la manipulación del Modo de Bloqueo, nuestro objetivo con respecto a la app Configuración es hacer que el Modo de Bloqueo sea ineficaz y sustituir el reinicio del sistema por un reinicio en el espacio del usuario. Esta demostración pretende mostrar cómo el malware puede engañar al usuario. En el caso de un teléfono infectado, no existen salvaguardas para impedir que el malware se ejecute en segundo plano, tanto si el usuario activa el modo de bloqueo como si no.
Cuando un usuario opta por activar el Modo de Bloqueo en la app Ajustes, eso activará el método -[PUILockdownModeController setLockdownModeGloballyEnabled:]
, y en su interior, puede ver que la secuencia de eventos proporciona una visión clara de cómo funciona el Modo de Bloqueo. Comienza desactivando los álbumes compartidos y las vistas previas de enlaces, seguido de la desactivación del modo de desarrollador y la activación del modo restringido USB. También se desactiva la instalación de perfiles y se establece en "SÍ" la clave LDMGlobalEnabled
de la base de datos de valores predeterminados del usuario, con los cambios sincronizados. Dentro de la función _DaemonReady
, se invoca a CFNotificationCenterPostNotification()
para notificar a los procesos WebKit el cambio de configuración. Por último, se reinicia el dispositivo.
Dado que -[PUILockdownModeController setLockdownModeGloballyEnabled:]
es un método objective-C, puede utilizar la técnica Method Hooking method_exchangeImplementations
para sustituir su contenido. Lo que hicimos es sencillo: Cada vez que el usuario activa el modo de bloqueo, se crea un archivo llamado /fakelockdownmode_on como indicador y se inicia un reinicio del espacio de usuario. También enganchamos otras funciones, como -[PUILockdownModeController lockdownModeEnabled]
, para devolver resultados basados en la existencia de este archivo.
De esta forma, el dispositivo no se reinició realmente, y permitió que nuestro código inyectado mantuviera un control adaptable sobre el Modo de Bloqueo. Esto también significa que incluso el malware que carece de persistencia puede ejecutarse de forma persistente y monitorear al usuario.
Modo de bloqueo falso en Safari
Para seguir demostrando la manipulación del modo de bloqueo, elegimos Safari, una de las aplicaciones más utilizadas. Cuando un usuario navega por un sitio web utilizando Safari, observará una etiqueta visible que dice "Bloqueo activado". Esta etiqueta sirve como indicador de que se utiliza una versión de portal cautivo del motor web para mostrar la página web actual. Si, por cualquier motivo, se utiliza el motor web normal en su lugar, Safari mostrará de forma destacada "Bloqueo desactivado" en una tipografía roja que llamará la atención. Este escenario se produce cuando un usuario navega por un sitio web de confianza, una configuración que puede ajustarse en la configuración del sitio web.
Safari depende por completo de una única función, +[WBSUIFeatureAvailability isLockdownModeEnabledForSafari]
, para determinar el estado del modo de bloqueo. Enganchando esta función, podemos hacer que devuelva los resultados deseados en diferentes situaciones. Por ejemplo, podemos hacer que devuelva "No" al tomar decisiones sobre si utilizar o no el motor web del portal cautivo y "Sí" al determinar la apariencia de elementos a nivel de superficie, como la etiqueta "Preparado para bloqueo" de la Interfaz de usuario.
Ahora, Safari se comportará como si todos los sitios web fueran de confianza, y tenemos que dar algunos pasos para modificar la etiqueta "Bloqueo desactivado". Para conseguirlo, primero buscamos la cadena "Bloqueo desactivado" y localizamos la función llamada WBSAnnotationStringForLockdownModeStatus
; al monitorear su rastreo, veremos que fue invocada por -[SFLockdownStatusBar _updateLabelWithLockdownStatus:]
, un método de objective-C que puede engancharse adecuadamente. Procedemos a modificar esta función para que muestre "Bloqueo activado" cuando normalmente mostraría "Bloqueo desactivado".
Video de demostración
En este video de demostración, un usuario activa el Modo de Bloqueo en Ajustes. Aunque el dispositivo parece estar en Modo de Bloqueo, en realidad no está activado, ya que podemos seguir viendo archivos PDF en safari. Nuestra demostración también empleó un sitio desarrollado por crypt.ee, que utiliza medios técnicos para verificar el estado del Modo de Bloqueo.
Jamf Executive Threat Protection puede identificar ataques sofisticados para mantener a salvo a sus usuarios.
Suscribirse al Blog de Jamf
Haz que las tendencias del mercado, las actualizaciones de Apple y las noticias de Jamf se envíen directamente a tu bandeja de entrada.
Para saber más sobre cómo recopilamos, usamos, compartimos, transferimos y almacenamos su información, consulte nuestra Política de privacidad.