On September 28, 2026 Apple shipped emergency updates for an out-of-bounds write in CoreGraphics, the low-level 2D rendering framework behind every glyph, PDF and image Apple devices draw. Tracked as CVE-2026-86950 (CVSS 3.1 base 8.8, CWE-787), the bug was reported by Meta's product security team and, in Apple's words, "may have been exploited in an extremely sophisticated attack against specific targeted individuals." CISA added it to the Known Exploited Vulnerabilities catalog on September 29 with a federal remediation deadline of October 2.
The root cause is not a classic bounds-check miss. It is a compiler optimization differential: two code paths that convert the same floating-point glyph coordinate to fixed-point produce different results when the value overflows a 32-bit integer. That inconsistency corrupts a glyph's bounding box, undersizes the rasterizer's coverage buffer, and lets a crafted font write past the allocation while drawing a single letter.
A public proof-of-concept now exists — it reliably crashes unpatched iPhones and Macs with a booby-trapped PDF, though weaponizing it to code execution is separate work. This brief walks the full glyph rendering path from CGContextShowGlyphsAtPositions to the overflow, maps the mercenary-spyware pattern it fits, and gives patch-posture hunts you can run today.
◈ Table of Contents
Vulnerability Profile
PHASE 01CVE-2026-86950 is a memory-corruption flaw in a component that runs on virtually every Apple device — and one that processes attacker-supplied data (fonts, PDFs, images) constantly. That combination is exactly what mercenary spyware vendors shop for: a bug in a universally reachable parser that an attacker can trigger with a file the victim never has to open deliberately.
| Attribute | Detail |
|---|---|
| CVE ID | CVE-2026-86950 |
| Component | CoreGraphics (anti-aliased path rasterizer) |
| Class | CWE-787 — Out-of-bounds Write HIGH |
| CVSS 3.1 | 8.8 — AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H |
| Reporter | Meta Product Security |
| Public analysis | Calif — "The Great Glyph Grift" + PoC harness |
| Exploited in wild | Yes — Apple-confirmed targeted attacks; CISA KEV |
| Published (NVD) | September 28, 2026 |
| CISA KEV added | September 29, 2026 (action due Oct 2, 2026) |
| Patched in | iOS/iPadOS 26.7.1 · macOS Tahoe 26.7.1 · macOS Sequoia 15.8.1 |
The CVSS user-interaction flag (UI:R) understates the real risk. In the targeted attacks Apple describes, "interaction" can be as little as receiving a message that auto-renders a preview — the user never knowingly opens anything. Treat this as a near-zero-click bug when prioritizing.
Disclosure & Exploitation Timeline
PHASE 02- 1Pre-disclosure (date undisclosed) — Attacks observed in the wild against specific individuals on iOS versions prior to iOS 27. Meta's product security team identifies the underlying CoreGraphics flaw and reports it to Apple.
- 2Sep 28, 2026 — Apple releases iOS/iPadOS 26.7.1, macOS Tahoe 26.7.1 and macOS Sequoia 15.8.1, crediting the fix and acknowledging possible exploitation in "an extremely sophisticated attack." NVD publishes CVE-2026-86950.
- 3Sep 29, 2026 — CISA adds CVE-2026-86950 to the Known Exploited Vulnerabilities catalog, setting a federal remediation deadline of October 2.
- 4Oct 1, 2026 — Calif publishes "The Great Glyph Grift," a full root-cause writeup, plus a public PoC harness that generates a crashing PDF/font pair. Reporting notes Meta quietly hardened WhatsApp's PDF attachment validation around the same window.
- 5Oct 1, 2026 onward — SANS ISC and multiple outlets flag the PoC and the possible WhatsApp delivery path, raising the odds of copycat crash and exploit-development activity.
Affected Products & Versions
PHASE 03Because CoreGraphics is shared system-wide, the surface is every app that renders a glyph, PDF or image — Mail, Messages, Safari preview, QuickLook, and third-party apps that use the system text stack. Note the split macOS fix line: Tahoe (26.x) and the still-supported Sequoia (15.x) each get a patch; the next major releases were unaffected.
| Platform | Vulnerable | Fixed build | Status |
|---|---|---|---|
| iOS / iPadOS | < 26.7.1 (iOS before iOS 27 targeted) | 26.7.1 | PATCH NOW |
| macOS Tahoe | 26.0 – 26.7.0 | 26.7.1 | PATCH NOW |
| macOS Sequoia | < 15.8.1 | 15.8.1 | PATCH NOW |
| iOS 27 / macOS 27 | Not affected | — | CLEAR |
Don't let "iOS before iOS 27" lull you. The enterprise reality is a long tail of devices parked on 26.x and 15.x for app-compatibility reasons. Those are exactly the fleet members an operator wants — fully functional, in active use, and unpatched. Inventory by build, not by marketing version.
Delivery Vector
PHASE 04Apple did not publish the delivery method, but the component gives strong hints and the public analysis narrows it further. CoreGraphics renders content the moment an app decides to preview it — which is why messaging apps, mail, and web previews are the classic routes for this bug class.
The PoC ships a minimal PDF that embeds a crafted TrueType font. When CoreGraphics rasterizes a glyph from that font, the overflow fires. A PDF is an ideal carrier: it travels as an innocuous attachment and is auto-previewed by many apps without an explicit "open."
Around the patch window, Meta quietly tightened WhatsApp's attachment-scoring to flag malformed or unverifiable embedded fonts in PDFs. That is a strong tell that a font-in-PDF was a real delivery path, though no source confirms WhatsApp was the exploited channel for this specific CVE.
Messaging Preview
Chat apps that render document thumbnails or inline PDF previews reach CoreGraphics before any tap.
Mail & QuickLook
Mail attachment previews and Finder QuickLook both invoke the system render path for PDFs and fonts.
Web / Safari
Web content embedding a crafted font or PDF is drawn through the same rasterizer stack.
Technical Deep Dive
PHASE 05This is the part that makes CVE-2026-86950 interesting. The bug is not a missing check — it is two correct-looking conversions that disagree only at the integer boundary, and that disagreement is enough to poison every size calculation that follows. The analysis below follows Calif's published root cause.
CoreGraphics' anti-aliased rasterizer uses a 4096×4096 sub-pixel box model. Floating-point coordinates become fixed-point through an inline helper that scales by 4096 and rounds:
On its own this looks fine. The problem is what the compiler emits for that (int32_t)v cast in different surrounding code — and whether v can be pushed outside the int32 range (±2,147,483,647) by a hostile glyph.
When the scaled double exceeds int32 bounds, the narrowing cast is undefined behavior — and the compiler is free to lower it differently in different functions. On ARM64 the two call sites diverge:
| Call site | Emitted instruction | Out-of-range result |
|---|---|---|
| aa_moveto | FCVTZS Wd, Dn | Saturates to INT32_MAX / INT32_MIN |
| aa_lineto | FCVTZS Vd.2D,Vn.2D + XTN | Vector convert then truncate — different value |
Same source line, same input, two different integers. A scalar path saturates; a vectorized path converts-then-truncates. The glyph's start point and its line segments now disagree about where they are in fixed-point space.
This is why "just add a bounds check" misses the lesson. The defect lives in the gap between the C abstract machine and the code the optimizer actually produces. Apple's fix clamps the value before the cast so neither lowering can ever see an out-of-range double.
The diverging coordinates flow into aa_add_edges, which tracks the path's bounding box by comparing consecutive points. When one endpoint carries a wrapped int32, the delta subtraction overflows and the wrong branch is taken — so the box fails to expand to cover the real extent of the glyph:
Result: a bounding box that reports a glyph as far narrower than it truly is.
In aa_cache_render, the width in pixels is derived straight from that corrupted box, and the per-scanline coverage buffer is sized from it:
An artificially small width_px yields a buffer too small for the edges the rasterizer is about to process. The allocation can land on the heap (malloc) or the stack (alloca) depending on size — giving an attacker a choice of corruption primitive.
As the rasterizer walks scanlines accumulating 16-bit alpha-coverage values, the real path edges extend past the undersized buffer. It keeps writing coverage increments beyond the allocation — a controlled out-of-bounds write. In the PoC this surfaces as an EXC_BAD_ACCESS crash; in a real exploit it is the primitive you build a chain on.
- Trigger is pure data: a font inside a PDF, no user action beyond a preview.
- Corruption target is attacker-influenceable (stack or heap) via glyph geometry.
- Apple patched >20 instances of the clamp across 8 aa_* functions — the whole rasterizer family was exposed.
The Rendering Attack Chain
PHASE 06From the app that previews the file to the overflowing write, every link is a legitimate system call. The chain below is the exact path the crafted glyph travels.
| Stage | Function | Role |
|---|---|---|
| Entry | CGContextShowGlyphsAtPositions | App asks CoreGraphics to draw glyphs at positions |
| Dispatch | ripc_DrawGlyphs → draw_glyph_bitmaps | Resolves each glyph to a bitmap render job |
| Rasterize | CGGlyphBitmapCreateWithPathAndDilation | Builds the glyph path; invokes the AA rasterizer |
| Convert | aa_moveto / aa_lineto → aa_double_to_fixed | Coordinate conversion — the differential overflow |
| Size | aa_add_edges → aa_cache_render | Corrupt bbox → undersized coverage buffer |
| Impact | aa_cache_render scanline loop | 16-bit coverage writes past allocation = OOB write |
From Crash to Code Execution
PHASE 07Calif released a working PoC, but it is important to be precise about what it does — and what it does not.
The published harness generates a minimal PDF and a matching TrueType font that reliably crash unpatched iPhones and Macs. The repository includes font-generation scripts, a sample harness and a Makefile to build the crashing files. The researchers are explicit: this is a crash, not code execution — "going from this to code execution is another exercise entirely."
Only generate or detonate the PoC on isolated, consented test devices you own. Never send a crash file to a device you do not control — crashing someone's phone is an attack, not a test.
Weaponization means turning the undersized-buffer OOB write into a controlled primitive, defeating ASLR and modern iOS allocator mitigations, and chaining to a sandbox escape — the kind of engineering a well-resourced spyware vendor already demonstrated in the attacks Apple cites. A public crash PoC lowers the bar for others to start that work and raises the near-term risk of copycat denial-of-service abuse. Patch posture is the only reliable defense.
The Mercenary-Spyware Pattern
PHASE 08CVE-2026-86950 fits a now-familiar template: a memory-corruption bug in a universally reachable Apple parser, reported by a platform vendor, used against a small number of hand-picked targets. It is worth putting beside the chain Apple and Meta disrupted a year earlier, because the TTPs rhyme.
| CVE | Component | Class | Role in pattern |
|---|---|---|---|
| CVE-2026-86950 | CoreGraphics (font/PDF) | CWE-787 OOB write · CVSS 8.8 | Current — targeted, Meta-reported |
| CVE-2025-43300 | ImageIO (image parsing) | OOB write · CVSS 10.0 | 2025 — exploited in zero-click targeted attacks |
| CVE-2025-55177 | WhatsApp linked-device sync | Authorization flaw · CVSS 5.4 | 2025 — chained to trigger processing of attacker content |
In the 2025 campaign, reporting tied CVE-2025-55177 (WhatsApp) and CVE-2025-43300 (Apple ImageIO) together in zero-click attacks against fewer than 200 users. The 2026 bug lives in the same neighbourhood — a file-parsing primitive reachable through messaging — which is exactly why Meta's WhatsApp PDF-font hardening is such a telling signal. All three CVE identifiers above are confirmed present in NVD.
Who gets hit
Journalists, dissidents, executives and officials — low-volume, high-value targeting, not mass campaigns.
How it arrives
A message or attachment that renders automatically; the parser does the attacker's work on preview.
Why parsers
Image/font/PDF decoders are enormous, shared, and run before any trust decision — ideal zero-click surface.
Indicators & Hunt Signals
PHASE 09Honesty matters here: no public sample hashes, C2 domains or victim IOCs have been released for the in-the-wild attacks. Mercenary spyware is engineered to leave little on the device. What you can hunt for are the forensic artifacts of the crash and the exposure of unpatched devices.
| Signal | Where | Meaning |
|---|---|---|
| EXC_BAD_ACCESS crash | iOS/macOS crash reports | Fault backtrace inside aa_cache_render / CGGlyphBitmapCreateWithPathAndDilation |
| CoreGraphics in frame | .ips crash logs | Repeated crashes rendering a specific PDF/font = probing or failed exploit |
| Malformed embedded font | Mail/MDM gateway PDF inspection | Unverifiable or extreme-coordinate fonts inside inbound PDFs |
| Device build < fixed | MDM / Intune inventory | iOS < 26.7.1, macOS 26.x < 26.7.1, macOS 15.x < 15.8.1 |
Absence of a crash is not absence of compromise. A successful exploit does not crash — it renders cleanly and continues. Crash telemetry catches failed or untargeted attempts, not a working implant. Treat patch state as the primary control.
Detection & Fleet Queries
PHASE 10For a near-zero-click device bug, "detection" is mostly exposure management: find the unpatched devices in your fleet before an operator does, and surface any crash artifacts your MDM collects. Pair each KQL with its Splunk equivalent.
Font embedding in a PDF is common and mostly benign — do not block on it. Use these hits to prioritize sandbox detonation and to focus deep font-structure validation (extreme coordinate values, malformed glyf tables) rather than as a standalone alert.
MITRE ATT&CK Mapping
PHASE 11| Tactic | Technique | ID | How it applies |
|---|---|---|---|
| Initial Access | Phishing: Spearphishing Attachment | T1566.001 | Crafted PDF delivered as an attachment |
| Initial Access | Drive-by Compromise | T1189 | Web-delivered font/PDF rendered on preview |
| Execution | Exploitation for Client Execution | T1203 | OOB write in CoreGraphics during glyph render |
| Execution | User Execution: Malicious File | T1204.002 | Victim opens/previews the malicious document |
| Defense Evasion | Exploitation (memory corruption, no on-disk payload) | T1211 | Clean render on success leaves minimal artifacts |
| Impact (DoS) | Endpoint Denial of Service | T1499 | Public PoC crashes unpatched devices |
Mitigation & Hardening
PHASE 12Update every Apple device to a fixed build and force it through MDM. There is no configuration workaround for a memory-corruption bug in a system renderer.
- 1iOS / iPadOS → 26.7.1
- 2macOS Tahoe (26.x) → 26.7.1
- 3macOS Sequoia (15.x) → 15.8.1
For the exact population this bug targets — executives, journalists, officials, anyone plausibly of interest to a mercenary operator — enable Lockdown Mode. It strips risky attachment and preview handling and has repeatedly blunted this bug class, making it meaningfully harder to reach the vulnerable parser.
- 1Enforce minimum-OS compliance in MDM; quarantine devices below the fixed builds from sensitive resources.
- 2Detonate inbound PDFs with embedded fonts in a sandbox before delivery to high-risk mailboxes.
- 3Keep WhatsApp and other messaging apps current — Meta's added PDF-font validation only protects updated clients.
- 4Collect iOS/macOS crash reports centrally so rasterizer faults are visible to the SOC, not stuck on the device.
- Fleet inventory shows zero devices below 26.7.1 / 15.8.1.
- Lockdown Mode is enforced for designated high-risk users.
- Crash-report collection is live and the rasterizer hunts return clean.
Sources & References
PHASE 13Hunting CVE-2026-86950 across your Apple fleet?
Run the file hashes and artifacts from any suspected spyware incident through the CyberHawk IOC Scanner, and track live zero-day activity on the Threat Intel feed. Building mobile incident-response playbooks? The CyberHawk SOP library covers zero-day exploitation and endpoint compromise response end to end.
◈ Stay Connected
Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.
"They can't exploit you if you are the Exploit."