Chrome · Installer
CVE-2026-14094
UAF in Installer
Overview
Low
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Changed Functions
| Function | Change | Notes |
|---|---|---|
ifchrome/windows_services/service_program/process_wrl_module.cc |
modified |
Files Changed
chrome/windows_services/service_program/process_wrl_module.cc
Patch
From b30f435685098c782553d4b124b1e3e8a2cd46d7 Mon Sep 17 00:00:00 2001
From: S Ganesh <ganesh@chromium.org>
Date: Thu, 21 May 2026 11:40:19 -0700
Subject: [PATCH] Synchronize ModuleReleaseHelper callback access to prevent races
Access to `ModuleReleaseHelper::callback_` is unsynchronized. In
scenarios where multiple COM RPC threads drive the Microsoft Windows
Runtime Library (WRL) module's object count to zero concurrently (e.g.,
rapid failures in `IClassFactory::CreateInstance`), multiple threads can
execute `ModuleReleaseHelper::OnModuleReleased` simultaneously. Because
`base::OnceCallback::Run()` is not thread-safe, this causes a
Use-After-Free (UAF) or Double-Free of the callback's internal
`BindState`.
This CL adds synchronization using a `base::Lock` in
`ModuleReleaseHelper`. Both `SetModuleReleasedCallback` and
`OnModuleReleased` now access `callback_` under the lock. In
`OnModuleReleased`, the callback is moved to a local variable under the
lock and executed outside of the lock to avoid holding the lock during
callback execution.
Bug: 513264273
Change-Id: I328d87ba6da38ed15eae73e87744c61ca6420e54
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/7858344
Reviewed-by: Greg Thompson <grt@chromium.org>
Commit-Queue: S Ganesh <ganesh@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1634431}
---
diff --git a/chrome/windows_services/service_program/process_wrl_module.cc b/chrome/windows_services/service_program/process_wrl_module.cc
index 207ba58..76e9021 100644
--- a/chrome/windows_services/service_program/process_wrl_module.cc
+++ b/chrome/windows_services/service_program/process_wrl_module.cc
@@ -9,6 +9,8 @@
#include <utility>
#include "base/no_destructor.h"
+#include "base/synchronization/lock.h"
+#include "base/thread_annotations.h"
namespace {
@@ -27,14 +29,20 @@
// Sets the callback to be run when the last reference to the module is
// released.
void SetModuleReleasedCallback(base::OnceClosure callback) {
+ base::AutoLock lock(lock_);
callback_ = std::move(callback);
}
// A method invoked by the WRL::Module's release notifier. Runs the held
// callback, if any.
void OnModuleReleased() {
- if (callback_) {
- std::move(callback_).Run();
+ base::OnceClosure callback;
+ {
+ base::AutoLock lock(lock_);
+ callback = std::move(callback_);
+ }
+ if (callback) {
+ std::move(callback).Run();
}
}
@@ -43,7 +51,8 @@
ModuleReleaseHelper() = default;
- base::OnceClosure callback_;
+ base::Lock lock_;
+ base::OnceClosure callback_ GUARDED_BY(lock_);
};
} // namespace
Loading diff…
Original Bug Report
The reporter's bug is still restricted on the tracker. Chrome de-restricts security bugs ~30–90 days after the fix ships; a later run will backfill it here.
References
On This Page