docs/connection_allowlist_design.md
References:
Connection Allowlist restricts network connections in Chromium using a URLPattern allowlist returned by the server. The high-level flow is:
network_restrictions_id is assigned to that context, which is used to
identify requests that originate from itThis document outlines the architectural design and the checks performed across different Chromium layers (network service, browser, renderer).
All security and resource restrictions (CSP, Connection Allowlists, etc.) are applied restrictively and additively. A request must satisfy all applicable security policies to proceed; if any policy blocks the request, the request is blocked.
The network service is the primary layer where network requests are handled and dispatched. The majority of Connection Allowlist enforcement occurs here.
network_restrictions_id).network_restrictions_id) is
highly extensible. Other future security features or JS-based network
restriction APIs (similar to the dynamic
window.fence.disableUntrustedNetwork() design previously used for Fenced
Frames, see
CL 7709872)
can leverage this same plumbing to dynamically register and enforce rules
in the Network Service.network_restrictions_id)To map network requests back to the corresponding context (document or worker) and
its connection allowlists, each context is associated with a unique token, the
network_restrictions_id (a base::UnguessableToken).
network_restrictions_id is created on
the NavigationRequest in NetworkRestrictionsNavigationThrottle.base::RefCountedData<base::UnguessableToken>) and stored in the document's
DocumentAssociatedData (or worker hosts like DedicatedWorkerHost and
SharedWorkerHost).network_restrictions_id (e.g., initial empty documents
inheriting their creator's ID).StoragePartitionImpl::RestrictNetworkForIdsInNetworkContext.NetworkContext in the
Network Service using RestrictNetworkForIds().WillProcessResponse / WillCommitWithoutUrlLoader) until the Network
Service confirms the restrictions have been registered, ensuring restrictions
are applied before resource loading begins.StoragePartitionImpl stores a copy of the restrictions in
network_restrictions_ids_. In case of a Network Service crash, this map
is used to restore the network restrictions on the new NetworkContext.DocumentAssociatedData or worker is destroyed, if it
holds the last reference to the ref-counted network_restrictions_id, it
schedules a cleanup of the restriction mapping from the Network Service and
StoragePartitionImpl using
StoragePartitionImpl::ClearNetworkRestrictionsAfterDelay.The browser process coordinates navigation checks and handles security policies.
PolicyContainerHost
associated with each document.NavigationRequest::IsAllowedByConnectionAllowlist function. This function
enforces allowlist policies during key phases of navigation (such as
initial request start and handling redirects).Blink is the rendering engine running in the renderer process.
fetch() when they will be intercepted by a
Service Worker. This is done in blink because the renderer directly talks
to the Service Worker URLLoaderFactory in these cases, not giving the
document's URLLoaderFactory checks to run, unless the SW decides to
fallback on the original fetch.Service Workers act as network proxies in the renderer process, intercepting requests before they reach the network.
GetLoaderFactoryForMainScriptFetch passing the
creator_network_restrictions_id_.ServiceWorkerRegisterJob::UpdateAndContinue), the loader factory is
created via GetLoaderFactoryForUpdateCheck passing the
creator_network_restrictions_id_.ServiceWorkerGlobalScope) itself (via fetch()) are governed by the policies
stored in its own PolicyContainerHost. Those are mapped to the Service
Worker's own network_restrictions_id in the Network Service via the
NetworkRestrictionsWorkerThrottle. This throttle also does the same for
dedicated and shared worker contexts.event.respondWith(fetch(request))) are initiated using the
Service Worker's URLLoaderFactory and subjected to the Service Worker's
Connection Allowlists (associated with the Service Worker's own
network_restrictions_id), regardless of the client document's policies.
Consequently, redirects of these fetches are checked against the Service
Worker's connection allowlist's redirect flag, not the document's.URLLoaderFactory (which is associated with the Service Worker's
network_restrictions_id), thereby enforcing the Service Worker's policies.