Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: aba0fcd53beabdfab961ba8ca5ee11565a9f2ca7
      
https://github.com/WebKit/WebKit/commit/aba0fcd53beabdfab961ba8ca5ee11565a9f2ca7
  Author: Adrian Taylor <[email protected]>
  Date:   2026-09-01 (Tue, 01 Sep 2026)

  Changed paths:
    M Source/WebKit/Platform/IPC/Untrusted.h
    A Source/WebKit/UIProcess/FirstPartyAuthority.h

  Log Message:
  -----------
  [IPC] Add the UI process' origin validation procedures
https://bugs.webkit.org/show_bug.cgi?id=323100

Reviewed by Zak Ridouh.

This is the second in a series of commits which will eventually result in all
code paths provably validating origins sent from WCP to more privileged 
processes.

Adds the procedures by which the UI process recovers a trusted origin from an
IPC::Untrusted<T>. Nothing calls them yet - the burn-down is a later commit - so
there is no behavior change.

There is more than one because the UI process has different notions of 
authority and
they are not interchangeable:

- FirstPartyAuthority answers "is this the registrable domain of the site this
  process is for", which is the question site isolation can answer, and it is 
the
  only question available for a bare SecurityOriginData, RegistrableDomain or 
Site.
  It defers to WebProcessProxy::allowsFirstPartyAccess().

- TopLevelFirstPartyAuthority asks the same question of 
allowsFirstPartyAccess(), but
  without the site-isolation guard described below, for the values where that 
guard
  would be wrong. See below.

- CommittedClientOriginAuthority answers "has this process committed a load for
  this exact (top origin, client origin) pair", deferring to
  WebProcessProxy::hasCommittedClientOrigin(). It is strictly stronger, and it 
is
  only available for ClientOrigin, which is why it cannot be merged with the 
others.

Both functions already existed and are already used by a handful of hand-written
MESSAGE_CHECKs; this commit does not invent a policy, it makes the existing one
reachable through the type.

allowsFirstPartyAccess() is three-way: SilentFailure becomes
ValidationFailure::Ignore because it means the process is serving several sites
at once, which happens legitimately as a new load starts, and terminating there
would kill processes during normal navigation.

FirstPartyAuthority's site-isolation guard is the one piece of new logic, and 
it is
there because the value it is handed may name any origin on the page, including 
a
subframe's. Without site isolation a single process hosts a page and every 
cross-site
subframe it pulls in, while WebProcessProxy records only the main frame's site, 
so for
such a value the comparison has no useful answer and could only produce false 
denials.
FirstPartyAuthority therefore passes everything when siteIsolationEnabled is 
off or the
process is the single web process.

That guard must not silently weaken a check that ships today, so there is a 
third
procedure. TopLevelFirstPartyAuthority asks exactly the same question with no 
guard,
and is correct only for a value that is by construction the process's own 
top-level or
worker origin - where WebProcessProxy's record of the main frame's site is the 
right
thing to compare against with or without site isolation. The two app-badge 
messages,
SetAppBadgeFromWorker and WebFrameProxy::SetAppBadge, are the existing 
unconditional
callers of allowsFirstPartyAccess(), and they use this procedure, so their 
behaviour is
unchanged in every configuration. CommittedClientOriginAuthority needs no guard 
for the
same reason: hasCommittedClientOrigin() answers from what the process has 
actually
committed, which is exact either way, so the Web Locks checks that already call 
it are
unchanged too.

Alternative considered for CommittedClientOriginAuthority: validating only the 
top
origin, as the network process does. Rejected because storage and Web Locks
partition on both halves of a ClientOrigin, so the top origin alone is only 
half of
the key they are keyed on.

If the WebProcessProxy has gone away by the time we do one of these queries, we
assume that the process is already going through destruction rather than being
malicious. Alternative considered: hold a strong reference to the 
WebProcessProxy.
We don't want to do that because we don't want to inadvertently extend lifetimes
via this change.

Also documents, next to the primitive, the EXTRACT_WITH_MESSAGE_CHECK shape that
callers will use. It cannot live in a shared header: the macro has to expand to 
the
receiver's own MESSAGE_CHECK, whose argument order differs between translation
units, so each defines its own. The definitions land with their first users in a
later commit rather than sitting unused here.

* Source/WebKit/Platform/IPC/Untrusted.h:
* Source/WebKit/UIProcess/FirstPartyAuthority.h: Added.
(WebKit::checkFirstPartyAccess):
(WebKit::FirstPartyAuthority::FirstPartyAuthority):
(WebKit::FirstPartyAuthority::checkUntrusted const):
(WebKit::FirstPartyAuthority::checkUntrustedDomain const):
(WebKit::TopLevelFirstPartyAuthority::TopLevelFirstPartyAuthority):
(WebKit::TopLevelFirstPartyAuthority::checkUntrusted const):
(WebKit::CommittedClientOriginAuthority::CommittedClientOriginAuthority):
(WebKit::CommittedClientOriginAuthority::checkUntrusted const):

Canonical link: https://commits.webkit.org/320248@main



To unsubscribe from these emails, change your notification settings at 
https://github.com/WebKit/WebKit/settings/notifications

Reply via email to