
Proof-of-concept für einen behobenen PAC-Diversifier-Bypass im tmpfs-setxattr-Handler unter iOS 26.6, der die Erreichbarkeit des verwundbaren Signierungspfads aus dem Userspace demonstriert.
Komponente: XNU VFS — default_setxattr_doubleagent (tmpfs VNOP)
Betroffen: iOS / iPadOS 26.6 (23G71) und früher
Behoben in: iOS / iPadOS 26.6.1 (23G83)
Typ: Fester PAC-Diversifier bei der Zeiger-Signierung des xattr-Handlers
Auswirkung: PC-Kontrolle aus dem Kernel-Kontext; vollständige Rechteausweitung in Kombination mit einer Kernel-Write-Primitive
Entdeckt von: Bhaswanth Chigurupati, Billy Jheng Bing Jhong, Pan Zhenpeng (@Peterpan0927) von STAR Labs SG Pte. Ltd.
(laut Apple-Sicherheitshinweis — iOS 26.6.1)
default_setxattr_doubleagent, der VNOP-xattr-Handler für das tmpfs-Dateisystem, signiert den Funktionszeiger des xattr-Handlers mit einem festen, zur Compilezeit konstanten PAC-Diversifier: #0x307a.
; XNU-Kernel — default_setxattr_doubleagent (dekompiliert)
handler_ptr = vnode_operations[VNOP_SETXATTR_SLOT]; // aus vnop-Tabelle gelesen
signed_ptr = PACDA(handler_ptr, 0x307a); // mit FESTEM Diversifier signieren
... call AUTDA(signed_ptr, 0x307a) → BLR // authentifizieren und verzweigen
Da der Diversifier fest und öffentlich bekannt ist, kann ein Angreifer mit einer Kernel-Write-Primitive Folgendes tun:
forged = PACIA(shellcode_addr, 0x307a)forged in den entsprechenden Slot der vnode_operations-Tabelle des Ziel-vnode schreiben.setxattr() für eine beliebige Datei auf dem tmpfs-Mount aufrufen → der Kernel führt shellcode_addr aus.In der Kernel-Rechteausweitungskette von iOS 26.6:
CVE-2026-64788 (IOGPUFamily UAF) → Kernel-r/w-Primitive
CVE-2026-65330 (dieser Bug) → PC-Kontrolle → root (uid=0)
Die sign_ptr-Primitive (PACIA mit Diversifier #0x307a) wird im Jailbreak-POC mithilfe von Inline-ARM64e-Assembly implementiert. Die Kernel-r/w-Primitive wird verwendet, um:
v_op-Zeiger des Ziel-vnode zu lokalisieren.vnode_operations[VNOP_SETXATTR_SLOT] zu schreiben.setxattr("/tmp/trigger", ...) auszulösen.Der eigenständige PoC (poc_pac_bypass.c) übt den verwundbaren VNOP-Pfad aus:
/var/root/poc65330_testsetxattr() mit XATTR_NAME="com.apple.poc.cve65330.test" auf → trifft auf default_setxattr_doubleagentremovexattr() auf, um den Bereinigungspfad zu erreichenDer PoC fälscht keinen PAC-Zeiger und überschreibt keine Kernel-Daten — er demonstriert lediglich, dass der verwundbare #0x307a-Signierungspfad aus dem Userspace über einen normalen setxattr()-Syscall erreichbar ist.
/var/root/ (der setxattr-Aufruf selbst ist von jedem Prozess aus erreichbar — der Dateipfad kann an einen in der Sandbox beschreibbaren Ort angepasst werden)# Eigenständiges C-Binary (keine Frameworks erforderlich)
clang -arch arm64 -o poc poc/poc_pac_bypass.c
# Für On-Device (mit Signierung):
clang -arch arm64 -isysroot $(xcrun --sdk iphoneos --show-sdk-path) \
-o poc poc/poc_pac_bypass.c
codesign -s "Apple Development" poc
Der feste Diversifier 0x307a wurde anhand der Disassemblierung des 26.6 (23G71)-Kernelcaches verifiziert:
; default_setxattr_doubleagent + 0x?? (ungefähr)
MOVZ x1, #0x307a ; Diversifier-Konstante
PACDA x0, x1 ; Handler-Zeiger signieren
Das entsprechende AUTDA x0, x1 an der Aufrufstelle verwendet dieselbe Konstante, was bestätigt, dass jeder mit PACIA gefälschte Zeiger mit Diversifier 0x307a erfolgreich authentifiziert wird.
| Datum | Ereignis |
|---|---|
| 2026-08-17 | iOS 26.6.1 mit Fix veröffentlicht |
| 2026-08-17 | Apple-Danksagungen im Sicherheitshinweis veröffentlicht |