
Un exploit de l'hyperviseur PS5 pour les firmwares 1.xx-2xx.
Exploit de l'hyperviseur PS5 pour les firmwares <= 2.xx. Le dépôt contient deux vulnérabilités et chaînes d'exploitation, indépendantes l'une de l'autre, et chacune peut être utilisée. Un exploit est fourni principalement à titre de conservation (/_old_jump_table_exploit) ; seule la chaîne d'exploitation principale doit être utilisée (exploit des indicateurs QA).
Cette recherche a été présentée à hardwear.io NL 2024, les diapositives sont disponibles ici. La présentation sera publiée prochainement.
Exploit de la table de sauts
Le premier exploit utilise une vulnérabilité où les tables de sauts du code de l'hyperviseur sont partagées avec le kernel invité, et se trouve dans /_old_jump_table_exploit/. En détournant l'entrée de table de sauts pour l'hypercall VMMCALL_HV_SET_CPUID_PS4, on peut obtenir l'exécution de code dans l'hyperviseur. Nous exécutons une chaîne ROP qui désactive la pagination imbriquée (NPT) et le piège d'exécution en mode invité (GMET), ce qui nous permet de désactiver la mémoire à exécution seule (XOM), aussi appelée xotext, dans les entrées de table de pages (PTEs) du kernel afin de la vider, ainsi que d'activer l'écriture dans les PTEs pour hooker/patch le kernel.
Cette méthode nécessite un nombre important de gadgets et d'offsets, ce qui explique principalement pourquoi cet exploit n'est pas celui principal. De plus, il ne casse actuellement l'hyperviseur que sur le cœur où la chaîne ROP s'exécute ; l'hyperviseur reste actif sur les autres cœurs et devrait être désactivé.
Exploit des indicateurs QA
L'exploit principal et recommandé tire parti du fait que les indicateurs d'assurance qualité (QA) du système sont partagés entre l'hyperviseur et le kernel invité. Lors de l'initialisation de l'hyperviseur, le code d'initialisation de la construction des tables de pages imbriquées vérifie les indicateurs QA pour le drapeau de débogage au niveau système (SL). Si ce drapeau est défini, les entrées de table de pages imbriquées (PTEs) n'auront pas le bit xotext défini pour les pages .text du kernel, et en outre les pages .text du kernel auront également le bit d'écriture défini.
Ces indicateurs ne sont pas réinitialisés par le chargeur sécurisé lors de la reprise du mode veille, contrairement à l'hyperviseur. En définissant le drapeau SL, en mettant le système en veille puis en le reprenant, nous pouvons modifier les tables de pages du kernel invité pour rendre les pages .text du kernel lisibles/écrivables, permettant de vider le kernel et d'appliquer des hooks/patchs.
byepervisor.elf) devra être envoyée deux fois : une fois avant la mise en veille du système et une autre après la reprise.Cette charge utile d'exploit est compilée avec le SDK PS5-Payload-Dev. Notez également que la compilation de hen/ est un peu particulière, car elle est compilée en un binaire plat copié dans une cavité de code du kernel. L'intégralité du code dans hen/ s'exécute en mode superviseur/noyau.
byepervisor.elfbyepervisor.elf (si vous utilisez le chargeur d'ELF de John Tornblom, il devrait continuer à accepter les charges utiles après la reprise ; sinon, l'exploit UMTX devra être relancé)byepervisor.elf ne doive être envoyé qu'une seule foisLes personnes intéressées par la contribution à la recherche/développement PS5 peuvent rejoindre un discord que j'ai mis en place ici.