A nested callout frees the object, then it is used
A method dispatches into a delegate, observer, callback, or other thread that can synchronously destroy the object (or a cached target), and then keeps using it — a use-after-free reached from ordinary UI, event, or teardown flow.
this (or a cached pointer) must be followed by a liveness check before any further member access — capture a WeakPtr and return early if it was invalidated.Mechanism
Chromium UI, event, and service code routinely calls out of an object
mid-method: a WaylandWindow/X11Window notifies its PlatformWindowDelegate,
an event source dispatches to a focused window, a disk-cache operation runs a
completion callback, a queue wakes a waiter. Any of those callouts can run
arbitrary consumer logic — most dangerously closing the widget or
destroying the object — synchronously, before the calling method returns.
The method then continues to touch its own members (or a raw pointer it cached before a loop), now pointing at freed memory. The trigger is ordinary, web-reachable input: a popup closing on click, a drag ending, a state/configure update, a tab teardown. Because the free happens inside a normal call, the stack looks innocent and the bug survives review.
A second, related shape is teardown/observer ordering: an object outlives the owner of its backing resource, or an observer outlives the subject it is registered with, so a later access or unregistration dereferences an already-freed peer.
Fix shape
Capture a weak reference immediately before the re-entrant callout and bail out the moment it is invalidated:
auto weak_this = AsWeakPtr(); // or weak_factory_.GetWeakPtr()
delegate()->OnStateUpdate(...); // may synchronously delete `this`
if (!weak_this) return; // do not touch members after this point
When iterating a container of objects that a callout can destroy, materialize
WeakPtrs (e.g. GetAllWindowsAsWeakPtr()) and re-check each entry inside
the loop. For the ordering variant, move the resource into the object whose
lifetime bounds it, or have the subject notify observers on destruction so they
reset their observation.
CVEs in this pattern
49 components · Ozone, Views, Aura, Bluetooth, Extensions, Platform, Network, Dawn, Printing, Core, Passwords, Payments, V8, Web Authentication, Input, DigitalCredentials, ServiceWorker, Actor, Chromoting, Updater, Proxy, Receiver, Device, Sharing, Cast, WebPackaging, WebAppInstalls, Auth, Internals, DOM, PDF, GPU, AdFilter, Fullscreen, Metrics, HID, PDFium, WindowDialog, Safebrowsing, Chromecast, Compositing, Chromium, Digital Credentials, Autofill, Browser, CSS, Serviceworker, Profiles, Lens| CVE | What | Component | Vendor | Severity | Month | |
|---|---|---|---|---|---|---|
| CVE-2026-93374 | UAF in Daw | Dawn | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-95315 | UAF in Aura | Aura | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95319 | UAF in Printing | Printing | chrome | Low | 2026-09 | 🔧 |
| CVE-2026-95348 | UAF in Bluetooth | Bluetooth | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95347 | UAF in Updater | Updater | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-84324 | UAF in Proxy | Proxy | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87480 | UAF in Printing | Printing | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87514 | UAF in Views | Views | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87524 | UAF in Core | Core | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87526 | UAF in Passwords | Passwords | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-87558 | UAF in Payments | Payments | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87578 | UAF in Receiver | Receiver | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87581 | UAF in Payments | Payments | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87607 | UAF in Device | Device | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87609 | UAF in Sharing | Sharing | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-87625 | UAF in V8 | V8 | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-87628 | UAF in Cast | Cast | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-87633 | UAF in Views | Views | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87637 | UAF in Extensions | Extensions | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-87639 | UAF in WebPackaging | WebPackaging | chrome | High | 2026-09 | 🔧 |
| CVE-2026-87646 | UAF in Web Authenticatio | Web Authentication | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91710 | UAF in WebAppInstalls | WebAppInstalls | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91716 | UAF in Auth | Auth | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91718 | UAF in Core | Core | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91721 | UAF in Internals | Internals | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-91722 | UAF in Input | Input | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-91724 | UAF in Input | Input | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91729 | UAF in DigitalCredentials | DigitalCredentials | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91736 | UAF in DOM | DOM | chrome | High | 2026-09 | 🔧 |
| CVE-2026-91737 | UAF in PDF | chrome | High | 2026-09 | 🔧 | |
| CVE-2026-93373 | UAF in Extensions | Extensions | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95277 | UAF in Views | Views | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95282 | UAF in Platform | Platform | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95299 | UAF in GPU | GPU | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95310 | UAF in AdFilter | AdFilter | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-95313 | UAF in Fullscree | Fullscreen | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-95333 | UAF in Metrics | Metrics | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-95335 | UAF in HID | HID | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95338 | UAF in PDFium | PDFium | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95339 | UAF in ServiceWorker | ServiceWorker | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-95345 | UAF in Actor | Actor | chrome | Medium | 2026-09 | 🔧 |
| CVE-2026-95351 | UAF in Views | Views | chrome | High | 2026-09 | 🔧 |
| CVE-2026-95356 | UAF in WindowDialog | WindowDialog | chrome | Critical | 2026-09 | 🔧 |
| CVE-2026-87460 | UAF in Platform | Platform | chrome | High | 2026-09 | 🔧 |
| CVE-2026-19149 | UAF in Aura | Aura | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79052 | UAF in Aura | Aura | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79200 | UAF in Aura | Aura | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79232 | UAF in Aura | Aura | chrome | High | 2026-08 | 🔧 |
| CVE-2026-79290 | UAF in Aura | Aura | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-19172 | UAF in Views | Views | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-76017 | UAF in Chromoting | Chromoting | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79012 | UAF in Safebrowsing | Safebrowsing | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79150 | UAF in Views | Views | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-79224 | UAF in Chromecast | Chromecast | chrome | Critical | 2026-08 | 🔧 |
| CVE-2026-78951 | UAF in ServiceWorker | ServiceWorker | chrome | Medium | 2026-08 | 🔧 |
| CVE-2026-79198 | UAF in Platform | Platform | chrome | High | 2026-08 | 🔧 |
| CVE-2026-17656 | UAF in Ozone | Ozone | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-15904 | UAF in Ozone | Ozone | chrome | High | 2026-07 | 🔧 |
| CVE-2026-15765 | UAF in Ozone | Ozone | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-15112 | UAF in Ozone | Ozone | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-15764 | UAF in Ozone | Ozone | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-15901 | UAF in Network | Network | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-15129 | UAF in Views | Views | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-17650 | UAF in Compositing | Compositing | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-17652 | UAF in Views | Views | chrome | Critical | 2026-07 | 🔧 |
| CVE-2026-13786 | UAF in Ozone | Ozone | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-11628 | UAF in Ozone | Ozone | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-11629 | UAF in Ozone | Ozone | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-10972 | UAF in Ozone | Ozone | chrome | High | 2026-06 | 🔧 |
| CVE-2026-11631 | UAF in Aura | Aura | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13785 | UAF in Bluetooth | Bluetooth | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-11633 | UAF in Bluetooth | Bluetooth | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-11635 | UAF in Bluetooth | Bluetooth | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-10882 | UAF in Network | Network | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-10905 | UAF in Network | Network | chrome | High | 2026-06 | 🔧 |
| CVE-2026-10954 | UAF in Actor | Actor | chrome | High | 2026-06 | 🔧 |
| CVE-2026-12008 | UAF in Chromium | Chromium | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-12439 | UAF in Digital Credentials | Digital Credentials | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-12440 | UAF in DigitalCredentials | DigitalCredentials | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-12442 | UAF in Passwords | Passwords | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-12443 | UAF in Web Authenticatio | Web Authentication | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13038 | UAF in Autofill | Autofill | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13774 | UAF in Extensions | Extensions | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13779 | UAF in Chromoting | Chromoting | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13782 | UAF in Browser | Browser | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13783 | UAF in Views | Views | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-13784 | UAF in Views | Views | chrome | Critical | 2026-06 | 🔧 |
| CVE-2026-8514 | UAF in Aura | Aura | chrome | Critical | 2026-05 | 🔧 |
| CVE-2026-6310 | UAF in Daw | Dawn | chrome | High | 2026-04 | 🔧 |
| CVE-2026-2321 | UAF in Ozone | Ozone | chrome | Medium | 2026-02 | 🔧 |
| CVE-2026-2441 | UAF in CSS | CSS | chrome | High | 2026-02 | ⚠️ 🔧 |
| CVE-2025-12438 | UAF in Ozone | Ozone | chrome | Medium | 2025-10 | 🔧 |
| CVE-2025-10200 | UAF in Serviceworker | Serviceworker | chrome | Critical | 2025-09 | 🔧 |
| CVE-2025-11219 | UAF in V8 | V8 | chrome | Low | 2025-09 | 🔧 |
| CVE-2025-1916 | UAF in Profiles | Profiles | chrome | Medium | 2025-03 | 🔧 |
| CVE-2025-2476 | UAF in Lens | Lens | chrome | Critical | 2025-03 | 🔧 |
Hunt for siblings
All three are heuristics that need human triage: they surface re-entrant callouts and flag the ones with no WeakPtr liveness check in the same function. Start from the callout, then read up/down for a captured weak_this.
# Candidate re-entrant callouts in UI/window code, minus the ones already guarded.
# Then, for each hit's enclosing function, confirm there is NO AsWeakPtr()/
# GetWeakPtr()/weak_this liveness check after the call.
rg -n --pcre2 \
'(delegate\(\)->On|->OnStateUpdate\(|RequestStateFromServer\(|DispatchEvent\(|->Run\()' \
ui/ozone ui/platform_window components/ \
| rg -v 'weak'
# Structural: a call on $obj followed by a later deref of $obj in the same
# block, with no weak_this/AsWeakPtr captured in that block.
weggli --cpp '{
not: weak_this;
not: AsWeakPtr();
$obj->$callout($a);
$obj->$member;
}'
rules:
- id: reentrant-callout-frees-this-no-weakptr
languages: [cpp]
severity: WARNING
message: >
Method dispatches to a delegate/observer/callback that may synchronously
destroy `this`, then accesses members without an AsWeakPtr()/GetWeakPtr()
liveness check (WP-ASYNC-LIFETIME-UAF; e.g. CVE-2026-15112).
patterns:
- pattern-either:
- pattern: $D->On$EV(...);
- pattern: delegate()->$CB(...);
- pattern-not-inside: |
{ ... $W = AsWeakPtr(); ... }
- pattern-not-inside: |
{ ... $W = ...GetWeakPtr(); ... }
Mitigations that would catch this class
- MiraclePtr / BackupRefPtr (raw_ptr) — turns these into safe crashes; several were found by the rewrite
- WeakPtr liveness checks after every re-entrant callout (the canonical fix)
- Prefer posting a task over synchronous delegate callouts where feasible