UnjailMe
Un escape de sandbox basado en:
- la prueba de concepto (CVE-2018-4087) de Rani Idan (Zimperium)
- la prueba de concepto de desbordamiento de securityd de @cheesecakeufo (zeroday, sin CVE conocido, ¡gracias Abraham!)
Acerca del PoC de ZIMPERIUM
Rani usó sbtool de Jonathan Levine para descubrir qué servicios eran accesibles para la comunicación desde dentro del sandbox.
Luego encontró más bluetoothd y configuró código para interceptar mensajes desde y hacia el servicio.
Al hacerlo, descubrió que podía secuestrar la sesión de muchos demonios y filtrar el puerto del cliente.
De esta manera encontró que era posible añadir un callback con datos adicionales a la conexión del cliente con bluetoothd.
La consecuencia de esto es que se puede obtener control sobre el contador de procesos (callback) y el registro x3 (datos adicionales) de los demonios del sistema de los cuales se intercepta un puerto de cliente (sesión).
Proporcionando la posibilidad de escapar de una app de sandbox a un contexto privilegiado, haciendo que ejecute código con privilegios del sistema.
Apple ha parcheado las vulnerabilidades en iOS 11.2.5 usando un arc4random() para el id de sesión.
Parece que ya no es posible obtener el puerto de un cliente, pero interceptar sesiones todavía lo es.
Se tarda aproximadamente 5 días en forzar por fuerza bruta este arc4random() en este nuevo parche (4.294.967.296 posibilidades) y por lo tanto todavía espero un parche definitivo, ya que esto no se considera una solución para el problema de seguridad.
Fuente: Zimperium Blog
Acerca del PoC de Abraham Masri
Hasta donde sé, esto es un desbordamiento de búfer en la comunicación con securityd.
Esto se hace proporcionando un mensaje XPC, que es un mensaje de valor-clave basado en diccionarios, con una longitud no válida.
El servicio recibe el mensaje y se produce el underflow.
Abraham parece haber encontrado una manera de controlar muchos registros del procesador, haciendo posible la ejecución de código con privilegios del sistema para las apps que se ejecutan dentro del sistema.
El PoC de Abraham muestra que Abraham está intentando crear un exploit para esta vulnerabilidad por sí mismo, ya que existe código para filtrar direcciones base, lo que se conoce como el inicio de la creación de una cadena ROP.
Se desconoce si Abraham planea escribir este exploit él mismo o si nos está señalando la dirección correcta.
Requisitos
- Un dispositivo iOS de 64 bits con iOS 10 hasta 11.3.1
Acerca de este proyecto
- Este proyecto no es un jailbreak ni contribuirá a uno, ya que solo operará en userland
- Este proyecto no puede y nunca podrá obtener la capacidad de escribir en el sistema de archivos raíz, ya que está montado como solo lectura, según lo impuesto por el kernel.
- Este proyecto no permitirá fácilmente la ejecución arbitraria de código en forma de bibliotecas dinámicas como lo hace cydia substrate.
- El proyecto tiene como objetivo principal escalar una app de contenedor con sandbox a privilegios del sistema.
- AMFI exige que todos los binarios estén firmados válidamente y este proyecto no puede parchear AMFI.
- El proyecto apunta a obtener permisos de lectura y escritura en la partición de datos de usuario (/var/root, /var/mobile).
- El proyecto apunta a obtener acceso al almacenamiento protegido del llavero (keychain) para recuperación de credenciales y fines forenses.
- El proyecto también apunta a proporcionar funcionalidad de servidor para ejecutar código como root y transferencia de archivos.
- El proyecto fue pensado como una ayuda para desarrolladores e investigadores para contribuir.
- El proyecto facilitará a los desarrolladores de jailbreak e investigadores de seguridad encontrar errores en controladores del kernel que solo son accesibles desde un contexto privilegiado, o errores de userland usando técnicas de fuzzing.
- El proyecto facilitará a los desarrolladores de tweaks de jailbreak investigar las nuevas características de iOS 11 y depurar el desarrollo de tweaks en un dispositivo real.
- Este proyecto se enfoca principalmente en funcionar para iOS 10 hasta 11.2.5, pero en teoría puede soportar también 11.2.5 hasta incluyendo 11.3 cuando se desarrollen exploits.
Captura de pantalla
Cómo usar la app
- La app no añade valor al proyecto, pero sirve como una imagen visual para aquellos que lo pidieron (Mucha gente emocionada de la comunidad lo pidió)
- La app volcará información de bibliotecas y frameworks, incluyendo memoria, información mach-o y sus direcciones base, lo cual es útil para el desarrollo de ROP.
- La lógica de la app puede tardar hasta 15 minutos en completarse debido a los muchos análisis e impresiones, esto no será el caso en las versiones finales.
- La app no añadirá ningún valor a tu iPhone ni cambiará el comportamiento del software tal como es; algunos demonios pueden fallar, pero no se hace daño permanente al sistema.
- Se recomienda a los investigadores ejecutar este proyecto en Xcode en su lugar
SOLUCIÓN DE PROBLEMAS (no es necesario, pero por si acaso)
- Elimina la app
- Apaga el bluetooth
- Reinicia
- Enciende el bluetooth
- Apaga el bluetooth
Características
- Acceso FTP (actualmente con sandbox, sin sandbox en el futuro)
- PoC visual
- PoC de zerodium (Finalmente ligeramente mejorado, puede hacer llamada a la función system())
- PoC de Abraham, que debería poder ejecutar código arbitrario como root, perfecto para ssh.
- PoC de Sem Voigtlander (DoS de asignación de espacio de direcciones del kernel, para la función de reinicio del dispositivo).
Planes
- Exploit completo incluyendo obtener control total sobre el espacio de direcciones de otros demonios.
- Acceso remoto a shell SSH (dropbear o un derivado).
Cosas futuras a considerar
- Inyección de código en SpringBoardd (Hola a los amantes del jailbreak)
launchd (No es posible ya que no podemos obtener una sesión para ello).
Hipótesis (solo especulación)
- Encontrar un demonio con entitlements de launchd / inyectar entitlements.
Inyectar código que cargue BaseBoard Framework
- Filtrar direcciones de bibliotecas en dyld_shared_cache.
- Encontrar un ropgadget en cualquier biblioteca de dyld_shared_cache.
- Llamar a la ropchain estableciendo el callback y los datos adicionales del callback.
- Usar lógica de ingeniería inversa de BaseBoard para hacer que launchd ejecute amfid con argumentos y aslr desactivado.
- parchear amfid
- Usar lógica de ingeniería inversa de BaseBoard para hacer que afcd se ejecute con argumentos para / y aslr desactivado. (similar a afc2).
- Usar lógica de ingeniería inversa de BaseBoard para ejecutar unjaild, un demonio que puede usarse como envoltorio alrededor de launchd y maneja privilegios de tareas e inyección de código.
- obtener un taskport sobre launchd con aslr desactivado usando la lógica de BaseBoard
Para examinar
- Parches de AMFI (No es fácil, no podemos obtener sesiones sobre amfi, pero podemos escalar usando otros demonios quizás).
- Inyección de entitlements (No es del todo necesaria, tenemos control sobre tantos demonios que no la necesitamos).
- Escalar aún más usando APIs privadas (¿BaseBoard.framework puede lanzar procesos con ASLR desactivado con privilegios del sistema?)???
- Revivir y portar liblorgnette a iOS (HECHO)
Descargar ipa
https://github.com/MTJailed/UnjailMe/releases/tag/0.1
Créditos
- Abraham (@cheesecakeufo) por su zeroday de securityd
- Vulnerabilidad y PoC inicial: Rani Idan (Zimperium) <3
- PureFTPd
- Proyecto liblorgnette (con mis propias pequeñas mejoras)
- NEWUI por @ringarang
Donar o contribuir
- El código fuente se puede entregar si se solicita en twitter por MD (@MTJailed)
- Por favor dona, ¡tengo muy poco tiempo y medios para trabajar en proyectos así! (http://paypal.me/devsupport)
- Pronto el código fuente (Excepto el ftp) estará aquí en GitHub.