This Week in WebKit — August 30 - September 5, 2026
Featured
The branch the optimizer proved dead runs anyway, with no exit left to catch it. What comes back to script is a 64-bit pattern of your choosing, typed as a cell.
From a compromised renderer, the GPU process can be told to read any address into a texture — and textures are readable. The check that made that safe lived in code WebKit doesn't own.
A safety check that isn't the last word isn't a safety check. The payoff, in inlined closure and varargs frames, is a GC stack walk reading slots other code already reused.
A freed proxy stays in the source's frame-observer map, and the capture thread dispatches through it. Reaching it needs raw capture IPC and a second proxy keeping the source alive.
AVIF, WebP and JPEG XL got the same thing wrong independently, and one <img> on GTK or WPE is the whole trigger. The shared assumption is the interesting part.
Cross-origin content in a WKWebView could read an app's custom-scheme resources through an ordinary no-cors request. The opt-in was real; the enforcement wasn't where it needed to be.
Security fixes
- Invalid RegExp memoized and folded into NewRegExp
- Committed CommandBuffer destruction thread decided by release ordering
Notable development
-
Mixed-content carve-out for local and loopback address spaces
feature WebCore Mixed Content
-
DateInstance packs its broken-down time inline
optimization JSC Date runtime
-
Generator-enforced `IPC::Untrusted<T>` for origin-bearing UIProcess messages
hardening WebKit IPC
-
Three origin-validation procedures for untrusted IPC values
hardening WebKit IPC
-
`IPC::Untrusted<T>` wrapper for renderer-supplied values
hardening WebKit IPC
-
[JSC][Wasm] Inline table.get for funcref
optimization JSC WebAssembly JIT
-
Fire webRequest events for declarativeNetRequest-blocked loads
feature WebKit Web Extensions
-
[non-cocoa][fuzz] OOB read in APNG with hidden default image
bug WebCore image decoders
Other security-relevant changes
- [WebGPU CommandBuffer] (race condition, UAF)
95c3cfc— teardown 과정에서 CommandBuffer의 destructor가 work queue가 아니라 Metal completion thread에서 실행되었습니다. 그 결과 CommandEncoder의 refcount가 깨지고 Device::m_commandEncoderMap 접근에 race가 발생합니다. WebContent의 WebGPU API에서 도달 가능한 GPU process UAF로 이어집니다. - [WebCore AcceleratedEffect shapes] (UAF, race condition)
7224709— AcceleratedEffect의 path caching 경로에서 발생하던 cross-thread use-after-free를 수정했습니다. static TinyLRUCache 접근을 lock으로 동기화하고, Path를 reference가 아닌 값으로 반환하도록 변경했습니다. CSS offset-path animation이 main thread와 scrolling thread에서 경합할 때 발생하던 double-free를 차단합니다. - [JSC B3 ccmp matcher] (miscompilation)
65ef7f3— ccmp-chain 패턴 매칭이 실패한 뒤 남은 stale matcher state 때문에 중첩된 비교 표현식이 잘못 컴파일되었습니다. 실패 시 부분 상태를 정리하도록 RAII 기반 rollback이 도입되었습니다. - [WebGPU] (UAF)
d4a150e— WebGPU의 writeTexture/writeBuffer에서 GPU가 데이터를 다 처리하기 전에 buffer가 해제될 수 있는 race window를 수정했습니다. 이때 use-after-free read가 발생합니다. 수정 후에는 completion callback을 통해 GPU 작업이 끝날 때까지 buffer storage를 유지합니다. - [JSC CodeBlock] (watchpoint invalidation)
e6507c8— generator/async 함수에서 캡처된 변수의 watchpoint를 미리 무효화하도록 변경되었습니다. suspension 도중 CodeBlock이 다시 생성될 때 안전하지 않은 constant folding이 일어나는 상황을 막습니다. - [WebKit GPU media decoder] (TOCTOU)
8db7ec0— GPU process image decoder의 TOCTOU race를 수정했습니다. 기존에는 unsafeBuffer()로 인해 decode가 진행되는 동안 WebContent process가 shared memory를 변경할 수 있었습니다. 이제 SharedBuffer::create()로 데이터를 복사한 뒤 사용합니다. - [ANGLE VertexArray] (OOB read)
e521d4c— vertex attribute format이 바뀌어도 element limit cache가 갱신되지 않던 문제를 수정했습니다. validation이 걸러야 할 out-of-bounds buffer 접근이 그대로 통과되던 상황입니다. - [WebCore IOSurfacePool] (OOB read)
b23dfbc— IOSurfacePool의 eviction 과정에서 발생하던 out-of-bounds read를 수정했습니다. HashMap과 Vector의 상태가 어긋나면 end() iterator를 역참조하게 되고, takeLast()가 인접 heap 메모리를 읽게 됩니다. - [WebCore ShareDataReader] (UAF)
0bcd5c8— ShareDataReader가 completion handler에서 raw this를 캡처하던 use-after-free를 수정했습니다. callback 도중 객체가 해제될 수 있는 구조였습니다. 이제 weakThis를 캡처한 뒤 RefPtr로 변환해, didFinishLoading이 끝날 때까지 reader를 살려둡니다. - [WebRTC H264/H265 encoder] (OOB read)
141ea15— H264/H265 비디오 인코딩 경로의 out-of-bounds read를 수정했습니다. AppendData가 chunk 길이 대신 CMBlockBuffer 전체 크기를 사용하면서, 범위를 벗어난 heap 데이터가 인코딩된 프레임 버퍼로 복사되었습니다. - [GPU Process RemoteRenderingBackend] (data leak)
1d12ff7— ImageBuffer를 RemoteRenderingBackend 인스턴스 간에 옮길 때 GraphicsContext를 해제하도록 변경되었습니다. 유지된 context reference를 통해 thread-safe하지 않은 backend 간 상태가 유출되는 것을 막습니다. - [GPU process RemoteImageBuffer] (heap disclosure)
feef6b1— LayerBacking image buffer에 대한 getPixelBuffer/putPixelBuffer IPC 호출을 거부하고, 초기화되지 않은 목적지 버퍼를 0으로 채우도록 변경되었습니다. 위조된 호출로 WebContent가 GPU process의 초기화되지 않은 heap 메모리를 읽어내는 경로를 차단합니다. - [WebKit NetworkProcess] (validator bypass)
f7540ca— 여러 ITP 및 storage access 메시지에 대한 IPC validation을 다시 도입했습니다. 이때 LogUserInteraction의 MESSAGE_CHECK은 early return으로 변경되어, 위조된 도메인 접근은 여전히 차단하면서도 WebContent process가 종료되지는 않도록 했습니다. - [JSC YarrJIT] (OOB read)
8f069ce— non-BMP backtrack trampoline에서 firstCharacterAdditionalReadSize 보정이 빠져 있던 문제를 수정했습니다. 그 결과 match 경계가 뒤집히고(start > end), match가 subject 범위를 넘어가게 됩니다. 누락되었던 index register 보정이 추가되었고, RELEASE_ASSERT도 함께 도입되었습니다. - [JSC Wasm GC] (hardening)
ace1903— Wasm GC의 br_on_cast/br_on_cast_fail 명령이 과도하게 긴 LEB128 인코딩을 올바르게 처리하도록 수정되었습니다. 패치 이전에는 조작된 모듈로 validator가 계산한 allowNull 검사와 런타임 동작을 어긋나게 만들 수 있었습니다. 잘못 정렬된 flag byte를 읽게 되면서 type soundness가 우회됩니다. - [WebGPU indirect draw] (OOB vertex fetch)
43ed70e— WebGPU drawIndirect vulnerability에 대한 regression test가 추가되었습니다. finish는 됐지만 submit되지 않은 encoder가 clamping cache를 오염시키면 out-of-bounds vertex fetch가 가능해지는 문제입니다. 다만 upstream fix 자체는 포함되어 있지 않습니다. 319317@main에서 cache 메커니즘이 제거되면서 obsolete로 처리되었기 때문입니다. - [WebGPU Buffer] (OOB read)
ff78e4f— WebGPU index buffer가 검증된 최댓값이 아니라 지금까지 기록된 최대 인덱스를 추적하고 있었습니다. 그래서 큰 writeBuffer 호출 하나로 이후 write들의 validation 상태를 오염시킬 수 있었고, GPU에서 out-of-bounds read가 발생합니다. - [UIProcess RemoteLayerTree DisplayLink] (UAF, re-entrancy)
b0d927d— 재진입 teardown 도중 DisplayLink client가 다시 등록되는 것을 막는 guard가 재도입되었습니다. 이 guard가 없으면 client가 해제된 뒤에도 다음 CVDisplayLink callback에서 계속 호출될 수 있습니다. - [UIProcess RemoteLayerTree] (race condition UAF)
e25bd0f— main thread가 m_momentumEventDispatcher를 null로 만든 뒤 scrolling thread가 해제된 객체에 접근할 수 있던 race condition을 수정했습니다. 이제 모든 접근이 lock으로 보호됩니다. - [WebCore Document] (validator bypass)
49cbb80— Document::execCommand의 대소문자 구분 비교를 수정했습니다. 대소문자만 다른 command 변형(예: 'InsertHTML')으로 Trusted Types CSP 적용을 우회할 수 있었고, 신뢰되지 않은 HTML 주입이 가능했습니다. - [WebCore CSP] (nonce theft)
62a36ef— nonce 기반 CSP 우회를 수정했습니다. dangling markup을 이용하면 nonce가 붙은 element의 속성 이름이나 값에 '<link' 문자열이 주입될 수 있었습니다. 이제 Element::isNonceable()이 기존의 '<script', '<style' 검사에 더해 속성 이름과 값에서 '<link'도 함께 확인합니다.