Le problème de signature viendrait de KPP et la méthode dont Pangu a bypass le codesigning

Kernel Patch Protection

Avec iOS 9, est arrivée une nouvelle sécurité nommée Kernel Patch Protection (KPP) sur les appareils 64 bits. KPP permet de vérifier l’integrité des pages RX dans le kernelcache ainsi que la table de pages de celui-ci.
Cette fonctionnalité serait liée au coprocesseur à la série de co-processeurs arrivée avec l’iPhone 5S qui contient également les empreintes digitales pour Touch ID. Le coprocesseur MX étant aussi appelé SEP ou Secure Enclave a son propre Micro Kernel et sa propre bootchain.

Avec les anciennes version d’iOS, il était possible de patcher le kernel avec les exploits appropriés. Aujourd’hui cette methode n’est plus possible.
En effet il est plus difficile de patcher les segments qui sont en lecture seule sur les versions ARM64. Si ils sont patchés cela causera des kernels panics aléatoires.

Pangu 9

Le jailbreak de Pangu a été relaché le 14 octobre 2015, soit un mois après la première release d’iOS 9.
La team Pangu a exploité un bug dans le noyau dans le code de IOHIDFamily. Le bug a été découvert par Luca Todesco (aka qwertyoruiop) qui a publié un un jailbreak Open Source d’iOS 8.4.1 pour OS X ainsi que cererdlong qui travaille pour Alibaba.

OS X est aussi affecté par ce bug, mais le crash aura seulement lieu en executant l’exploit en tant que root, donc pas vraiment utile dans ce cas, car il faudra un autre exploit pour obtenir l’accès root (e.g DYLD_PRINT_TO_FILE).

Bref je suis pas là pour faire un writeup de Pangu9.

Killed : 9

Avec leur dernier outil de jailbreak la majorité des outils de type CLI ne fonctionnaient plus et retournaient l’erreur Killed : 9 lors de leur execution.

En prenant exemple avec Joker :

iPad:~ root# chmod +x /usr/bin/joker.armv7
iPad:~ root# joker.armv7
Killed: 9
iPad:~ root#

Pour fixer cette erreur, il y a deux methodes.

ldid

Avec la commande ldid, il vous suffira d’executer la commande avec les arguments suivants

 ldid -S `which <command>` 

e.g :

 ldid -S `which joker.armv7` 


Et hop !

iPad:~ root# joker.armv7
Usage: joker [-j] [-MmaSsKk] _filename_
 _filename_ should be a decrypted iOS kernelcache, or kernel dump. Tested on ARMv7/s 3.x-9.0b1, and ARM64 8.x/9.0b1

 -m: dump Mach Traps and MIG tables (NEW)
 -a: dump everything
 -k: dump kexts
 -K: kextract [kext_name_shown_in_-k]
 -S: dump sysctls
 -s: dump UNIX syscalls
 -j: Jtool compatible output (to companion file)

2.1 (w/64, MIG) Stable version (but no kextraction on 64-bit yet)
iPad:~ root#

Jtool

En regardant Jtool de plus prêt j’ai vu qu’il y avait des options pour les signatures des binaires

Code Signing Options:
   --sig                Show code signature in binary (if any)
   --sign [adhoc]       self-sign with no certificate
   --ident _ident_      provides identity (fake, of course)
   --appdir             Set App Path (for code signing and/or verification)
   --ent                Show entitlements in binary (if any)

Donc voilà, j’ai executé la commande suivante :

iPad:~ root# jtool --sign /usr/bin/kdv
  **************************************************************************************
  * Warning: Code signatures are still defined as Beta. Lots of minutiae to deal with, *
  * and it isn't as easy as you might think to get things right with all these hashes. *
  *                                                                                    *
  * I suggest you use --sig -v to validate your pseudo-signed binaries.                *
  * Try JDEBUG=1 if you want to follow along.                                          *
  **************************************************************************************
Warning : Destructive option. Output (318109 bytes) written to out.bin

Jtool créé donc un fichier nommé out.bin executable dans votre directory.

Il vous suffira de l’executer pour voir que c’est bien le dit executable que souhaitiez signer.
Pour renommer celui-ci executez cette commande (en modifant le nom du binaire) : mv out.bin joker.armv7

Si vous avez besoin d’infos ou autre contactez-moi sur Twitter : @matteyeux