iOS Jailbreak Parte 1 - Conceptos e introducción

Hoy en GeekyTheory vamos a hablar sobre algo bastante conocido dentro de la comunidad iPhone. El jailbreak, cuyo significado en inglés es el de escapar de la cárcel, se aplica al iPhone o a dispositivos móviles Apple en general.

Jailbreak es el proceso de desactivar y/o saltarse las diversas protecciones que Apple ha implementado en el iPhone, principalmente para instalar aplicaciones, tweaks o temas que no es encuentran en la AppStore oficial, y que de otra forma sería imposible.

Como podréis imaginar, Apple no pone las cosas fáciles (mucho menos en las últimas versiones de iOS). Sin embargo, por definición en cualquier software con cierta complejidad cada vez que se añadan nuevas funciones y características se añaden paralelamente nuevas vulnerabilidades, es decir, pese a que Apple corrija vulnerabilidades que han dado lugar a un Jailbreak en versiones anteriores, cada vez que añada una nueva función al sistema iOS estará añadiendo nuevas vulnerabilidades que podrán ser posteriormente usadas para Jailbreak.

¿Qué tipos de Jailbreak hay?

Untethered: No se pierde al reiniciar el teléfono, es decir, tu iPhone permanecerá con el Jailbreak sin importar que lo reincides o lo apagues.
Semi-tethered: Se pierde al reiniciar el teléfono, pero el iPhone encenderá normalmente y tan sólo tendrás que volver a ejecutar el Jailbreak. Es el más común a día de hoy.
Tethered: Se pierde al reiniciar el teléfono, y dejará tu iPhone en un bootloop hasta que enciendas el teléfono con el ordenador.

¿Cuáles son los requisitos para decir que tienes Jailbreak?

1. Filesystem: El sistema de archivos del iPhone está por defecto montado como Only Read (sólo lectura). El primer paso del Jailbreak será desmontar y montar el sistema de archivos como Read-Write (lectura-escritura), para así poder modificarlo a través de SSH o SFTP.

2. Privilege-escalation: iOS es un sistema derivado de UNIX, por lo que implementa los tipos de usuarios de UNIX con alguna pequeña modificación. Por defecto en el iPhone todo se ejecuta como mobile, mediante Jailbreak queremos obtener acceso al iPhone como usuario root.

¿Qué sistemas implementa Apple para prevenir el Jailbreak?

KASLR: Kernel Address Space Randomization, es una técnica bastante utilizada para asegurar los kernels, y prevenir explotación del kernel relacionadas con vulnerabilidades de corrupción de memoria, KASLR dispone de forma aleatoria las posiciones del espacio de direcciones de las áreas de datos clave de un proceso, incluyendo la base del ejecutable y las posiciones de la pila, el heap y las librerías.

!Para! ¡No me he enterado de nada!

¿Qué es el Kernel?

El Kernel es por así decirlo “la parte central del sistema operativo”, el encargado de comunicar todas las ordenadores que el usuario le da a través del sistema operativo, directamente al hardware(procesador, memoria...). Básicamente cuando tu en tu iPhone, tocas en la pantalla para abrir Safari en realidad el sistema operativo le da al Kernel una instrucción, la cual interpreta y realiza las pertinentes operaciones con el CPU, memoria RAM, unidades de almacenamiento, etc...

El Kernel de iOS es una modificación del Kernel XNU, que a su vez es un Kernel UNIX. iOS implementa además un microkernel llamado Mach, para controlar el IO(Input Output).

¿Qué es la corrupción de memoria?

Digamos que estamos desarrollando una aplicación, que detecta a cuanta altitud sobre el nivel del mar estamos, lo lógico sería declarar una variable de tipo double que contenga la altitud a la que nos encontramos para posteriormente mostrarla.

Esto lo podríamos hacer de forma tal que así en Objective-C:

Long *altitud;

Con esta línea de código le estamos diciendo al Kernel que reserve en la memoria RAM un espacio para almacenar la variable, y creará una referencia a ese espacio reservado en la memoria de la siguiente forma: 0x0C0000000, dónde por supuesto las cifras que no están en negrita adoptan distintos valores, y que tienen su significado.

Si conocemos la referencia en la que variables importantes del sistema se encuentran alojadas dentro de la memoria RAM, nada nos impedirá modificarlas a nuestro gusto, pudiendo por tanto ejecutar código arbitrario... Pero aquí es dónde entra KASLR, que cada vez que llamamos a ese espacio reservado de memoria se encarga de cambiar su referencia, de forma que nosotros nunca sabremos dónde están alojadas las variables esenciales del SO, y por tanto no podremos modificarlas.

KPP: Éste es el culpable de que no podamos tener jailbreaks untethered, al menos nos pone las cosas muy difíciles, pues es una protección de tipo software y de tipo hardware que Apple implementa en los iPhone de 64bit (del iPhone 5S en adelante) y que se encarga de garantizar la integridad del Kernel antes de que este cargue; es decir, garantiza que no se está ejecutando código arbitrario sobre el kernel.

Como algo gracioso, cabe destacar, que cuando Apple implementó KPP por primera vez en iOS 9, Luca Todesco encontró una forma de saltarse KPP, que era nada más y nada menos que echarle carreras al KPP. Dicho de otra forma, ejecutar código arbitrario antes de que KPP entrase en funcionamiento de forma que después KPP confundiría ese código arbitrario con código propio del Kernel y no lo eliminaría. Esto por supuesto Apple lo ha arreglado en nuevas versiones de iOS.

Sandboxes: Apple implementa unos daemons (código que está constantemente corriendo), tales como AMFID, que se encargan de garantizar que cualquier código que este siendo ejecutado a nivel UI en el iPhone haya sido anteriormente firmado con una licencia de desarrollador de Apple.

La idea detrás de esto es completamente errónea, por lo que el mismo método para saltarse esto se ha usado desde iOS 3, y a no ser que Apple reinvente este sistema, seguirá pasando lo mismo.

Una vez hemos conseguido saltarnos estos “pequeños” obstáculos que Apple nos pone en el camino, habremos llegado a la meta, la meta del Jailbreak.

¡Atento a la parte 2 porque daremos instrucciones directamente al procesador de iOS!