
Un exploit du noyau basé sur WebKit et un jailbreak pour PS5
Ce dépôt contient un exploit ROP WebKit de la vulnérabilité use-after-free de course UMTX (CVE-2024-43102) signalée par Synacktiv. Il s'agit essentiellement d'un port de la stratégie d'exploitation de fail0verflow et de celle de flatz. Il abuse de l'UAF pour obtenir un mapping lecture/écriture dans la pile d'une thread du noyau, et exploite les lectures et écritures de pipes pour établir une primitive de lecture/écriture arbitraire (pas tout à fait idéale) dans le noyau. Cette lecture/écriture est ensuite améliorée en une meilleure primitive qui exploite une paire de sockets ipv6 et une paire de pipes pour une lecture/écriture stable, pouvant être transmise aux payloads de la même manière que cela était possible avec l'exploit noyau IPV6 PS5 précédent.
La page elle-même est une version allégée et modifiée du PS5 Exploit Host d'idlesauce, car il a déjà fait le travail d'intégration de psfree à mon style de code précédemment utilisé. Cet hôte est également mon choix personnel pour faire tourner les choses, car il est très fluide et intègre des payloads utiles ; espérons qu'il sera mis à jour pour prendre en charge cet exploit dans un avenir proche <3.
En fin de compte, un chargeur de payload sera lancé pour écouter les payloads ELF sur le port 9021. Je recommande le PS5 Payload Dev SDK car il devrait être entièrement compatible avec ce chargeur lorsque les offsets du noyau seront ajoutés.
Cette vulnérabilité affecte les firmwares 1.00 à 7.61 ; cependant, les FW >= 3.00 semblent avoir des mitigations supplémentaires qui nécessitent d'ajuster l'exploit pour fonctionner. Comme je ne m'intéresse principalement qu'aux firmwares inférieurs, cet exploit ne prend pas encore en charge FW >= 3.00. De plus, la vulnérabilité WebKit que nous enchaînons avec cet exploit a été corrigée dans la version 6.00, donc un autre exploit WebKit permettant d'obtenir une lecture/écriture en espace utilisateur sera nécessaire pour ces systèmes. Encore une fois, comme je ne me concentre pas sur les firmwares supérieurs, cela reste inachevé pour le moment.
Notes importantes
Les firmwares suivants sont actuellement pris en charge :
dns.conf pour pointer manuals.playstation.net vers l'adresse IP de votre PCpython fakedns.py -c dns.confpython host.py0.0.0.0
Pour utiliser le chargeur ELF, exécutez l'exploit jusqu'à son terme. À la fin, il lancera un serveur sur le port :9021. Connectez-vous et envoyez votre ELF à la PS5 via TCP et il l'exécutera. Ce chargeur devrait continuer à accepter et exécuter les payloads même après avoir quitté le navigateur.
Double free initial
La stratégie de cet exploit provient en grande partie de fail0verflow et flatz. Voir le writeup de chris@accessvector pour plus d'informations sur la vulnérabilité. Une fois exploitée, elle nous donne essentiellement un double free. Nous pouvons l'utiliser pour chevaucher le vmobject d'une pile du noyau avec celui d'un mapping mmap afin d'obtenir une fenêtre sur la pile d'une thread du noyau. Cette capacité très puissante nous permet de lire/écrire sur des pointeurs arbitraires du noyau sur la pile, ce qui permet de vaincre l'ASLR et de créer des primitives. La thread dont nous avons accès à la pile sera appelée la thread victime.
Obtention d'une lecture/écriture arbitraire
En créant un pipe et en remplissant le tampon du pipe sur la thread principale, puis en essayant d'y écrire en utilisant la thread victime, la thread victime se bloquera en attendant que de l'espace se libère dans le tampon. Pendant ce temps, nous pouvons utiliser notre fenêtre sur la pile du noyau pour modifier les pointeurs iovec en pointeurs du noyau et définir des flags pour qu'ils soient traités comme des adresses du noyau. En lisant ensuite le pipe sur la thread principale, nous pouvons obtenir une lecture arbitraire du noyau.
De même, en faisant lire le pipe à la thread victime, elle se bloquera en attendant des données entrantes. Nous pouvons alors, à nouveau, écraser les pointeurs iovec et en faire des pointeurs du noyau, puis écrire des données sur la thread principale pour obtenir une écriture arbitraire du noyau.
Amélioration de la lecture/écriture arbitraire