# Jamf Threat Labs: ARM MTE and Apple Memory Integrity Enforcement Expose iOS Kernel Use-After-Free in Networking Subsystem

> Jamf Threat Labs used ARM's Memory Tagging Extension (MTE) and Apple's Memory Integrity Enforcement (MIE) on iPhone 17-generation hardware (A19/A19 Pro, iOS 26.4) to root-cause a real use-after-free race condition in the iOS kernel's per-process network policy subsystem, where memory is freed while a per-object mutex is still held. The bug was silently masked on non-MTE hardware for years by allocator zeroing but produces consistent, reproducible kernel panics on MTE-enabled devices; no CVE has been assigned, no public PoC was released, and no in-the-wild exploitation is claimed.

- **Published:** 2026-06-10T00:00:00Z
- **Last reviewed:** 2026-06-10T00:00:00Z
- **Canonical:** https://intel.threadlinqs.com/threat/TL-2026-2044
- **ID:** TL-2026-2044
- **Severity:** MEDIUM
- **Category:** VULNERABILITY
- **Status:** TRACKING
- **Detections:** 9 · **IOCs:** 8 (full data via the Threadlinqs MCP server — Purple tier)

## Description

On 2026-06-10, Jamf Threat Labs researchers Nir Avraham and Hu Ke published a technical case study on how ARM's Memory Tagging Extension (MTE), as implemented via Apple's Memory Integrity Enforcement (MIE), surfaces previously invisible kernel memory-safety bugs. Their MTE-based differential analysis pipeline began flagging an anomalous kernel-panic signal in recent months, which the team root-caused to a race condition deep in the subsystem that manages per-process network policy objects.

The mechanism: the subsystem uses a coarse reader-writer lock (Lock A) protecting a global tree-structured registry of policy objects, and a finer-grained per-object mutex (Lock B) protecting an individual object's internal state. Because the two locks cannot safely be nested in either direction (deadlock risk), one thread performs an object lookup under Lock A, releases it, and retains a raw pointer to the object; concurrently, a second thread acquires the object's own mutex (Lock B) and frees the object's backing memory while still holding that mutex. The first thread then dereferences the now-stale pointer through the unprotected window between the coarse lock's release and the fine-grained lock's lifecycle -- a classic use-after-free.

On non-MTE hardware this was a non-event: XNU's zone allocator (kalloc/kfree) zeroed freed memory, and the vulnerable code path happened to tolerate a zero-valued read, so the bug "has been executing somewhere between 'occasionally' and 'frequently' in production for an unknown length of time" with zero observable effect. On MTE-enabled iPhone 17/17 Pro/17 Pro Max/iPhone Air hardware (A19/A19 Pro chips), Apple's Enhanced MTE (EMTE, FEAT_MTE4) performs synchronous tag checking on every access -- unlike Google Pixel's asynchronous MTE mode, which logs faults rather than raising them immediately, Apple deliberately chose synchronous mode for MIE. When the stale pointer is dereferenced, the freed allocation's 4-bit tag (stored in bits 59:56 of the 64-bit address, exploiting the ARM64 Top Byte Ignore feature) no longer matches the pointer's tag, producing a synchronous tag-check fault. In the crash Jamf analyzed, the ARM64 X26 register held the stale pointer carrying its original allocation-time tag (0xF6 in their example), the Link Register (LR) pointed into the kernel mutex slow-path function lck_mtx_lock_contended (indicating the crash occurred mid-mutex-contention), the Exception Syndrome Register (ESR) encoded the tag mismatch, and the XNU thread-scheduling flag TH_SFLAG_RW_PROMOTED was set on the faulting thread -- evidence it had been priority-promoted due to reader-writer lock contention, confirming the race's concurrency signature. Tag writes/validation rely on the ARM64 STG/ST2G (Store Tag) instructions and the CASA atomic compare-and-swap instruction used in the mutex acquisition path. The result is a reliable, deterministic kernel panic rather than silent corruption.

Jamf built a working proof-of-concept that creates the relevant kernel network-policy objects from an unprivileged, sandboxed app, triggers qualification from a content filter, and rapidly destroys the objects to force the race -- precisely the pattern that produced the original panic, and demonstrating the vulnerable path is reachable without special entitlements. Jamf also notes a structural limit on MTE's exploit-mitigation value even where it does apply: a single tag has only 1-in-16 (6.25%) collision probability per bypass attempt, so multi-step exploit chains that need several successful bypasses in sequence become exponentially less reliable (roughly 0.024% for a three-step chain) -- but MTE is explicitly not a complete solution, since logical bugs, same-zone type confusions, and non-corruption info leaks fall outside its scope. For responsible-disclosure reasons the researchers withheld the exact code path and subsystem name, describing only "the shape of the bug," and did not publish PoC code. No CVE has been assigned to this specific finding as of publication.

This sits within Apple's broader MIE rollout: MIE (announced 2025-09-09, shipped with the iPhone 17 lineup on 2025-09-19) combines synchronous-mode EMTE with secure typed allocators (kalloc_type in the kernel, xzone_malloc at user level, and WebKit's libpas, all operating at 16KB page-level granularity to prevent attackers from controlling allocation positioning) plus Tag Confidentiality Enforcement (TCE) -- built via a Secure Page Table Monitor and frequent re-seeding of pseudo-random tag generators -- to defeat speculative-execution tag-leak attacks such as the previously published TikTag research, and to mitigate a Spectre V1-class side channel via forced type segregation. Coverage spans the kernel and 70+ userland processes, including apps identified as likely exploitation vectors (social/messaging apps); third-party apps can opt in via an Xcode entitlement. Apple states MIE explicitly targets the memory-corruption primitives that mercenary spyware chains (the only observed system-level iOS attack class) universally rely on for kernel-level access, and that in Apple's own evaluation MIE "cut off so many exploit steps at a fundamental level that it was not possible to restore the chains by swapping in new bugs." Corellium, a commonly used iOS emulation platform for security research, does not currently support MTE/MIE emulation, meaning this bug class is only reproducible on physical iPhone 17-generation hardware.

## MITRE ATT&CK

- T1592.001 Hardware
- T1592.002 Software
- T1595.002 Vulnerability Scanning
- T1588.006 Vulnerabilities
- T1587.004 Exploits
- T1106 Native API
- T1082 System Information Discovery
- T1529 System Shutdown/Reboot
- T1499.004 Application or System Exploitation

## Sources

- [ARM MTE & Apple MIE: How Hardware Memory Tagging Reveals Invisible iOS Kernel Vulnerabilities](https://www.jamf.com/blog/arm-mte-apple-mie-memory-safety-ios-kernel-vulnerability-research/)
- [Memory Integrity Enforcement: A complete vision for memory safety in Apple devices](https://security.apple.com/blog/memory-integrity-enforcement/)
- [Suspected Bug Collision: iOS/OSX Content Filter Kernel UAF Analysis + POC](https://www.jamf.com/blog/suspected-bug-collision-ios-osx-content-filter-kernel-uaf-analysis-poc/)
- [Apple iPhone Air and iPhone 17 Feature A19 Chips With Spyware-Resistant Memory Safety](https://thehackernews.com/2025/09/apple-iphone-air-and-iphone-17-feature.html)
- [What is Apple's Memory Integrity Enforcement, and why does it matter?](https://www.computerworld.com/article/4057784/what-is-apples-memory-integrity-enforcement-and-why-does-it-matter.html)
- [Memory Integrity Enforcement (MIE) on iOS Deep Dive](https://www.8ksec.io/mie-deep-dive-kernel/)
- [End of Jailbreaks? Apple MIE on iPhone 17 Explained](https://www.corellium.com/blog/apples-mie-framework-makes-jailbreak-testing-obsolete)
- [About the security content of iOS 26.4 and iPadOS 26.4](https://support.apple.com/en-us/126792)
- [Memory Integrity Enforcement](https://mjtsai.com/blog/2025/09/11/memory-integrity-enforcement/)

## Full data

Detection queries (Splunk SPL / Microsoft KQL / Sigma) and IOC values require the Threadlinqs MCP server (Purple tier): https://intel.threadlinqs.com/mcp

Canonical: https://intel.threadlinqs.com/threat/TL-2026-2044
