High firefox Logic Error 🔧 Commit mapped

Overview

High
Severity
—
CVSS
No
Exploited ITW
Fixed
Fix Status
Impacthigh
DescriptionPrivilege escalation in the DOM: Service Workers component
ComponentDOM
Bug ClassLogic Error
Tracker2061777
Fix commit52c4c2c2dbba (firefox) +15/-2
CISA KEVNot listed
CreditedMozilla
Disclosed2026-09-15

Files Changed

  • dom/clients/manager/ClientHandleOpParent.cpp
diff --git a/dom/clients/manager/ClientHandleOpParent.cpp b/dom/clients/manager/ClientHandleOpParent.cpp
index 44fd9cf7881..fad5f033c1e 100644
--- a/dom/clients/manager/ClientHandleOpParent.cpp
+++ b/dom/clients/manager/ClientHandleOpParent.cpp
@@ -30,9 +30,22 @@ IPCResult ClientHandleOpParent::Init(ClientOpConstructorArgs&& aArgs) {
   RefPtr<ClientHandleParent> handle =
       static_cast<ClientHandleParent*>(Manager());
 
+  auto* backgroundActor = handle->Manager()->Manager();
+
+  // ClientControlledArgs and ClientEvictBFCacheArgs are only ever issued by the
+  // parent-process ServiceWorkerManager (via ClientHandle::Control and
+  // ClientHandle::EvictFromBFCache). A content process must never send them:
+  // forging a ClientControlledArgs installs attacker-chosen controller state on
+  // a client living in another process, which ClientManagerService::Navigate
+  // then trusts as its sole authorization.
+  if ((aArgs.type() == ClientOpConstructorArgs::TClientControlledArgs ||
+       aArgs.type() == ClientOpConstructorArgs::TClientEvictBFCacheArgs) &&
+      BackgroundParent::IsOtherProcessActor(backgroundActor)) {
+    return IPC_FAIL(this, "Parent-only ClientOp received from content!");
+  }
+
   if (!IsValidClientOpConstructorArgs(
-          aArgs,
-          BackgroundParent::GetLoadedOrigins(handle->Manager()->Manager()))) {
+          aArgs, BackgroundParent::GetLoadedOrigins(backgroundActor))) {
     return IPC_FAIL(this, "Invalid ClientOpConstructorArgs!");
   }
 
Loading diff…