
CVE-2026-64747 AGXG14P count-bitmask OOB trigger probe (A15/iOS 26.5.2)
Target: iPhone 13 (A15) on iOS 26.5.2. This app hammers the AGXG14P GPU
command-queue paths that plausibly feed a per-queue count bitmask
(count >= 0x400 → OOB 0x40-byte slot write → kernel heap corruption).
0xfffffff008003a8c (26.5.2): x1 = 32-bit count mask.
For each set bit n it copies a 0x40-byte fixed template
(00 00 00 00 + FF×60) into obj+0x1040+n*0x40 and obj+0x1540+n*0x40.
26.6 fix: reject count >= 0x400 (i.e. any bit ≥ 10). Legal slots 0..9.[cmd+0x14] field (wrapper 0xfffffff00800c9d0). The batch slot arrays
(10 slots × 0x40) live at object offsets 0x1040 / 0x1540.count is not reachable via any static call/literal — the fn is
reached through a runtime-built dispatch table (indirect PAC call).[cmd+0x14] (or the mask). That is
exactly what this probe tries to discover empirically.A submitted batch where some command's 0x14 field (or the OR across the
batch) sets a bit ≥ 10. This probe therefore floods every plausible surface
with high-bit values: shared-event signal values 1<<k (k=0..31),
dense masks (0x3FF|0x400..0xFFFFFFFF), 256-buffer single batches, fences,
render + compute + blit, 32 queues.
If the probe triggers the bug, the expected symptoms are, in increasing severity:
A ready ipa is built automatically by GitHub Actions on every push and
dropped into the build artifacts of the latest run
(AGXProbe.ipa). It is unsigned, so install it with any free-Apple-ID
sideloader:
The current ipa: bundle id com.agxprobe.test, arm64, MinOS 17.0.
If a sideloader rejects the bundle id, re-sign with a unique id.
AGXProbe.xcodeproj in Xcode (16.x).PRODUCT_BUNDLE_IDENTIFIER (e.g. com.you.agxprobe1) to
anything unique so signing succeeds.eventStorm → inFlight → fenceStorm → multiQueue → computeHeavy → chainedEvents → mixed → (repeat).agxprobe.log in the app's Documents,
reachable via Files app because UIFileSharingEnabled is on) and send it
back.If it panicked:
Settings → Privacy & Security → Analytics & Improvements →
Analytics Data → find the newest panic-full-<date> (or JetsamEvent /
ipa-log-<timestamp> for a killed app) → Share / AirDrop / copy the tail.
The first lines after "panic(cpu ...)" show the crashing kernel function —
send those back.