Saltearse al contenido

Pentesting iOS

iOS es más cerrado que Android: el sandboxing es estricto, el sistema de ficheros está más protegido y, sin jailbreak, el acceso es limitado. Las apps se distribuyen como IPA (un ZIP con el binario Mach-O cifrado por la App Store, recursos y Info.plist). Aun así, con un dispositivo con jailbreak (o técnicas sin jailbreak) y Frida, se puede inspeccionar, instrumentar y auditar una app iOS siguiendo el mismo MASVS.

IPA = ZIP con Payload/App.app/:
<binario Mach-O> el ejecutable (cifrado por FairPlay si viene de la App Store)
Info.plist configuración, URL schemes (deeplinks), ATS, permisos
embedded.mobileprovision perfil de aprovisionamiento
_CodeSignature/ firma
recursos (.plist, .db, assets)

Las apps de la App Store vienen cifradas; para análisis estático del binario hay que descifrarlo primero (dump desde memoria con el dispositivo):

# en dispositivo con jailbreak, volcar el binario descifrado
frida-ios-dump # extrae el IPA descifrado
# o Clutch / bagbak
# luego análisis estático del Mach-O
# con jailbreak (acceso completo)
checkra1n / palera1n / unc0ver según versión de iOS
# acceso por SSH al dispositivo, Cydia/Sileo para herramientas
# sin jailbreak (más limitado)
# re-firmar la app con Frida gadget inyectado (objection patchipa), sideload
Info.plist
# el binario Mach-O descifrado
class-dump / otool -l # clases, métodos, Objective-C/Swift metadata
strings binario | grep -iE 'http|key|secret|password' # endpoints, secretos
plutil -p Info.plist # URL schemes (deeplinks), ATS, permisos
# buscar NSAllowsArbitraryLoads (ATS deshabilitado -> HTTP permitido)
# instrumentación con Frida (ver mob-frida)
frida -U -f com.target.app -l script.js
objection -g com.target.app explore # explorar, bypass, dump
# bypass de jailbreak detection y SSL pinning (mob-ssl)
objection --gadget com.target.app explore -s "ios sslpinning disable"
# almacenamiento inseguro (ver mob-storage)
# Keychain: objection ios keychain dump
# ficheros de la app en /var/mobile/Containers/Data/Application/<UUID>/
# NSUserDefaults (.plist), bases de datos SQLite, caché
# URL schemes / Universal Links (deeplinks -> mob-deeplinks)
# jailbreak detection evitable (no es seguridad real)
# pasteboard, capturas de pantalla en background, logs
# backend/API (el objetivo real -> sección Web)

El Keychain de iOS es el lugar “correcto” para secretos, pero con jailbreak se puede volcar:

objection -g com.target.app explore
ios keychain dump # contenido del Keychain de la app
# revisar clases de protección de datos (kSecAttrAccessible...) -> ¿accesible sin desbloquear?
  • Secretos en el Keychain con la clase de protección adecuada (no en plist/NSUserDefaults/código).
  • ATS activado (no NSAllowsArbitraryLoads); TLS + pinning (SSL pinning y bypass).
  • Data Protection (cifrado ligado al desbloqueo) para ficheros sensibles; limpiar caché/pasteboard.
  • Jailbreak detection / anti-debug / ofuscación (RESILIENCE) elevan el coste, no sustituyen la seguridad.
  • Validar URL schemes y Universal Links; toda la seguridad crítica en el backend.
  • Obtener y descifrar el IPA (frida-ios-dump)
  • Entorno: jailbreak o Frida gadget (sin jailbreak)
  • Estático: class-dump, strings, Info.plist (URL schemes, ATS)
  • Dinámico: Frida/Objection, bypass jailbreak detection
  • Keychain dump y almacenamiento (Almacenamiento inseguro)
  • SSL pinning bypass (SSL pinning y bypass)
  • Deeplinks / Universal Links (Deeplinks e IPC)
  • Backend/API (sección Web)