
Preuve de concept pour une écriture hors limites dans vfs_attr_pack_internal (getattrlist) de XNU sur iOS 26.6, démontrant la corruption du tas du noyau et des notes d'exploitation pour la falsification de pointeurs PAC.
getattrlist via vfs_attr_pack_internalComposant : XNU VFS — vfs_attr_pack_internal (appel système getattrlist)
Versions concernées : iOS / iPadOS 26.6 (23G71) et versions antérieures
Corrigé dans : iOS / iPadOS 26.6.1 (23G83)
Type : Écriture hors limites dans le tampon de l'appelant
Impact : Corruption du tas du noyau ; depuis le contexte noyau (après lecture/écriture noyau), permet d'écrire un pointeur signé PAC dans un tampon contrôlé par l'attaquant
Découvert par un chercheur anonyme
(selon l'avis de sécurité Apple — iOS 26.6.1)
vfs_attr_pack_internal parcourt le bitmap d'attributs demandé et écrit chaque attribut séquentiellement dans le tampon de l'appelant. Il ne vérifie si le décalage de sortie courant a dépassé avant d'écrire l'emplacement d'attribut 51 ().
bufsizeSETXATTR_SLOTPour un fichier avec un nom de 16 caractères, la sortie complète d'attributs valides est de 0x1a4 (420) octets. L'emplacement 51 commence au décalage 0x198 (408 octets). Lorsque l'appelant fournit un tampon plus petit que 0x198 + 8, le noyau écrit 8 octets au-delà de la fin du tampon :
; vfs_attr_pack_internal (chemin affecté, 26.6 / 23G71)
; écriture de l'emplacement 51 — aucune vérification de limites avant le stockage
str x_attr_data, [buf + 0x198] ; OOB si bufsize < 0x198 + 8
Les masques d'attributs valides vérifiés par sonde sur appareil (getattrlist sur un nom de fichier de 16 caractères, iOS 26.6) :
| Champ | Masque |
|---|---|
commonattr | 0xffe7ffff (les bits 19, 20 sont invalides sur ce noyau) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
Avec ces masques sur un nom de fichier de 16 caractères, la sortie totale = 0x1a4 octets. Le dépassement se produit à l'emplacement 51 (buf+0x198) dès que bufsize < 0x1a0.
Sur iOS 26, l'isolation KHEAP_TEMP empêche l'écriture hors limites de corrompre directement les allocations de tas adjacentes de manière utile depuis l'espace utilisateur. Le bug est classé comme tas du noyau uniquement dans cette recherche :
vfs_attr_pack_internal depuis un site d'appel contrôlé.Dans la chaîne de jailbreak iOS 26.6, ce bug est utilisé dans l'étape finale pour écrire un pointeur forgé PACIA dans une allocation noyau adjacente au tampon de l'appelant.
poc_getattrlist_oob.c démontre la limite hors limites avec trois appels :
| Appel | Taille du tampon | Résultat attendu |
|---|---|---|
| 1 | 64 octets | Le noyau écrit 0x1a4 octets → dépassement à buf+0x198 (344 B au-delà de la fin) |
| 2 | 0x198 octets | L'écriture hors limites commence exactement à la fin du tampon |
| 3 | 0x1a4 octets | Taille valide exacte → succès propre |
Le PoC crée un nom de fichier de 16 caractères (/var/root/aaaaaaaaaaaaaaaa) comme cible de test, exécute les trois appels getattrlist(), et affiche les codes de retour. Un journal de panique du noyau (si déclenché) montrera une faute à buf+0x198.
/var/root/ (pour créer le fichier de test de 16 caractères ; le chemin peut être ajusté vers tout emplacement accessible en écriture)# Binaire C autonome — aucune framework nécessaire
clang -arch arm64 -o poc poc/poc_getattrlist_oob.c
# Pour un appareil :
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_getattrlist_oob.c
codesign -s "Apple Development" poc
| Date | Événement |
|---|---|
| 2026-08-17 | iOS 26.6.1 publié avec le correctif |
| 2026-08-17 | Crédits Apple publiés dans l'avis de sécurité |