SPTM/MIE deep dive: sptm.t8160 820.22 -> 820.40.24 (+64 KiB)

- docs/SPTM-MIE-27.2.md: separate SPTM firmware changed (kernel __DATA_SPTM
  is not the monitor); new DART GAPF race, GMMU TLBI verification, iommu
  refcount, Dekker locks, hibernation handoff/latch checks; TXM build-only;
  Exclave +229 KB; MIE SK tag-page check unchanged (210 insns, relocated)
- candidate directions: DART unganged-GAPF race, hibernation handoff page
  count, SK tag-page aliasing, dangling tag storage; no working bypass
- correct the earlier claim that SPTM was unchanged
- tools: fw_diff, string_xref, func_string_diff
This commit is contained in:
JBJF committed 2026-10-31 17:14:56 +08:00
1 parent 300d4805be
commit 09a02858f6
4 files changed
+172 -51

No files matched your search

+17 -49
View File
@@ -126,57 +126,25 @@ per-CVE signature.
## PPL / SPTM / MIE
This is the part the request specifically asked to dig into.
**Correction:** the kernel's `__DATA_SPTM` segment is byte-identical (311,296 B,
same SHA), but SPTM is a separate firmware image and **did** change:
- `__DATA_SPTM` is **byte-identical** in both builds: 311,296 bytes, SHA-256
`f4bc1e5e95f61af5…`. No SPTM code or data changed.
- The PPL token strings (`UAT_PPL_IOCTL_*`, `PPL map operation failed`,
`PPL state object`) are unchanged; no new PPL checks or messages.
- No MIE / Memory Integrity / mtag / page-protection strings were added or removed.
- The only SPTM-related additions are boot-time memory-size validation:
`memsize=%u MB leaves no memory for XNU/SPTM to manage`, `Mismatch of
ARM_LARGE_MEMORY in SPTM/XNU`, and iBoot DRAM-size checks. These are
configuration checks, not a permission bypass.
- The 27.2 advisory contains no component named PPL, SPTM, MIE, or Page Protection,
and no CVE description mentions them.
- `Firmware/sptm.t8160`: SPTM-820.0.22 → **SPTM-820.40.24**, 1,261,600 → 1,327,136 B
(+64 KiB, all in `__LATE_CONST`); `__TEXT_EXEC` same size, different hash.
- New checks: DART `VIOLATION_T8110_DART_UNGANG_GAPF_RACE`, GMMU TLBI
verification, IOMMU read-refcount validation, UAT Dekker lock timeouts,
`VIOLATION_NVME_ILLEGAL_HIBERNATION_QUEUE_LATCH`, hibernation handoff page count.
- `txm.iphoneos`: same size, build-path/version only (Image4 374~7022 → 374~8637).
- `exclavecore`: 33,259,754 → 33,489,130 B (+229,376) — separate domain.
- MIE/MTE policy in SPTM is unchanged: the `MTE tag page containing SK tags`
check is a 210-instruction function in both builds (relocated, same shape), and
the kernel's MTE strings are identical. The Exclave image changed separately.
**Verdict: no PPL, SPTM, or MIE bypass is fixed in iOS 27.2, and the firmware diff
shows no change in the SPTM/PPL/MIE code paths.** A bypass PoC for any of the three
would have to come from a different bug, not from this update. The kernel CVEs with
"write kernel memory" impacts are ordinary kernel memory-safety bugs; none of them
is a page-table / monitor bypass on its own, and exploiting one would still have to
defeat SPTM/PPL/MIE at runtime.
## The 15 Kernel CVEs — what the advisory claims vs. what the binary shows
| CVE | Advisory impact | Description | Binary evidence | R/W potential |
|---|---|---|---|---|
| 2026-112474 | terminate or **write kernel memory** | UAF | vm_map / lock-overflow strings (candidate) | theoretical UAF→R/W, no trigger |
| 2026-112476 | terminate | OOB read | kmalloc/zone paths, no unique string | read/DoS only |
| 2026-112501 | terminate | race | — | DoS |
| 2026-112507 | terminate or **write kernel memory** | OOB write | `ipr != NULL`, `table != NULL`, `ipc_misc.c` | **not reachable** from an unentitled app (-300) |
| 2026-112514 | terminate or corrupt kernel memory | UAF | framebank / page-lifecycle strings (candidate) | theoretical |
| 2026-112516 | terminate | UAF | — | DoS |
| 2026-112517 | terminate or corrupt kernel memory | UAF | — | theoretical |
| 2026-112576 | unexpected COW memory changes | memory integrity | `VM entry ... lock shared lock overflow` (candidate) | data-corruption primitive |
| 2026-112606 | terminate | type confusion | — | theoretical |
| 2026-112624 | bypass Privacy preferences | improved checks | new `com.apple.private.*` / TCC-adjacent strings (candidate) | privacy bypass, not kernel R/W |
| 2026-112665 | determine kernel memory layout | info disclosure | `size <= sdl->sdl_alen` (candidate) | KASLR leak candidate |
| 2026-112679 | terminate or corrupt kernel memory | UAF | — | theoretical |
| 2026-112698 | terminate | memory handling | — | DoS |
| 2026-65350 | terminate or corrupt kernel memory | UAF | — | theoretical |
| 2026-84495 | terminate or **write kernel memory** | UAF | — | theoretical |
"Advisory impact" is Apple's wording. "Binary evidence" is what the 27.2 kernel
actually adds; where no unique string exists, the CVE cannot be pinned to a function
from the image alone. "Theoretical" means the primitive class can lead to R/W, not
that a working trigger is known. No trigger code for these 15 was recovered from the
diff, and no PoC was fabricated.
Note the discrepancy on 112507: Apple calls it an out-of-bounds write, while the
27.2 fix is a NULL-check pair (`ipr`, `table`) plus a new `ipc_misc.c` string. A NULL
dereference is a DoS, not a reclaimable out-of-bounds object; this matches the
device result.
The full analysis, function addresses, and candidate bypass directions (DART
GAPF race, hibernation handoff, SK tag-page aliasing, dangling tag storage) are in
[SPTM-MIE-27.2.md](SPTM-MIE-27.2.md). No working SPTM/MIE bypass was produced: the
27.2 changes add checks, and the candidate paths need a reachable primitive that
the diff does not contain.
## What can be turned into a PoC