
Squelette de PoC pour CVE-2021-28664, un use-after-free du pilote GPU Mali kbase, démontrant une primitive de lecture/écriture arbitraire de mémoire physique du noyau sur Android ARM64.
Squelette de PoC pour la chaîne d'exploitation UAF du pilote GPU Mali kbase (CVE-2021-28664) → primitives de lecture/écriture arbitraires en mémoire physique du noyau. Destiné aux plateformes ARM64 Android génériques, indépendant de tout fabricant ou modèle spécifique.
Le périmètre de recherche s'arrête exclusivement aux « primitives de lecture/écriture arbitraires en mémoire physique du noyau » : comment transformer un use-after-free dans un pilote GPU en une capacité de lecture/écriture mémoire noyau stable, contrôlée et à échec sécurisé.
Ce dépôt ne fournit aucun exploit. Il ne contient ni exploit fonctionnel, ni code directement exécutable, ni offsets/numéros de série/micrologiciels spécifiques à un appareil ; toute utilisation à des fins d'attaque est interdite (voir ci-dessous).
| Maillon | Condition préalable |
|---|---|
| Vulnérabilité elle-même | La version du pilote Mali kbase se situe dans la plage affectée par CVE-2021-28664 (série r avant correction amont) ; indépendant de la version du noyau, dépend uniquement du pilote |
| Ressources GPU | /dev/mali accessible à l'application concernée ; MEM_ALLOC prend en charge les grands buffers SAME_VA ; le comportement de MEM_ALIAS correspond à la description de la vulnérabilité |
| Réutilisation du pipe | Linux ≥ 4.5 (introduction de pipe_buf_operations), vérifié fonctionnel de 4.9 à 4.14 ; F_SETPIPE_SZ permet de réduire le pipe à une seule page |
| Fuite KASLR | Noyau compilé avec CONFIG_RANDOMIZE_BASE (arm64 ≥ 4.6) ; anon_pipe_buf_ops présent dans la table de symboles publique |
| Modèle d'adresse physique | arm64 + disposition vmemmap ; sizeof(struct page) et format des tables de pages doivent être mesurés empiriquement, aucune hypothèse permise |
pipe_buffer ou les vérifications de copy_page_to_iter diffèrent significativement (à partir de 5.x, une revérification selon les sources correspondantes est nécessaire ; la structure de la chaîne peut servir de référence mais les détails ne sont pas universels) ;/dev/mali (restrictions SELinux/politiques du fabricant).TODO(DEVICE) ; l'adaptation relève du travail de rétro-ingénierie de l'utilisateur, le dépôt ne s'en charge pas.CVE-2021-28664 : le chemin MEM_ALIAS du pilote Mali kbase manque de vérification des permissions GPU_WR, permettant à un attaquant d'aliaser des pages mémoire GPU déjà libérées dans son propre espace d'adressage GPU, créant ainsi une « visibilité/écriture persistante côté GPU sur des pages physiques libérées » — un use-after-free à la frontière GPU/noyau.
L'intérêt de l'exploitation ne réside pas dans la mémoire GPU elle-même, mais dans le fait que :
WRITE_VALUE, modification ciblée des pages visibles via l'alias.buffer GPU victime + dump des tables de pages MMU → établissement de la carte d'adresses physiques
→ déclenchement de la libération du buffer pour créer de la pression → spray de pipes (F_SETPIPE_SZ réduit)
→ le tableau pipe_buffer atterrit dans la zone libérée (réutilisation UAF inter-cache)
→ scan du pointeur ops via la vue alias → fuite de anon_pipe_buf_ops → KASLR slide
→ réécriture GPU des champs page / offset / len du pipe_buffer
→ via les chemins légitimes de lecture/écriture de pipe
⇒ lecture de page physique arbitraire (falsification du pointeur page)
⇒ écriture de page physique arbitraire (chemin d'écriture pipe merge)
⇒ utilisation d'une page à contenu connu comme oracle d'auto-vérification, garantissant que les lectures/écritures ne tombent pas dans des trous/zones non mappées
Fin du périmètre.
page_to_virt selon les fabricants, zones réservées no-map inexistantes dans le mapping linéaire (toute lecture provoque un panic).