This Week in WebKit — May 23 - May 29, 2026
Featured
Script picks both the freed type and the type that reclaims it. The keepalive that would have prevented this is a convention, not a rule — and one lowering forgot.
One object in that proof never got validated: the one it was rooted at. Absence is how the compiler proves no user code can run at a point — so what runs there now?
Detach a resizable buffer behind a hot polymorphic byteLength and compiled JS keeps running on a raised stack pointer. The registers it refills come from somewhere worse than garbage.
A generator and nine million spaces put reads and fixed-value writes into a just-freed buffer — during plain compilation, no JIT warm-up. The comment warning about this was already there.
The site restrictions guarding which origins you can open never followed the identifiers that came after. Reachable from a compromised renderer — and one assertion already knew.
A compromised renderer can post script messages under a page it doesn't host. The one-line check was easy; deciding what "owns" means took the rest of the patch.
Other security-relevant changes
- [JSC FTL] (state restoration fix)
1b42291— FTL의 stack overflow check가 prologue로 이동되었습니다. 이를 통해 patchpoint variant에서 stack pointer 복원 문제가 수정되었고, overflow guard가 frame 할당 이전에 stack을 확인하도록 보장됩니다. - [WebKit NetworkProcess] (hardening)
fb75cae— setRawCookie IPC handler에 MESSAGE_CHECK validation이 추가되어, cookie.domain과 URL이 firstParty와 일치하는지 확인합니다. 아울러 cookie 생성 과정의 exception 처리 범위도 확장되어 crash를 방지합니다. - [WebCore date/time input] (UAF)
869d5c5— date input에서 use-after-free가 발견되었습니다. input event handler 안에서 element type을 변경하면 dispatch 도중 BaseDateAndTimeInputType 객체가 파괴되는데, 이후에도 해당 객체가 계속 사용되고 있었습니다. Critical section 전체에 걸쳐 ref-counted reference를 유지하도록 수정되었습니다. - [JSC TypedArray] (TOCTOU)
c852586— GSAB 기반 array에서 TypedArray.sort()를 실행할 때 TOCTOU race가 존재했습니다. length와 span을 각각 따로 읽다 보니 병렬 grow 과정에서 두 값이 서로 어긋날 수 있었는데, 이제는 두 값 모두 동일한 span 객체에서 파생되도록 수정되었습니다. - [JSC DFG] (type confusion)
1f4e4ca— CSE가 서로 다른 array mode를 가진 String.prototype.at 연산을 잘못 병합하던 문제가 수정되었습니다. 그 결과 string 반환 케이스와 undefined 반환 케이스가 뒤섞이는 상황이 발생하고 있었습니다. - [JSC DFG allocation sinking] (IR correctness)
cdfa73f— object allocation sinking 과정에서 불필요하게 삽입되던 Check가 제거되었습니다. 이 Check는 DFG graph의 exit-state 일관성을 깨뜨리고 있었습니다. - [WebCore SlotAssignment] (UAF)
20beac1— slot assignment resolution 과정에서 stale iterator로 인한 use-after-free가 발견되었습니다. 컨테이너가 순회하는 도중 hasAssignedNodes()가 m_slots를 변경하는 구조였으며, shadow DOM slot 조작을 통해 이 문제를 유발할 수 있었습니다. hasAssignedNodes() 호출을 assignedNodes.isEmpty() 직접 확인으로 대체하여 수정되었습니다. - [WebKit ModelProcess] (hardening)
69ff7c4— createModelPlayer의 중복 식별자 검증에서 ASSERT가 MESSAGE_CHECK로 대체되었습니다. 또한 deleteModelPlayer와 unloadModelPlayer에도 식별자 존재 여부를 확인하는 MESSAGE_CHECK가 추가되어, release build에서도 유효하지 않은 IPC 메시지를 거부하게 됩니다. - [JSC Wasm] (UAF)
76b3468— JSWebAssemblyInstance의 destruction이 시작되는 시점에 Wasm::InstanceAnchor를 unregister하도록 수정되어, cross-thread use-after-free가 방지됩니다. 기존에는 instance의 멤버가 파괴되는 도중에도 anchor가 background compiler thread에 부분적으로 해제된 instance를 노출할 수 있었습니다. - [JSC DFG] (off-by-one)
4e802a1— checkpoint OSR exit 과정에서 reify된 baseline frame의 BytecodeIndex가 수정되었습니다. 기존에는 index가 미리 앞서 나가 있어, 재개된 bytecode에서 발생한 exception이 잘못된 exception handler로 라우팅되는 문제가 있었습니다. - [WebCore XMLHttpRequest] (race condition, UAF)
a814080— XMLHttpRequest::visitAdditionalChildren()에서 race condition이 수정되었습니다. GC thread가 m_responseDocument를 dereference하는 동안 main thread가 이를 null로 만들 수 있는 상황이었으며, 모든 접근을 m_gcLock으로 보호하도록 변경되었습니다. - [WebCore Streams] (UAF)
ad57b51— ReadableStreamDefaultReader에서 use-after-free가 발견되었습니다. main thread가 m_stream을 null로 만든 뒤에도 GC-thread 코드가 이를 dereference할 수 있었으며, locking을 통해 해결되었습니다. - [JSC string prototype] (hardening)
18a2c9a— replaceAll에서 string resolution 이후의 exception check가 추가되었습니다. 이 check가 없으면 확인되지 않은 OOM 상황에서도 totalLength와 replacementsAre8Bit가 아직 resolve되지 않은 string으로부터 계산될 수 있었습니다. - [ANGLE Metal] (OOB)
0fe9ff8— vertex attribute offset이 buffer size를 초과할 때 ANGLE Metal의 syncDirtyAttrib에서 발생하던 crash가 수정되었습니다. GetVertexCount check를 conversion branch 앞으로 끌어올려 두 경로 모두를 보호합니다. 아울러 CheckedNumeric으로 재작성되면서 negative offset과 zero stride에 대한 방어도 함께 강화되었습니다. - [JSC TypedArray] (stale pointer)
a271abe— TypedArray.prototype.forEach가 backing vector를 캐싱하는 대신 다시 로드하도록 수정되었습니다. ArrayBuffer materialization이나 Wasm memory reallocation으로 vector가 이동할 수 있는 상황에서, stale vector pointer를 읽는 문제를 방지합니다. - [WebKit NetworkProcess] (hardening)
479f2b4— IPC identifier validation에서 RELEASE_ASSERT가 MESSAGE_CHECK로 대체되었습니다. 그 결과 compromise된 WebContent process가 privileged network process를 crash시키는 상황이 방지되며, 이제는 attacker가 제어하는 process만 종료됩니다. - [JSC LiteralParser] (shape confusion)
09c07d2— LiteralParser가 symbol property transition을 string key에 잘못 적용하던 문제가 수정되어, parse된 객체에서 shape confusion이 발생하는 상황이 방지됩니다. - [JSC B3 optimizer] (JIT miscompilation)
81aa535— B3 optimizer의 dominance check가 깨져 있던 문제가 수정되었습니다. 기존에는 모든 use를 dominate하지 않는 add 연산도 addressing mode로 이동할 수 있었으며, 이로 인해 typed-array Atomics 패턴에서 JIT 코드가 잘못된 memory address를 계산하는 문제가 발생하고 있었습니다. - [WebKit UIProcess / WebBackForwardList] (sandbox bypass)
715bc66— backForwardUpdateItem과 backForwardSetChildItem 메서드에 file:// URL에 대한 MESSAGE_CHECK validation이 추가되었습니다. 이를 통해 compromise된 WebProcess가 검증되지 않은 file URL을 back-forward list에 주입하는 상황이 방지됩니다. - [WebCore CSS] (UAF)
5f0480f— FontFaceSet.load에서 use-after-free가 발견되었습니다. thenable check를 통한 JS reentrancy로 인해, loader가 여전히 참조하고 있는 @font-face rule이 제거될 수 있는 상황이었습니다. reference_wrapper 대신 Ref를 사용하도록 수정되었습니다. - [WebKit UIProcess] (origin validation)
23b15df— IPC validation이 누락되어 있어, compromise된 WebContent process가 임의의 URL을 전송하여 address bar를 spoofing할 수 있었습니다. 수정된 코드는 protocol/host/port가 현재 frame의 URL과 일치하는지 요구합니다. - [JSC JSLock] (race condition)
aed1fdd— JSLock::m_hasOwnerThread에 acquire-release memory ordering이 추가되었습니다. 기존에는 m_ownerThread가 아직 stale한 상태에서도 다른 thread가 이 flag를 true로 관찰할 수 있는 race가 존재했으며, 이는 여러 thread에서 동기화되지 않은 JS heap 접근으로 이어질 가능성이 있었습니다. - [WebCore PlatformScreen] (race condition)
08911bd— 독립적으로 존재하던 PlatformScreen property accessor들이 CoW singleton으로 대체되었습니다. 그 결과 off-thread에서의 동시 HashMap 접근이 방지되는데, 이 접근은 MTE hardware check에서 memory safety violation으로 포착되고 있었습니다. - [WebCore scrolling / Mac] (UAF)
a926a67— scrolling thread에서 실행되는 NSAnimation display-link callback이, main thread에서 이미 파괴된 ScrollerMac 객체에 접근할 수 있는 cross-thread use-after-free crash가 수정되었습니다. Thread-safe ref-counting을 적용하고 main-thread destruction을 강제하여 race를 제거했습니다. - [WebRTC H.264 NALU] (Integer underflow)
86f9503— H.264 AVC sequence parameter set NALU size가 NALU prefix를 초과하는지 확인하는 validation이 추가되었습니다. 이를 통해 WebCodecs로 attacker가 제어하는 video를 처리할 때 발생할 수 있는 integer underflow가 방지됩니다. - [WebCore Streams] (race condition)
597af50— GC thread가 m_stream을 dereference하는 동작이 main-thread의 null 대입과 race하면서 use-after-free로 이어질 수 있었습니다. Locking을 통해 수정되었습니다. - [WebKit SpeechRecognitionServer] (hardening)
5db4d93— SpeechRecognitionServer의 중복 client 검증에서 ASSERT가 MESSAGE_CHECK로 대체되었습니다. ASSERT는 release build에서 no-op이기 때문에 invariant enforcement 없이 중복 start 메시지가 허용되고 있었는데, 이제 MESSAGE_CHECK가 해당 connection을 종료시킵니다. - [bmalloc libpas] (OOB hardening)
ed57dc0— compact_heap_reservation_bump에서 PAS_ASSERT가 bounds check로 대체되어, 이 값이 guard_size와 heap_size 사이에 위치하는지 확인하도록 수정되었습니다. compact heap metadata가 손상된 경우 enumeration 중 발생할 수 있는 out-of-bounds memory access를 방지합니다. - [JSC WebAssembly] (exception handling)
d8b6307— WebAssembly compile option에서 imported string constant를 rope-to-string 변환할 때, OOM 이후의 exception check가 누락되어 있었습니다. WebAssembly.Module에 attacker가 제어하는 거대한 string을 넣으면 적절한 exception handling 없이 OOM을 유발할 수 있었고, 이 경우 잘못된 상태로 실행이 계속될 수 있었습니다. - [JSC ClonedArguments] (Uninitialized memory)
5099a4a— ClonedArguments::copyToArguments에서 offset이 0이 아닌 경우의 loop bound가 수정되었습니다. 기존에는 destination array 뒤쪽 slot들이 기록되지 않은 채 stale data로 남아 있었습니다. 다만 offset > 0인 상황에 도달 가능한 code path는 현재까지 알려진 바 없어, 현재 위험도는 제한적입니다.