
Proof-of-Concept für einen Out-of-Bounds-Write in XNU's vfs_attr_pack_internal (getattrlist) unter iOS 26.6, der Kernel-Heap-Korruption demonstriert und Hinweise zur Ausnutzung für das Fälschen von PAC-Pointern enthält.
vfs_attr_pack_internalKomponente: XNU VFS — vfs_attr_pack_internal (getattrlist-Syscall)
Betroffen: iOS / iPadOS 26.6 (23G71) und früher
Behoben in: iOS / iPadOS 26.6.1 (23G83)
Typ: Out-of-Bounds-Schreibzugriff auf den Puffer des Aufrufers
Auswirkung: Kernel-Heap-Korruption; aus dem Kernel-Kontext (nach Kernel-Lese-/Schreibzugriff) ermöglicht das Schreiben eines PAC-signierten Zeigers in einen vom Angreifer kontrollierten Puffer
Entdeckt von einem anonymen Forscher
(laut Apple-Sicherheitshinweis — iOS 26.6.1)
vfs_attr_pack_internal iteriert über die angeforderte Attribut-Bitmap und schreibt jedes Attribut sequenziell in den Puffer des Aufrufers. Es wird nicht geprüft, ob der laufende Ausgabe-Offset bufsize überschritten hat, bevor Attribut-Slot 51 () geschrieben wird.
SETXATTR_SLOTBei einer Datei mit einem 16 Zeichen langen Namen beträgt die vollständige gültige Attributausgabe 0x1a4 (420) Bytes. Slot 51 beginnt bei Offset 0x198 (408 Bytes). Wenn der Aufrufer einen Puffer bereitstellt, der kleiner als 0x198 + 8 ist, schreibt der Kernel 8 Bytes über das Ende des Puffers hinaus:
; vfs_attr_pack_internal (betroffener Pfad, 26.6 / 23G71)
; Slot-51-Schreibzugriff — keine Grenzprüfung vor dem Speichern
str x_attr_data, [buf + 0x198] ; OOB, wenn bufsize < 0x198 + 8
Die gültigen Attributmasken, verifiziert durch On-Device-Sonde (getattrlist bei einem 16 Zeichen langen Dateinamen, iOS 26.6):
| Feld | Maske |
|---|---|
commonattr | 0xffe7ffff (Bits 19, 20 sind auf diesem Kernel ungültig) |
fileattr | 0x0000363f |
forkattr | 0xffffe003 |
Mit diesen Masken bei einem 16 Zeichen langen Dateinamen beträgt die Gesamtausgabe 0x1a4 Bytes. Der OOB tritt bei Slot 51 (buf+0x198) auf, sobald bufsize < 0x1a0.
Unter iOS 26 verhindert die KHEAP_TEMP-Isolation, dass der OOB-Schreibzugriff aus dem Userspace heraus benachbarte Heap-Allokationen auf nützliche Weise direkt korrumpiert. Der Fehler wird in dieser Forschung als nur Kernel-Heap eingestuft:
vfs_attr_pack_internal von einer kontrollierten Aufrufstelle aus.In der iOS-26.6-Jailbreak-Kette wird dieser Fehler in der letzten Stufe verwendet, um einen PACIA-gefälschten Zeiger in eine Kernel-Allokation neben dem Puffer des Aufrufers zu schreiben.
poc_getattrlist_oob.c demonstriert die OOB-Grenze mit drei Aufrufen:
| Aufruf | Puffergröße | Erwartetes Ergebnis |
|---|---|---|
| 1 | 64 Bytes | Kernel schreibt 0x1a4 Bytes → OOB bei buf+0x198 (344 B über das Ende hinaus) |
| 2 | 0x198 Bytes | OOB-Schreibzugriff beginnt exakt am Ende des Puffers |
| 3 | 0x1a4 Bytes | Exakte gültige Größe → sauberer Erfolg |
Der PoC erstellt einen 16 Zeichen langen Dateinamen (/var/root/aaaaaaaaaaaaaaaa) als Testziel, führt alle drei getattrlist()-Aufrufe aus und gibt die Rückgabecodes aus. Ein Kernel-Panic-Protokoll (falls ausgelöst) zeigt einen Fehler bei buf+0x198.
/var/root/ (zum Erstellen der 16-Zeichen-Testdatei; der Pfad kann an einen beliebigen beschreibbaren Speicherort angepasst werden)# Eigenständige C-Binärdatei — keine Frameworks erforderlich
clang -arch arm64 -o poc poc/poc_getattrlist_oob.c
# Für On-Device:
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_getattrlist_oob.c
codesign -s "Apple Development" poc
| Datum | Ereignis |
|---|---|
| 2026-08-17 | iOS 26.6.1 mit Fix veröffentlicht |
| 2026-08-17 | Apple veröffentlicht Danksagungen im Sicherheitshinweis |