En el pasado artículo estuvimos revisando los puntos débiles que tiene un malware a la hora de sobrevivir un reinicio del sistema, y nos centramos en OSX. Ahora toca el turno a iOS, que al ser una especie de spin-off de OSX, vamos a ver que existen muchas similitudes.
De hecho, en el caso de iOS, no existen tantos puntos donde una aplicación va a poder registrarse para sobrevivir a un reinicio. Al ser un sistema tan cerrado, y mucho más simple que un sistema clásico de escritorio, estos puntos de arranque son mucho menos.
El sitio por excelencia para registrarse una aplicación que quiera ser arrancada en el reinicio es /System/Library/LaunchDaemons, y su funcionamiento es exactamente igual que en la de su hermano OSX. Basta con dejar un archivo con un formato específico (fichero .plist) en ese directorio, que será interpretado por launchd en el arranque y ejecutará lo que esté configurado. Aunque es importante reseñar que no es posible acceder a incluir ningún fichero en ese directorio sino es a través de algún exploit/jailbreak.
También existen el directorio /Library/LaunchAgents y /Library/LaunchDaemons, pero no son utilizados por el sistema. Tan sólo después de hacer un jailbreak, sí que se utiliza el segundo, y algunas aplicaciones de Cydia registran ahí sus ficheros .plist (como OpenSSH).
Por ejemplo, en el primer malware que apareció para iOS (sólo para dispositivos con jailbreak), llamado iKee (con todas sus variantes iKee.A, iKee.B y iKee.C), utilizaba este sistema para sobrevivir al reinicio, instalando tres archivos en este directorio.
Si nos fijamos en el código de iKee, veamos cómo instalaba uno de estos ficheros:
rm -rf /System/Library/LaunchDaemons/com.apple.ksyslog.plist
#cp com.apple.ksyslog.plist /private/var/mobile/home/
cp com.apple.ksyslog.plist /System/Library/LaunchDaemons/com.apple.ksyslog.plist
#/bin/launchctl load -w /System/Library/LaunchDaemons/com.apple.ksyslog.plist
También en el caso del 'troyano' creado por FinFisher para la monitorización de dispositivos iOS, se utiliza un archivo .plist en el directorio /System/Library/LaunchDaemons llamado com.apple.logind.plist, con el objetivo de sobrevivir un reinicio (y ejecutar el binario logind):
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN""http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Disabled</key>
<false/>
<key>Label</key>
<string>home.logind</string>
<key>OnDemand</key>
<false/>
<key>ProgramArgumments</key>
<array>
<string>/System/Library/CoreServices/logind.app/logind</string>
<string></string>
<string></string>
</array>
<key>StandardErrorPath</key>
<string>/dev/null</string>
</dict>
</plist>
En teoría, no existe ningún otra forma de registrarse en el sistema para ser ejecutado en un arranque. Aunque no es del todo cierto, puesto que Apple sí que permite ejecutar aplicaciones que no sean del sistema en el arranque, sin tener que utilizar ningún exploit o jailbreak: utilizando el parámetro UIBackgroundModes (a partir de 4.0) en el fichero Info.plist de la app.
Según la documentación de Apple, UIBackgroundModes se utiliza para especificar si una app necesita ejecutarse de forma continua en el background, pero Apple sólo permite ciertos tipos de aplicaciones utilizar este parámetro:
- Audio (audio): para que suenen las canciones
- Posición (location): si se necesita tener un control fino de la posición (por ejemplo en aplicaciones de deportes)
- VoIP (voip): siempre conectado para recibir llamadas
- Revistas (newsstand-content): descargar contenidos de forma inmediata
- Accesorios externos (external-accesory): estar conectado continuamente
- Bluetooth (bluetooth-central y bluetooth-peripheral): estar conectado continuamente
Para posibles fines que pueda tener un malware, la que más interesa es la opción de VoIP, puesto que permite controlar las comunicaciones en background, y además será arrancada en el reinicio del dispositivo por parte del sistema.
<key>UIBackgroundModes</key>
<array>
<string>voip</string>
</array>
Para demostrarlo, el desarrollador Timothy L. Ekl ha desarrollado una pequeña app que utiliza la clave UIBackgroundModes con el valor 'voip', y efectivamente, la aplicación se ejecuta en el reinicio del sistema de forma automática.
Según parece, en el proceso de revisión de Apple a la hora de incorporar una nueva app en la AppStore, si una app tiene el parámetro UIBackgroundModes puesto a 'voip', se comprueba que realmente es una aplicación de VoIP, y si no, se rechaza.
En nuestro caso de un malware, nos da relativamente igual puesto que en principio ese malware habrá infectado el sistema con otros medios que no sea a través de la AppStore, con lo que podría usar este parámetro sin problemas para sobrevivir al reinicio. A día de hoy no se ha visto ningún malware que utilice esta técnica, pero puede que en el futuro podamos ver alguno.
El último superviviente (I) - OSX
El último superviviente (II) - iOS