This Week in WebKit — May 30 - June 05, 2026
Featured
One IPC message from a compromised renderer, and every site the user is logged into becomes readable. No payload validation could ever have caught it — that's the point.
Reachable from ordinary script, no exotic setup required. The dangling key isn't merely read — it gets stored somewhere that outlives the call, and the timing is winnable.
Script controls both halves of the mismatch, and one of the overlaid slots is a pointer field. The surprise is which of the two lookups went stale.
A compromised WebContent names any victim as its first party and the SameSite cookies follow. The check couldn't be added unconditionally — that's the interesting part.
Growing a funcref table from JS is enough to make table.get() hand back a reclaimed cell. The half of the slot that went missing is the half the GC consults.
Security fixes
- Signed integer overflow (UB) in back/forward list index handling
- Masonry fieldset legend passes isSubgrid() despite being excluded from parent grid
Notable development
- App badge IPC sender-origin validation
- [Wasm] OMG tail call patchpoint needs to clobber late pinned registers
Other security-relevant changes
- [WebCore MessagePort] (lifetime fix)
67117c4— Networking process 연결이 끊어질 때 MessagePort를 invalidate하도록 수정되었습니다. 정상적인 process 재시작 과정에서 stale port identifier가 spoofing 탐지를 잘못 유발하는 문제를 막기 위한 조치입니다. - [WebKit NetworkProcess] (Authorization bypass)
da44cdb— entanglement check가 누락되어 있던 문제가 수정되었습니다. 이 결함으로 인해 손상된 WebContent process가 자신이 소유하지 않은 port로부터 대기 중인 MessagePort 메시지를 탈취할 수 있었습니다. 이제는 메시지를 반환하기 전에 process 소유권을 검증합니다. - [WebKit UIProcess / App Badge] (origin spoofing)
675c62d— app badge IPC 메시지에 origin validation이 추가되었습니다. 이를 통해 손상된 web process가 자신이 제어하지 않는 도메인의 app badge를 spoofing하는 것을 방지합니다. MESSAGE_CHECK와 allowsFirstPartyAccess()를 통해 window와 worker context를 모두 검사합니다. - [WebCore IndexedDB] (UAF)
917854a— IndexedDB HashMap에서 -0.0과 +0.0에 대한 hash/equality 불일치로 인해 잘못된 entry가 삭제되고, stale cursor를 통해 UAF로 이어질 수 있는 문제였습니다. 이와 함께 abort 시 cursor invalidation 문제와 version change transaction의 IPC validation 문제도 함께 수정되었습니다. - [WebCore IndexedDB] (comparator inconsistency)
d919344— null String과 Invalid key에 대해 operator<=>가 operator==와 일치하도록 수정되었습니다. MemoryIDBBackingStore에서 HashMap은 operator==를, std::set은 operator<=>를 사용하는 데서 발생하는 불일치를 방지합니다. - [WebCore Range] (UAF)
1e11f2a— Range::createContextualFragment에서 use-after-free가 수정되었습니다. trusted types callback이 실행 도중 range endpoint를 clear할 수 있어, stale Node reference가 남는 문제였습니다. - [JSC Baseline JIT] (write-barrier)
1cdc540—o = delete o.x처럼 delete 연산이 source object를 덮어쓰는 경우, Baseline JIT의 write barrier가 잘못된 값에 대해 발생해 GC write-barrier tracking이 깨지는 문제였습니다. - [JSC / WaiterListManager] (race condition)
21ab50e— WaiterListManager::unregister에서 target()->realm()이 동시에 해제 중인 m_dependencies를 읽는 data race가 수정되었습니다. Waiter 생성 시점에 JSGlobalObject를 캐싱해 이 racy read를 회피합니다. - [WebCore IntersectionObserver] (UAF)
2757278— IntersectionObserver::updateObservations에서 use-after-free가 수정되었습니다. m_targetsWaitingForFirstObservation에서 Element를 제거하는 과정이 해당 Element의 destructor를 호출했고, 이 destructor가 unobserve를 호출하면서 iteration 중인 m_observationTargets를 변경하는 문제였습니다. - [JSC Yarr/assembler] (integer overflow)
7663d81— 특수하게 조작된 RegExp 패턴이 4GB가 넘는 JIT 코드를 생성해 AssemblerBuffer overflow를 유발하는 문제가 방지되었습니다. 안전한 crash 경로를 갖춘 overflow guard가 추가되었고, capture와 frame size에 대한 limit도 함께 도입되어 컴파일 이전 단계에서 과도한 패턴을 거부합니다. - [WebCore FrameLoader] (SameSite bypass)
093f346— cross-site navigation에서 SameSite=Strict 쿠키가 전송되는 문제가 방지되었습니다. FrameLoader::load가 initiator document를 누락해 isSameSite=true를 무조건 설정했고, 그 결과 updateRequestAndAddExtraFields에서의 재계산이 이루어지지 못했던 것이 원인이었습니다. - [WebKit UIProcess / WebPageProxy] (UAF)
1682be9— completion callback 안의 WeakPtr 객체가 대상 객체의 생존을 보장하지 못해 발생하던 use-after-free가 수정되었습니다. callback이 실행되기 전에 WebPageProxy나 WebProcessProxy가 먼저 파괴되면 이미 해제된 메모리에 접근하게 되는 구조였습니다. navigation 및 sandbox 처리 경로에서 WeakPtr을 RefPtr로 승격해 해결했습니다. - [WebKit PCM adattributiond] (sandbox relaxation)
f8277ab— adattributiond에서 PCM request proxying을 위한 secondary identifier 지원이 추가되었습니다. 이와 함께 새로운 entitlement가 도입되었고, process-uuid cache 접근을 위해 iOS sandbox가 일부 완화되었습니다. - [WebKit Safe Browsing] (timing check bypass)
4b574bf— safe browsing check 응답이 완료되기 전에 다운로드가 먼저 진행될 수 있는 timing gap이 수정되었습니다. 이 gap으로 인해 timeout 시 악성 다운로드가 검사를 우회할 수 있었습니다. - [WebCore scroll] (reentrancy)
bf80e3e— render tree layout 도중 viewportContentsChanged()가 실행되는 문제가 방지되었습니다. 이 상태에서는 containing block의 layout이 끝나기 전에 renderer geometry를 조회할 수 있어 assertion failure로 이어졌습니다. - [WebCore view transitions] (sandbox bypass)
cc6b337— CSP-sandboxed document가 이전 페이지로부터 cross-document view transition state(요소 이름, geometry, 렌더링된 content)를 전달받는 data leak이 수정되었습니다. same-origin check가 CSP 헤더 적용보다 먼저 수행되던 것이 원인이었습니다. fix는 document의 최종 opaque origin이 확정된 이후에 same-origin 검증을 다시 수행합니다. - [JSC IPInt] (stack check)
9161e71— WebAssembly IPInt의 m_maxFrameSizeInV128 계산에 대한 regression test입니다. 다양한 local count에 대해 stack frame size가 v128 단위로 올바르게 계산되는지 검증합니다. - [WebKit UIProcess (Permissions)] (hardening)
e118db0— WebPermissionControllerProxy가 강화되었습니다. permission query가 SharedWorker나 ServiceWorker 범위 밖에서 identifier 없이 들어오는 경우, UIProcess를 crash시키는 대신 악성 WebProcess를 종료시키도록 변경되었습니다. - [WebKit Entitlements]
3f1ad2f— WebContent Catalyst variant에서 sandbox entitlement를 초기화하는 호출이 누락되어 있던 문제가 수정되었습니다. 이 누락으로 인해 process가 sandbox state flag를 설정하려 할 때 crash가 발생했습니다.