This Week in WebKit — August 17-23, 2026
Featured
The value that reaches script isn't a corrupted object — it was never an object. Store one property on it and the collector picks up the pieces.
The page owns both the free and the read, and the read lands on the real-time audio thread. Whatever it plays back came out of reclaimed heap — unbounded, quantum after quantum.
The URL enters the UI process as untrusted renderer data and leaves it as an authoritative delegate argument. One round trip later it's a directory read grant.
The ticket is freed while a background compile still holds its address, and the allocator hands that slot to a stranger. Whatever the stranger was keeping alive stops being kept alive.
Three inline slots downstream, and a layer count chosen by whoever wrote the SDP. The only bound at the entry point was the kind that compiles out of shipping builds.
A compromised WebContent process could clear one IPC bool and keep the Set-Cookie headers the NetworkProcess was stripping. The flag was a leftover from a client that no longer exists.
Security fixes
Notable development
-
RunLoop::Timer thread-affinity assertions and eight teardown race fixes
hardening WTF RunLoop
Other security-relevant changes
-
[WebKit UIProcess / WebPageProxy] (sandbox bypass)
248f89a—WebPageProxy::didFailLoadForFrame에 MESSAGE_CHECK_URL이 추가되었습니다. compromised WebContent process가 file:// failingURL을 위조해 UI process와 Network process 내 임의 디렉토리에 대한 read access를 얻는 상황을 방지합니다. -
[WebCore CoreImage] (OOB read)
88ab9e1— FEComponentTransfer에서 tableValues가 비어 있으면 CoreImage Metal kernel이 table index 계산 시 lower bound clamping을 건너뛰어tableStart[-1]dereference가 발생했습니다. 이를 통해 GPU process 메모리가 IOSurface를 거쳐 compromised WebContent process로 유출될 수 있었습니다. -
[WebCore WebXR] (UAF)
2b68a68— WebXRSystem의 async IPC reply callback이 raw this pointer를 capture하던 UAF가 수정되었습니다. iframe 제거와 GC가 겹치면 queue된 task가 실행되기 전에 객체가 해제되어, freed memory read와 member write가 발생할 수 있었습니다. -
[WebCore Streams] (Type confusion)
87d2036—ReadableStream.cancel()에서 무조건적인 jsCast를 jsDynamicCast로 변경했습니다.Promise[Symbol.species]가 non-Promise 객체를 반환하도록 override된 경우 발생하던 type confusion을 방지합니다. -
[JSC DeferredWorkTimer] (UAF, type confusion)
15c117a— DeferredWorkTimer에서 Wasm compiler task가 raw Ticket pointer를 capture하던 UAF가 수정되었습니다. TZone allocator가 slot을 재사용하면 stale pointer가 같은 주소의 새 ticket과 일치할 수 있었습니다. 이제 weak reference를 사용하며 liveness check가 필수로 수행됩니다. -
[libwebrtc video codec] (stack buffer overflow)
e8a476c— libwebrtc의 VideoCodecInitializer에서 remote SDP에 과도한 simulcast layer가 포함된 경우 stack buffer overflow가 발생했습니다. 공격자는 조작된 WebRTC offer를 통해 WebContent 메모리를 손상시킬 수 있었습니다. 패치는 simulcast encoding에 대한 bounds check를 추가하고, debug check를 release check로 격상시켰습니다. -
[WebCore WebAudio] (race condition UAF)
8912cf5— main thread와 audio thread 사이에서 WaveShaperProcessor curve에 대한 non-atomic RefCounted race로 인해 heap-use-after-free가 발생했습니다. refcount 연산이 동시에 일어나면 render 도중 Float32Array buffer가 해제될 수 있었습니다. curve를Vector<float>로 저장하도록 변경해 수정되었습니다. -
[WebKit UIProcess] (sandbox bypass)
198d4db— compromised WebContent가 EncodedFileData를 통해 임의 file path를 주입하고 filesystem access를 얻는 sandbox escape가 수정되었습니다. 이제 sandbox extension을 부여하기 전 이전에 사용자가 승인한 선택 항목과 경로를 대조 검증합니다. -
[WebCore Permissions] (UAF, race condition)
4aaa3c1— worker DeferredPromise에 대한 cross-thread destruction race로 인한 UAF가 수정되었습니다. worker에서navigator.permissions.query()를 호출한 뒤worker.terminate()가 이어지면, worker가 소유한 promise 객체가 main thread에서 해제될 수 있었습니다. -
[WebGPU Buffer] (OOB read)
cf0a14a— command buffer 사이에서 index buffer validation flag가 너무 이르게 clear되어, drawIndexed가 재검증을 건너뛰고 공격자가 제어하는 out-of-bounds index로 실행될 수 있었습니다. 패치는 pending encoder들이 precommit validation을 모두 완료할 때까지 flag clearance를 지연시킵니다. -
[WebKit NetworkProcess / ServiceWorker] (UAF)
a3c2559— NetworkConnectionToWebProcess에 MESSAGE_CHECK가 추가되어 ServiceWorkerDownloadTask의 UAF를 방지합니다. compromised WebContent process가 SW context connection을 두 번 수립하면서 이전 connection을 close 없이 파괴하는 경우 발생하던 문제입니다. -
[WebKit UIProcess back/forward list] (validator bypass)
074d380— back/forward item validation에서 debug 전용 assertion을 MESSAGE_CHECK로 전환했습니다. compromised WebContent process가 cross-process item을 위조해 file:// URL에 접근하는 상황을 방지합니다. -
[WebKit UIProcess] (sandbox bypass, file write)
f23ffb5— compromised renderer가 표시 불가능한 MIME type을 가진 data: URL로 navigate해 사용자 상호작용 없이~/Downloads에 공격자가 제어하는 바이트를 자동 다운로드로 기록할 수 있던 취약점이 수정되었습니다. 이제 API client가 시작한 경우가 아니면 data: URL에 대한PolicyAction::Download를 차단합니다. -
[WebCore async-clipboard] (UAF)
c5036aa— reentrant한clearItemTypeLoaders()호출로 인한 async clipboard의 heap use-after-free가 수정되었습니다. iteration 도중 container가 변경되는 것을 막기 위해 vector 내용을 local 변수로 swap한 뒤 순회하도록 변경했습니다. -
[WebCore DOM] (UAF)
cb83583— smart pointer를 도입해trustedTypeCompliantString에서 Document의 use-after-free를 수정했습니다. trusted types policy가 적용된 srcdoc iframe이 garbage collection 도중 제거될 때 발생하던 취약점입니다. -
[WebCore HistoryController] (UAF)
efe4920—history.back()중 popstate handler가 실행되면서m_children이 iteration 도중 재할당되는 경우 발생하던HistoryController::recursiveGoToItem의 use-after-free가 수정되었습니다. iframe injection을 통해 web에서 도달 가능한 취약점입니다. -
[GPUProcess UserMediaCaptureManagerProxy] (race condition, UAF, write-after-unmap)
866892a— UserMediaCaptureManagerProxy의 race condition이 수정되었습니다. GPU main thread와 background WorkQueue가 동기화 없이 shared state에 접근하면, 반복적인 StartProducingData IPC 호출로 audio ring buffer에 heap-use-after-free와 write-after-unmap이 발생할 수 있었습니다. -
[ANGLE Metal TextureMtl] (OOB write)
b3a1859— storage 재할당 이후에도 살아남은 per-level texture view를 TextureMtl에서 clear하도록 수정했습니다. 이전에는 이후texImage2D가 fast path를 타면서 크기가 맞지 않는 stale view를 가져오면,replaceRegion이 경계를 넘어 write하는 문제가 있었습니다. WebGL resize 시퀀스를 통해 exploit이 가능했습니다. -
[WebCore fileapi] (UAF)
629adf4—AsyncFileStream::read가 span 대신ThreadSafeRefCounted Box<Vector>를 받도록 변경되어, background thread가 buffer에 write하는 동안 buffer가 그보다 오래 살아있도록 보장합니다. Blob URL을 통해 도달 가능했던 cross-thread UAF write를 수정합니다. -
[WebKit UIProcess] (site-isolation bypass)
6703af8— compromised renderer가 IPC에서treatAsSameOriginNavigation을 위조해 cross-site process swap을 건너뛰는 것을 방지했습니다. 해당 필드는 이제 UIProcess 쪽에서 서버 측으로 계산됩니다. -
[WebKit WKMouseInteraction] (UAF)
ffe2ea6— 연속된 pointer lock IPC로 인해 발생하던 iOS WKMouseInteraction의 use-after-free가 수정되었습니다. unretained block copy가 교체되면서 해제되어, 이후의 lock에서 dangling pointer가 남아있는 상태였습니다. BlockPtr retention을 채택하고 state validation을 추가했습니다. -
[WebCore WebXR] (UAF)
3a88b7c— WebXRXRSessionInit에서sequence<any>가 garbage collection에 의해 해제될 수 있는 JSValue를 보유하던 use-after-free가 수정되었습니다.sequence<DOMString>으로 변경하고 Vector를 즉시 복사하도록 했으며, 향후 안전하지 않은sequence<any>/FrozenArray<any>채택을 막는 static assert도 추가되었습니다. -
[WebCore WebGL] (race condition, UAF)
034f2fb— WebGL context restoration 도중objectGraphLock을 잡도록 추가했습니다. 동시에 실행되는 GC가 이미 해제된 WebGLTransformFeedback과 WebGLVertexArrayObject 객체에 접근하는 race condition을 방지합니다. -
[WebCore Document] (UAF)
ccb3ee3— service worker가 client를 navigate할 때 SecurityOrigin을 protect하도록 수정했습니다. ArrayBuffer 기반 heap grooming과 document open/close cycle을 통해 exploit이 가능했던 use-after-free를 방지합니다. -
[WebCore Blob] (race condition)
d643555— BlobData/BlobDataFileReference destruction에 대한 cross-thread race로 인한 UAF가 수정되었습니다. BlobData는 ThreadSafeRefCounted였지만 thread-safe하지 않은 member를 보유하고 있어, main thread가 reference를 들고 있는 동안 background thread가 이를 해제할 수 있었습니다. destruction을 main thread 전용으로 제한해 강화되었습니다. -
[WebCore iOS Pasteboard] (sandbox bypass)
1dc6a86— case-sensitive type validation으로 인한 대소문자 변형 bypass가 수정되었습니다. compromised WebContent가Com.Apple.UIKit.Image를 전송해 UI process 내 NSKeyedUnarchiver/ImageIO로 바이트를 우회 전달할 수 있었습니다. case-insensitive prefix matching으로 교체하고, readString에 누락되어 있던 gate도 추가했습니다. -
[WebCore Streams] (type confusion)
8fd92b1—Array.prototype[Symbol.iterator]를 override하면 object substitution을 통해 TransformStream에서 type confusion이 발생할 수 있었고, ASSERT 전용 guard를 우회해 controlled deref와 vtable call로 이어질 수 있었습니다. runtime 상의 size/null-check와 TypeError validation을 추가해 수정했습니다. -
[WebKit NetworkProcess] (sandbox bypass)
c312747— compromised WebContent가 공격자 제공 response를 이용해, partition restoration이 이루어지기 전 임의의 cross-origin partition에 대한 301 redirect를 주입함으로써 persistent cache를 오염시킬 수 있었습니다. 패치는 partition restoration을 앞당기고 IPC 경계에 MESSAGE_CHECK를 추가합니다. -
[NetworkProcess SharedWorker] (validator bypass)
019c43f— SharedWorker context connection을 수립하기 전, WebContent로부터 받은 Site parameter를 검증하는 MESSAGE_CHECK_COMPLETION이 추가되었습니다. compromised renderer가 임의 도메인의 connection을 탈취하는 것을 방지합니다. -
[WebCore AudioEncoder] (UAF)
b48b4d4—encode()가 converter를 교체하면서 이를 살려두지 않던 InternalAudioEncoderCocoa의 use-after-free가 수정되었습니다. drain 도중close()가 호출되면 이전 drain이 이미 해제된 encoder를 향해 실행될 수 있었고, PCM format 변경 시퀀스를 통해 exploit이 가능했습니다. -
[GPU Process / MediaCapture] (UAF)
54b8e49— async callback에서 media constraint를 reference 대신 value로 capture하도록 변경했습니다. cloned track에 대해 takePhoto와 applyConstraints가 동시에 race하면서 GPU process에 heap UAF가 발생하던 문제를 방지합니다. -
[WebKit UIProcess PDF] (Path traversal, sandbox bypass)
b12f122— PDF filename에 포함된 percent-encoded path separator가 sanitization을 우회해, compromised web content process가 임시 디렉토리 밖으로 파일을 write할 수 있었습니다. sanitization 전에 filename을 percent-decoding하고, 단일 path component인지 검증하도록 수정되었습니다. -
[WebCore Web Audio] (race condition, UAF)
2f91fd7—BiquadFilterNode::setType()에서graphLock()을 잡도록 추가해, audio thread의 kernel 재할당과의 race를 방지합니다. main thread가m_kernelsVector에서 해제된 kernel pointer를 로드해 파괴된 BiquadDSPKernel로 virtual dispatch가 발생할 수 있던 UAF를 막습니다. -
[WebKit NetworkProcess / loadPing] (validator bypass)
6aa96bc—loadPing()에 MESSAGE_CHECK가 추가되어firstPartyForCookies를 검증합니다. compromised web process가 cross-origin URL을 위조해 관련 없는 origin의 cookie를 탈취하는 상황을 방지합니다. -
[WebCore SVG] (UAF)
a93904b—getPointAtLength()에서 caching된 raw renderer pointer가, 중첩된getTotalLength()가updateLayoutIgnorePendingStylesheets()를 유발하면서 stale해져 renderer 객체에 대한 UAF를 일으켰습니다. cache를 제거하고 renderer 접근을 사용 직전으로 지연시켜 수정했습니다. -
[WebKit ITP] (IPC validator bypass)
5044a54—ResourceLoadStatisticsUpdated,LogUserInteraction,RequestStorageAccessUnderOpenerIPC message를 검증하도록 수정했습니다. compromised WebContent process가 ITP database entry를 위조해 사용자 확인 없이 cross-origin cookie access를 얻는 것을 방지합니다. -
[JSC DFG] (UAF)
2620d0d— object storage가 재할당될 때MultiPutByOffset에 대한 write barrier가 추가되었습니다. 이 barrier가 없으면 generational GC가 old-generation에서 여전히 참조 중인 new-generation 객체를 collect해 use-after-free로 이어질 수 있었습니다. -
[WebKit Extensions Storage] (UAF)
d9783c3— SQLite batch insert가 중간에 실패하면서 발생하던 storageSet의 heap use-after-free가 수정되었습니다.data.keys()를 iteration하는 동안 entry를 제거하면 HashMap mutation이 buffer를 해제해 iterator가 dangling 상태가 되었고, compromised renderer가 IPC를 통해 도달 가능한 UI Process UAF로 이어질 수 있었습니다. -
[WebCore WebCodecs] (UAF)
e147963—WebCodecsAudioData::memoryCost()의 heap-use-after-free가 수정되었습니다. GC marker thread가 이미 해제된 PlatformRawAudioData를 dereference하는 동안 main thread가close()에서 RefPtr을 null로 설정하면서 발생하던 문제로, memory cost를 이제 atomic 변수에 caching합니다. -
[WebCore IDB Server] (UAF)
16b1bde— IDB reverse cursor에서 iteration 도중 다음으로 높은 index entry가 삭제되면 발생하던 heap use-after-free가 수정되었습니다.std::reverse_iterator의 base node가 dangling 상태가 되어, 이후의 increment 연산이 해제된 메모리를 dereference하는 문제였습니다. -
[WebGL GPU process] (heap disclosure)
8c0e20b— readPixelsInline에서 발생하던 heap disclosure가 수정되었습니다. tryMalloc 대신 tryZeroedMalloc을 사용하도록 변경하여, 초기화되지 않은 GPU-process 메모리가 WebGL readPixels()로 반환되는 문제를 방지했습니다. -
[WebCore graphics / PixelBufferConversion] (uninitialized disclosure)
b690833— convertImagePixelsFromFloat16ToFloat16()이 destination buffer를 기록하지 않은 채 조기 반환되는 경우가 있었습니다. 이때 초기화되지 않은 Gigacage::Primitive heap 바이트가 WebContent에 매핑된 공유 메모리로 memcpy되었습니다. 결과적으로 WebContent와 GPUProcess 사이의 heap disclosure로 이어졌습니다. -
[WebGPU] (key collision)
144aa0d— WebGPU bind group validation에서 validation-cache key가 충돌하는 문제가 있었습니다. 이로 인해 compute용으로 validate된 bind group이 render pipeline validation을 통과할 수 있었습니다. 결과적으로 pipeline ID 충돌을 통해 GPU out-of-bounds write가 가능했습니다. -
[WebCore canvas] (UAF)
040ef6e— canvas getContext()에서 발생하던 UAF가 수정되었습니다. re-entrant한 dictionary conversion 과정에서 JS wrapper가 살아있는 상태로 m_context가 덮어써질 수 있었습니다. 이후 GC sweep 시점에 wrapper의 deref()가 해제된 메모리를 읽는 상황이 가능했습니다. -
[WebCore AutoFillButtonElement] (UAF)
fac72c7— AutoFillButtonElement::defaultEventHandler의 use-after-free가 수정되었습니다. click dispatch 도중 JavaScript가 input.type을 변경할 수 있습니다. 이 경우 TextFieldInputType이 해제되더라도 EventPath는 button을 계속 참조합니다. 결과적으로 웹 콘텐츠에서 virtual call hijacking으로 이어질 수 있었습니다. -
[WebKit CoreIPC NSURLRequest] (sandbox bypass)
a38f039— CoreIPCNSURLRequest에서 body와 bodyParts 필드를 더 이상 전달하지 않도록 변경되었습니다. CFNetwork는 NSString 항목을 POSIX 파일 경로로 해석합니다. 이 때문에 탈취된 WebContent process가 NetworkProcess로부터 임의의 파일을 유출할 수 있었습니다. -
[WebKit NetworkProcess / ResourceLoader] (sandbox bypass)
64315b6— redirect 처리 과정에 MESSAGE_CHECK validation이 추가되었습니다. 탈취된 WebContent process가 firstPartyForCookies를 변조하여 cross-origin cookie에 접근하는 것을 막기 위한 조치입니다. origin이 변경되는 경우, 해당 process의 allowed-list와 일치하는지 검증합니다. -
[JSC DFG] (UAF)
13bfbf9— resizable/growable-shared TypedArray view에 대해 backing store pointer를 constant-fold하지 않도록 변경되었습니다. WebAssembly.Memory.grow()가 vector를 재할당한 이후에는 이전 constant-folding 결과가 stale pointer로 남게 됩니다. 이 stale pointer를 통해 out-of-bounds write가 가능했습니다. -
[WebKit UIProcess / WebFrameProxy] (type confusion)
15c722b— WebFrameProxy에서 잘못된 container의 end()와 비교하던 문제가 수정되었습니다. 이로 인해 orphan 상태의 frame이 탐지를 피할 수 있었습니다. 그 결과 탈취된 WebContent가 UI process의 focused frame에 cross-page frame을 주입할 수 있었습니다. 이 과정에서 순회(traversal) 도중 type confusion과 EXC_ARM_PAC_FAIL이 발생할 수 있었습니다. -
[WebCore CloseWatcher] (UAF)
ae9baa4— CloseWatcher::destroy()의 use-after-free가 수정되었습니다. CloseWatcherManager가 마지막 Ref를 보유한 상태에서 AbortSignal lambda가 WeakPtr을 통해 실행되면 이 문제가 발생했습니다. WeakPtr을 RefPtr로 변경하여, 해제 과정 동안 watcher가 계속 살아있도록 했습니다. -
[WebKit Process Model] (sandbox bypass)
e9f94fd— 12개의 IPC handler에서 sender-ownership validation이 누락되어 있었습니다. 이로 인해 탈취된 WebContent가 sibling tab ID를 brute-force로 탐색하여 다른 탭의 security state에 접근할 수 있었습니다. 각 handler에 MESSAGE_CHECK assertion을 추가하여 수정했습니다. -
[WebCore AVFoundation] (race condition, UAF)
d4b40e1— flushAndRemoveImage의 @catch 경로에서 발생하던 cross-thread UAF가 수정되었습니다. background-queue의 error handler는 thread-safe하지 않은 SampleBufferDisplayLayerClient WeakPtr을 역참조했습니다. 이 시점에 main thread에서는 RemoteSampleBufferDisplayLayer를 해제하고 있었습니다. -
[UIProcess RemoteScrollingTree] (UAF, race condition)
6a97574— cross-thread use-after-free가 수정되었습니다. m_progressBasedTimelineRegistry가 main thread에서 해제되는 동안 ScrollingThread가 동기화 없이 이를 읽는 문제였습니다. scroll-driven animation을 토글하면서 빠르게 스크롤하면 이 상황을 유발할 수 있었습니다. -
[WebCore MessagePort] (validator bypass)
899dd99— Network Process 내 MessagePort ownership validation이 수정되었습니다. 이전에는 탈취된 WebContent가 ProcessIdentifier를 위조하여 다른 process가 소유한 port에 대해 close, entangle, disentangle 연산을 조작할 수 있었습니다. -
[WebKit RemoteObjectRegistry] (authorization bypass)
972966a— 탈취된 WebContent process가 같은 pool 내 관련 없는 WebPageProxy의 _WKRemoteObjectRegistry로 IPC 메시지를 보내는 경로가 차단되었습니다. 이전에는 이를 통해 다른 페이지가 등록한 객체에 대해 임의의 Objective-C method invocation이 가능했습니다. -
[WebGPU] (validator bypass)
97e8c4b— PipelineLayout::makeInvalid()가 vector를 비우면서도 std::optional은 engaged 상태로 남겨두는 문제가 있었습니다. 이로 인해 validation이 건너뛰어질 수 있었습니다. 오염된(poisoned) layout이 호환되지 않는 argument buffer와 함께 Metal dispatch까지 도달할 수 있었습니다. 이 경우 GPU out-of-bounds access가 발생했습니다. getBindGroupLayout(index)를 통해 도달 가능한 경로였습니다. -
[WebKit IPC] (sandbox bypass)
7e6fba5— FormDataReference에서 IPC validator가 빈 sandbox extension handle을 그대로 받아들이던 문제가 수정되었습니다. validation을 constructor로 옮겨, Cocoa 플랫폼에서 조작된 IPC 메시지를 통한 sandbox escape를 방지했습니다. -
[WebCore XSLT] (UAF)
a8459d4— libxslt가 compile 실패 시 import된 stylesheet를 해제하면서 m_stylesheetDoc pointer가 dangling 상태로 남는 heap UAF가 있었습니다. 다단계 XSL import chain에서 subresource 로딩이 지연되는 경우 parseString()에서 use-after-free가 발생했습니다. XML의 processing instruction을 통해 도달 가능한 경로였습니다. -
[WebCore FocusController] (UAF)
87fedd8— focus traversal 과정에서 발생하던 use-after-free가 수정되었습니다. blur event handler가 document를 제거하면 focus element를 탐색하는 도중 dangling pointer가 남을 수 있었습니다. FocusController에 smart pointer를 도입하여 이 문제를 해결했습니다. -
[WebKit NetworkProcess IDB blob validation] (validator bypass)
5be1236— blob path validation이 directory 단위에서 파일 단위 grant로 강화되었습니다. 이를 통해 WebContent가 다른 origin의 IDB storage를 가리키는 file-backed blob을 등록하는 것을 막아, cross-origin data exfiltration을 차단했습니다. -
[WebCore mediastream] (UAF)
a14d1c0— RTCPeerConnection이 garbage collection된 이후 setCodecPreferences()를 통해 도달 가능했던 RtpTransceiver codec state의 use-after-free가 수정되었습니다. connection이 이미 닫힌 경우 아무 동작도 하지 않도록 guard를 추가했습니다. -
[WebCore TextTrack] (data race, UAF)
e379531— GC thread가 TextTrackCue::m_track을 읽는 동안 main thread가 이를 null로 설정하면서 발생하는 data race가 use-after-free로 이어졌습니다. CheckedPtr을 도입하고 동기화 lock을 추가하여 이 문제를 수정했습니다. HTML media의 TextTrack API를 통해 웹에서 도달 가능한 경로였습니다. -
[WebKit Extensions / SQLiteStore] (race condition, UAF)
abe6e82— Web Extensions SQLiteStore의 heap use-after-free가 수정되었습니다. weak-null 상태로 조기 반환되는 경로에서 completion handler가 main thread가 아닌 background WorkQueue에서 호출되었습니다. 이로 인해 extension reload 도중 HashMap이 동시에 변경될 수 있었습니다. 영향을 받는 세 개의 store subclass 전반에서 handler가 main thread로 dispatch되도록 수정했습니다. -
[WebKit GPUProcess graphics] (information disclosure)
6a20a3d— ASSERT_NOT_REACHED가 RELEASE_ASSERT_NOT_REACHED로 격상되었습니다. 또한 MESSAGE_CHECK guard가 추가되어, PDF/DisplayList backend에서 생성된 초기화되지 않은 PixelBuffer가 IPC를 통해 전송되는 것을 막았습니다. 수정 이전 release build에서는 초기화되지 않은 GPU heap 메모리가 WebProcess로 직렬화(serialize)될 수 있었습니다. -
[WebKit WebFrameProxy] (hardening)
c344219— isMainFrame, securityOrigin, topOrigin, frameID, URL 등 security-critical 필드를 UI-process가 가진 ground truth와 대조하여 검증하도록 변경되었습니다. 이전에는 WebProcess가 제공한 이 값들을 검증 없이 그대로 신뢰했습니다. 값이 일치하지 않으면 crash 대신 값을 덮어쓰고 로그를 남기도록 했습니다. -
[WebKit / Extensions] (race condition)
4e721b0— WebExtensionSQLiteDatabase에서 WorkQueue와 UI thread 사이의 동시 ref/deref 경쟁으로 인한 use-after-free가 있었습니다. ThreadSafeRefCounted를 도입하여 refcount 갱신이 atomic하게 이루어지도록 수정했습니다. -
[WebKit NetworkProcess] (hardening)
b4165ba— PreconnectTo handler에 MESSAGE_CHECK가 추가되어, WebContent로부터의 HTTP-body payload를 거부하도록 했습니다. 이를 통해 탈취된 renderer가 network request를 강제로 발생시키는 것을 방지했습니다. -
[WebKit Extensions API] (UAF)
1759ab2— WebExtension port listener dispatch의 UAF가 수정되었습니다. onMessage/onDisconnect callback 도중 listener를 추가하면 vector가 재할당될 수 있었습니다. 이 경우 순회 중이던 iterator가 해제된 메모리를 가리키는 dangling 상태가 되었습니다. 순회 전에 listener를 복사하도록 하여 이 문제를 방지했습니다. -
[WebExtension SQLite stores] (race condition, UAF)
6d6ea48— WebExtension SQLite store에서 발생하던 race condition이 수정되었습니다. WorkQueue lambda에 캡처된 JSON::Object Ref가 main thread와 worker thread 양쪽에서 동시에 refcount가 갱신될 수 있었습니다. 이로 인해 조기 해제(premature deallocation)와 WorkQueue 상에서의 heap-use-after-free가 발생할 수 있었습니다. -
[WebGPU Device] (uint32 wraparound, OOB read)
0077500— index buffer clamping에서 발생하던 uint32 wraparound가 saturating addition을 통해 수정되었습니다. 공격자가 제어하는 index로 bounds check를 우회하여 GPU out-of-bounds read를 유발하는 것을 방지했습니다. -
[WebGPU RemoteBuffer] (race condition)
ce589a4— IPC를 통해 m_bufferMapCount가 음수가 될 수 있었던 state confusion이 방지되었습니다. 이 문제로 인해 getMappedRange()가 일관되지 않은 buffer state에서 진행될 수 있었습니다. 결과적으로 공격자가 지정한 메모리에 대한 동시 GPU write가 가능했습니다. -
[WebKit NetworkProcess] (sandbox bypass)
ec611da— 이어지는 local file 로딩(예: HTTP redirect를 통한 file:// 접근)이 sandbox extension check를 건너뛸 수 있었던 우회 경로가 수정되었습니다. 이제는 로딩 순서와 무관하게 모든 file:// request가 검증됩니다. -
[JSC WasmGC] (validator bypass)
5df8b0b— br_on_cast flag의 reserved bit에 대한 validation이 추가되었습니다. 이전에는 flag byte가 잘못 해석되면서 null이 non-null type check를 통과할 수 있었습니다. -
[WebKit NetworkProcess] (sandbox bypass)
022bc68— Network process가 보호된 시스템 디렉토리로의 form upload에 대해 sandbox extension을 생성하지 못하도록 변경되었습니다. 이를 통해 탈취된 renderer가 Network process를 속여 민감한 경로에 대한 read access를 스스로에게 부여하게 만드는 시나리오를 차단했습니다. -
[WebCore web-locks] (UAF)
7a5ee54— WebLockManager::query()의 cross-thread use-after-free가 수정되었습니다. completion handler가 worker-thread의 DeferredPromise를 캡처하고 있었는데, handler가 끝내 호출되지 않은 채 main thread에서 해당 DeferredPromise가 파괴되는 경우가 있었습니다. -
[JSC DFG] (type confusion)
d75a9fd— DFG가 dictionary structure에서 property의 부재(absence)를 캐싱하던 문제가 수정되었습니다. dictionary structure는 transition 없이 runtime에 property를 추가할 수 있어, 이 경우 stale cache로 인한 type confusion이 발생할 수 있었습니다. -
[WebKit NetworkProcess] (IPC validation bypass)
c5fabb4— 검증되지 않은 IPC 필드가 제거되었습니다. 이전에는 탈취된 WebContent process가 shouldRestrictHTTPResponseAccess를 false로 설정하여 response header sanitization(Set-Cookie 제거, cross-origin filtering)을 우회할 수 있었습니다. -
[JSC Structure] (Proxy invariant bypass)
336c35e— SlowPutArrayStorage structure의 HasNonConfigurableProperties bit가 stale 상태로 남아있던 문제가 수정되었습니다. 이를 통해 Proxy handler가 invariant check를 우회하여 non-configurable array property에 대해 잘못된 값을 반환하는 것을 방지했습니다. -
[JSC FTL] (UAF)
a2de66f— Array.indexOf/includes를 compile할 때 ensureStillAliveHere(base) 호출을 GC를 유발할 수 있는 vmCall 이후로 지연시켰습니다. 이를 통해 연산 도중 base array가 GC로 수거될 수 있었던 잠재적 UAF를 수정했습니다. -
[WebCore XMLDocumentParser] (UAF)
ba3be26— XML parser의 use-after-free가 수정되었습니다. custom element constructor가 parsing 도중 element를 re-parent하거나 adopt할 수 있어 parserAppendChild의 invariant가 깨질 수 있었습니다. reaction stack이 모두 처리된 이후 재검증을 추가하여, element가 여러 child list에 동시에 연결되는 상황을 방지했습니다. -
[WebCore MediaSession] (UAF)
d6fb60c— MediaMetadata artwork loader callback의 use-after-free가 수정되었습니다. lambda가 raw this pointer를 캡처하고 있었는데, ArtworkImageLoader가 교체된 이후에도 이 pointer가 객체보다 오래 남아있을 수 있었습니다. WeakPtr 캡처와 null-check로 변경하여 crash를 방지했습니다. -
[WebKit Blob registration] (Sandbox bypass)
a18c0a8— Blob 등록 과정에서 replacementPath에 대한 validation이 강화되어 임의 파일 삭제를 방지합니다. 손상된 web process가 extension handle을 생략하는 방식으로 sandbox check를 우회한 뒤 FileSystem::deleteFile()을 호출할 수 있었습니다. 이제 해당 경로에 유효한 sandbox extension이 요구됩니다. -
[WebCore graphics / PixelBuffer] (information disclosure)
0f85710— GetPixelBuffer에서 발생하던 초기화되지 않은 heap 노출이 수정되었습니다. RGB가 아닌 colorspace 변환이 실패하면, 호출자에게 이전 heap 데이터가 그대로 반환될 수 있었습니다. RGB colorspace validation과 오류 발생 시 zero-fill 로직이 추가되었습니다. -
[WebKit UIProcess / back/forward list] (sandbox bypass)
9d4788b— Back/forward 내비게이션 validation 방식이 process-global 기준에서 process별 기준으로 변경되었습니다. 이를 통해 손상된 WebContent process가 IPC message 내 file:// URL을 위조해 파일 시스템에 무단으로 접근하는 경로가 차단됩니다. -
[JSC TypedArray] (OOB read)
7a9d149— TypedArray.from()에서 발생하던 out-of-bounds read가 수정되었습니다. map callback이 source ArrayBuffer를 resize하거나 detach시키면, loop가 변경된 bounds를 넘어 진행될 수 있었습니다. -
[WebKit IndexedDB] (validator bypass)
e2b88c2— Version change 작업이 진행 중인 상태에서 도착하는 IndexedDB transaction은 이제 거부됩니다. 손상된 WebContent process가 IPC message를 위조해 client-side validation check를 우회하는 경로를 막기 위한 조치입니다. -
[JSC WASM JIT] (UAF)
20d1bae— WASM re-tier 경로에서 callsite repatching이 진행되는 동안 OMGOSREntryCallee를 무조건 살아있는 상태로 유지하도록 수정되어 UAF가 해결되었습니다. 기존에는 새 BBQCallee가 퇴역한 callee를 교체하는 시점에, patching 도중 stale weak reference가 동시에 해제될 수 있었습니다. -
[WebGPU RenderPassEncoder] (OOB read)
543f99d— baseVertex validation에서 발생하던 signed-negation overflow가 수정되었습니다. INT32_MIN 값을 negation하면 동일한 값으로 wrap되어 bounds checking을 우회하고 OOB vertex buffer read로 이어질 수 있었습니다. 패치는 negation 전에 baseVertex를 int64_t로 확장합니다. -
[JSC Yarr JIT] (OOB read)
bd5f1e5— negativeOffsetIndexedAddress가 원래 값 대신 조정된 base register를 사용하도록 수정되었습니다. 이를 통해 조작된 Unicode 문자열을 이용한 regex pattern matching에서 발생하던 out-of-bounds read가 제거되었습니다. -
[WebCore mediastream] (race condition UAF)
e7f7480— VideoFrameLibWebRTC::m_conversionCallback에 대해 clone()과 pixelBuffer() 사이에서 발생하던 data race가 수정되어 use-after-free가 해결되었습니다. Lock 획득과 thread annotation을 통해 callback access가 동기화되며, WebCodecs API를 통한 해제된 callback dereference를 방지합니다. -
[JSC WebAssembly] (UAF)
a012bab— WebAssembly.Memory에서 유래한 ArrayBuffer가 아직 resize 작업을 수행 중인 상태에서 GC가 해당 WebAssembly.Memory를 collect할 수 있었던 use-after-free가 수정되었습니다. WebAssembly.Memory.toResizableBuffer()와 GC pressure를 조합해 유발할 수 있었습니다. -
[WebCore Background Fetch] (UAF)
bbd73ca— Background fetch progress event 처리 과정에서 발생하던 heap use-after-free가 수정되었습니다. Document iteration 도중 동기적으로 발생하는 event가 handler에 의해 변경되면서 iterator가 무효화될 수 있었습니다. 이제 event는 iteration이 끝난 뒤 발생하도록 queue에 쌓입니다. -
[WebCore video frames] (heap disclosure)
7c03dc5— bytesPerRow=0으로 설정된 SharedVideoFrameInfo IPC를 처리할 때, CVPixelBuffer의 padding 영역을 통해 GPU heap memory가 노출되고 있었습니다. 사용되지 않는 buffer 영역을 zero-fill하는 방식으로 수정되었습니다. -
[WebCore SharedVideoFrameInfo] (Heap disclosure)
5d977a0— WebProcess가 bytesPerRow=0인 IPC message를 조작해, 초기화되지 않은 CVPixelBuffer 데이터가 할당되도록 유발할 수 있었습니다. 이 경우 GPU process의 heap memory가 노출될 수 있었습니다. 할당된 buffer에 memset을 적용해 이 노출을 방지합니다. -
[WebCore animations] (UAF)
5c9eba9— AnimationTimelinesController::suspendAnimations에서 발생하던 use-after-free가 수정되었습니다. applyPendingAcceleratedAnimations에 의해 layout이 유발되면 iteration 도중 m_timelines HashSet이 변경될 수 있었습니다. scroll-timeline, view-timeline CSS property를 통해 web에서 도달 가능합니다. -
[WebCore AVFoundation CDM] (race condition)
e5439f4— Main thread가 아닌 곳에서 실행되는 destructor와 main thread의 createSession()이 lock 없이 m_sessions Vector를 동시에 변경하고 있었습니다. 이로 인해 race condition이 발생해 heap corruption으로 이어질 수 있었습니다. Destruction을 main thread로 고정하는 방식으로 수정되었습니다. -
[WebCore MIME type cache] (race condition)
576ee4a— 보호되지 않은 collection에 대한 동시 접근으로 인해 MIME type validation에서 use-after-free로 이어질 수 있었던 data race가 수정되었습니다. Media element의 type checking에 영향을 미치며, web에서 도달 가능한 경로입니다. -
[WebKit Network process] (sandbox bypass)
74d0c62— Network process가 sandbox extension 없이도 JS fetch()를 통한 temp directory 파일 read를 허용하고 있었습니다. 이는 web에서 도달 가능한 sandbox bypass에 해당합니다. MobileSafari에 대해서는 이 동작이 제한되도록 수정되었으나, 적절한 sandbox-extension infrastructure가 마련되기 전까지 third-party app에는 예외가 그대로 유지됩니다. -
[WebKit NetworkProcess] (sandbox bypass hardening)
442b80b— macOS에서 sandbox extension 없이 이루어지는 local file load를 차단할 수 있게 되었습니다. 손상된 WebContent가 보호된 파일에 접근하는 경로를 막기 위한 조치입니다. -
[JSC JIT] (exception confusion)
f9e6d8b— getByIdMegamorphic JIT operation에 throw scope가 추가되었습니다. 기존에는 이 scope가 없어 사용자 정의 getter에서 발생한 exception을 지나쳐 실행이 계속될 수 있었습니다. 그 결과 일관되지 않은 상태의 객체에 접근할 가능성이 있었습니다. -
[WebGPU Queue] (hardening)
81aff73— 1D texture write fast-path에 누락되어 있던 heightForMetal check가 추가되었습니다. 이를 통해 attacker가 제어하는 WebGPU command로 인해 Metal의 replaceRegion이 height 0인 dimension으로 호출되는 상황을 방지합니다. -
[bmalloc libpas] (OOB)
6cccd5e— attacker가 제어하는 allocation record로 인한 OOB read/write로부터 libpas MAR registry를 보호하도록 강화되었습니다. Frame count를 validate하고, 직접적인 array indexing 대신 bounds-checking accessor function을 사용하도록 변경되었습니다. -
[JSC bytecode] (OOB read)
449c42b— MultiWide record 이후 Extension ExpressionInfo를 emit할 때 발생하던 잘못된 offset 계산이 수정되었습니다. 잘못된 offset이 decoder에 전달되면 encoded-info buffer 내에서 out-of-bounds read가 발생할 수 있었습니다. Generator와 eval을 큰 padding과 함께 사용하면 web에서 도달 가능합니다. -
[WebKit UIProcess] (UAF)
8ec0222— WKMarketplaceKit의 completion handler가 main thread가 아닌 곳에서 addConsoleError()를 호출할 수 있었고, 이 경우 main-thread 전용 객체에 접근하면서 crash가 발생했습니다. 해당 호출을 ensureOnMainRunLoop()로 감싸 main thread로 다시 dispatch되도록 수정되었습니다. -
[JSC WASM IPInt] (Integer overflow)
b44e37c— m_pendingOffset이 int32_t sentinel 방식에서 std::optional로 변경되었습니다. 아울러 metadata offset 계산에 overflow check가 추가되었습니다. 이를 통해 WASM branch target delta를 손상시킬 수 있었던 integer overflow가 방지됩니다. -
[JSC watchpoint] (UAF)
c98a8ac— AdaptiveValuePropertyInlineCacheClearingWatchpoint에서 발생하던 UAF가 수정되었습니다. 누락되어 있던 isValid() override가 추가되어, fire()가 GC에 의해 collect된 CodeBlock owner를 dereference하는 상황을 방지합니다. -
[bmalloc libpas] (race condition)
82b692f— Medium-size directory lookup에서 발생하던 race condition이 수정되었습니다. Slow path가 heap-lock이 유지되고 있다고 잘못 가정하고 있었습니다. 그 결과 동시에 실행되는 thread가 요청한 크기보다 작은 allocation을 받을 수 있었고, 실제 slot 크기를 넘어서 write하면 heap corruption으로 이어질 수 있었습니다. -
[JSC WASM] (validator bypass)
0f0de8f— WASM streaming compiler가 legacy exception handling과 spec-compliant exception handling을 혼합한 module을 거부하도록 수정되었습니다. Streaming compilation 경로와 non-streaming compilation 경로 사이의 일관성이 확보됩니다. -
[WebKit GPUProcess / graphics] (dangling reference)
b63b114— prepareBufferForDisplay가 진행 중인 상태에서 도착하는 DynamicContentScalingDisplayList IPC는 이제 MESSAGE_CHECK를 통해 거부됩니다. 사용 중인 graphics context가 파괴되면서 dangling reference가 발생하는 상황을 방지합니다. -
[ANGLE Transform Feedback] (validator bypass)
bec77c5— ResumeTransformFeedback에는 active program이 transform feedback object의 program과 일치하는지 확인하는 validation이 없었습니다. 그 결과 WebGL을 통해 spec을 벗어난 상태가 만들어질 수 있었습니다. 이 precondition을 강제하는 validation이 추가되었습니다. -
[WebKit IPC] (Race condition)
267fa38— callback에 대한 data race가 수정되었습니다. sendMessageImpl()이 lock 밖에서 callback을 읽고 호출하는 동안, invalidate()는 동기화 없이 이를 clear하고 있었습니다. Box<>로 감싸 lock 하에서 안전하게 복사할 수 있도록 변경되었습니다. -
[JSC Repatch] (race condition)
140ce5b— 세 개의 IC repatch slow-path function에 ConcurrentJSLocker guard가 추가되었습니다. Megamorphic에서 generic으로 전환되는 과정에서 GC와 concurrent JIT 사이에 발생하던 data race가 해결됩니다. -
[WebCore graphics ANGLE] (hardening)
ce030f7— PixelStorei가 ANGLE backend에서 input parameter를 validate하도록 변경되었습니다. UNPACK_* 계열 설정만 허용하며, 그 외 값은 InvalidOperation error로 거부됩니다. -
[WebCore Filters] (Information disclosure)
d3cffdd— FEGaussianBlur의 임시 buffer에서 발생하던 초기화되지 않은 heap memory 문제가 수정되었습니다. Alpha-only image를 asymmetric blur radius로 처리할 때, SVG filter와 canvas getImageData()를 통해 heap 내용이 노출될 수 있었습니다. -
[WebCore JS bindings] (sentinel escape)
6ea1f0a— Promise-pair operation에서 IDL argument 변환이 실패하면 empty JSValue sentinel이 JavaScript로 유출될 수 있었습니다. 악의적인 toString()을 사용한 navigation.navigate() 호출을 통해 attacker가 이를 유발할 수 있었습니다. 이 경우 두 번째 promise는 reject되지 않은 채로 남아 있었습니다. -
[WebGPU BindGroupLayout] (validator bypass)
aad3188— Bind group layout validation에서 발생하던 stale WeakPtr 비교 문제가 수정되었습니다. 이로 인해 explicit layout과 destroyed-auto layout이 호환되지 않음에도 pairing이 잘못 허용될 수 있었습니다. 그 결과 invalid한 GPU resource binding이 downstream execution까지 도달할 수 있었습니다. -
[ANGLE Metal renderer] (OOB read)
8d4c709— ANGLE Metal DrawElements pipeline 단계에서 발생하던 offset과 count 불일치가 수정되었습니다. Pool에서 할당된 intermediate buffer에 잘못된 offset이 적용되면 out-of-bounds read가 발생할 수 있었습니다. -
[JSC DFG] (type confusion)
0d6fe16— Spread operator에 대한 DFG abstract interpreter의 structure prediction에는 cellButterflyOnlyAtomStringsStructure가 누락되어 있었습니다. 이 불완전한 prediction은 JIT code 내 speculation guard를 약화시켜, 잘못된 type assumption으로 이어질 수 있었습니다. -
[WebCore filters] (uninitialized memory)
bb98ffd— Pixel buffer copy가 실패하는 경우 CSS filter effect를 통해 초기화되지 않은 heap 내용이 반환될 수 있었습니다. 이제 copy 결과를 validate하고, 실패 시 null을 반환하도록 수정되었습니다. -
[WebKit UIProcess WebsiteDataStore] (UAF)
e1084c3— App-bound domain 확인 과정에서 발생하던 use-after-free가 수정되었습니다. 비동기 lambda가 host와 protocol 문자열을 reference로 capture하고 있었습니다. 함수가 반환된 뒤 lambda가 비동기적으로 실행되면서, dangling reference에 접근하는 상황이 발생했습니다. -
[WebCore Storage Access] (gesture bypass)
d8576e6— requestStorageAccess()의 rejection handler에서 user gesture가 합성되던 문제가 수정되었습니다. 이로 인해 cross-site iframe이 실제 user interaction 없이도 gesture-gated API를 호출할 수 있었습니다. -
[JSC DFG] (Lifetime fix)
c3ca56b— DFGArgumentsEliminationPhase의 node scan range bug가 수정되었습니다. 여러 inline call frame에 걸쳐 loop 변수를 재사용하면서 node가 잘못된 range로 scan되고 있었습니다. 그 결과 사용 중인 heap-allocated argument가 잘못 제거될 수 있었습니다. -
[WebGPU] (validator bypass)
67b563b— importExternalTexture에서 발생하던 origin-clean validation 우회가 수정되었습니다. Cache hit이 발생하면 cross-origin check가 건너뛰어졌고, 그 결과 CORS 없이 cross-origin video data를 read할 수 있었습니다. -
[WebKit NetworkStorageManager] (hardening)
937bbd7— putOrAdd handler에 MESSAGE_CHECK가 추가되어, std::nullptr_t나 Invalid variant를 가진 IDBKeyData가 거부됩니다. 손상된 WebContent process가 malformed key를 전송했을 때 Network process가 crash하는 상황을 방지합니다. -
[WebCore EventRegion] (UAF)
eaa2b44— EventRegionContext::shrinkWrapInteractionRegions에서 발생하던 heap-use-after-free가 수정되었습니다. m_interactionRegions.insert()가 reallocation을 유발한 뒤에도 vector element에 대한 reference가 dangling 상태로 남아 있었습니다. 패치는 원래 index를 저장해두고, vector에서 다시 조회하는 방식으로 이를 해결합니다. -
[WebGPU BindGroup] (validator bypass)
57ae126— WebGPU bind group descriptor에서 중복된 binding entry를 거부하도록 변경되었습니다. 이전에는 중복 entry가 존재할 경우 setBindGroup의 dynamic-offset validation이 dispatch 시점에 적용되는 offset과 어긋날 수 있었고, 이로 인해 OOB GPU buffer access로 이어질 가능성이 있었습니다. -
[WebCore graphics / PathCG] (race condition)
95f9f59— PathCG::strokeContains()에서 global CGContextRef에 대한 동기화되지 않은 접근이 수정되었습니다. OffscreenCanvas worker에서 isPointInStroke()를 동시에 호출하는 경우 race가 발생해 공유된 graphics context 상태가 손상될 수 있었습니다. -
[WebCore async-clipboard] (SOP bypass)
73645ab— Cross-origin iframe이 postMessage를 통해 top-level page의 UserGestureToken을 전달받으면 clipboard SOP를 우회할 수 있었습니다. 그 결과 프롬프트 없이 clipboard를 읽거나 쓰는 동작이 가능했습니다. Global object에 대한 transient activation을 요구하도록 수정되었으며, transient activation은 cross-origin으로 전파되지 않습니다. -
[WebKit Extensions / Declarative Net Request] (UAF)
ea3fbf9— 안전하지 않은 static NSArray 초기화 대신 dispatch_once를 사용하도록 변경되어, declarativeNetRequest rule compilation 중 발생할 수 있는 concurrent access로부터 보호합니다. 이를 통해 UI Process에서의 use-after-free가 방지됩니다. -
[bmalloc libpas] (information disclosure)
dce31d0— MAR logging이 활성화된 상태에서는 zeroed allocator가 초기화되지 않은 heap memory를 반환했습니다. 그 결과 정리된 allocation 대신 이전 heap 내용이 그대로 노출되는 정보 노출 문제가 있었습니다. -
[ANGLE MSL compiler] (validator bypass)
6d057b7— ANGLE의 MSL compiler에서 nested loop의 initializer/expression과 처리되지 않은 expression 패턴에 대한 무한 루프 탐지가 누락되어 있던 문제가 수정되었습니다. 조작된 WebGL shader로 이 check를 우회할 수 있었고, 결과적으로 GPU hang이나 driver 수준의 문제로 이어질 수 있었습니다. -
[WebKit NetworkProcess IPC] (hardening)
a90c33d— CacheStorageRepresentation IPC endpoint가 AllowTestOnlyIPC 뒤로 제한되었습니다. 이전에는 production web content에서도 접근 가능했던 test 전용 NetworkProcess handler가 이번 변경으로 차단됩니다. -
[JSC / WasmGC] (hardening)
736ce62— WasmGC 객체에 private field와 method를 설치하는 동작이 금지되어, 고정된 layout invariant가 유지됩니다. 이는 V8, SpiderMonkey와 동일한 방향으로, type system의 무결성을 지키기 위한 조치입니다. -
[WebCore loader] (timing oracle)
d7c0b5a— Cross-origin parent가 same-document iframe을 navigate할 때 발생하는 synthetic load event에 delayed timer가 추가되었습니다. 이전에는 load event가 즉시 발생해 attacker가 이를 관찰함으로써 iframe URL을 추측할 수 있는 timing oracle이 존재했으나, 이번 변경으로 제거되었습니다. -
[WebKit NetworkProcess] (access restriction)
e66a3f3— Networking process의 sandbox 제한이 더 정교하게 다듬어졌습니다. Blocked-paths 목록의 범위가 상위 temp directory 전체에서 temp folder 자체로 좁혀져, sandbox 보호는 유지하면서도 정상적인 업로드가 가능해졌습니다. -
[WebKit NetworkSessionCocoa] (privacy bypass)
971435f— Cocoa 환경에서 mutableRequest가 nil인 경우 WebSocket 요청이 cookie partitioning policy 적용을 건너뛸 수 있었습니다. 이로 인해 opt-in partitioning이 적용된 상황에서도 partition되지 않은 cookie가 site 경계를 넘어 유출될 수 있었습니다. mutableRequest가 항상 초기화되도록 수정되었습니다. -
[WebCore FEMorphology filter] (off-by-one)
d97d1af— FEMorphology filter의 parallel job stitching 과정에서 off-by-one이 수정되었습니다. Destination y-offset을 전진시킬 때 이전 job의 height 대신 현재 job의 height를 사용하고 있었습니다. 이 버그로 인해 SVG filter rendering 중 scratch buffer의 행(row)이 destination pixel buffer의 잘못된 위치에 기록될 수 있었습니다. -
[bugs.webkit.org Commits] (Stored XSS)
f9eddca— Commits extension에서 escape되지 않은 채로 capture된 commit identifier가 link HTML에 그대로 삽입되어, stored XSS로 이어질 수 있었습니다. Capture된 group에 html_quote를 적용하고, regex matcher의 범위를 유효한 commit identifier로 좁히는 방식으로 수정되었습니다. -
[JSC Yarr] (O(N²) DoS)
0012e61— Yarr regex JIT의 code generation 용량이 16MB로 제한되었습니다. Non-greedy group이 반복되는 패턴에서 O(N²) 수준의 code emission이 발생해 DoS로 이어질 수 있었는데, 이제 한도를 넘으면 interpreter로 fallback합니다. -
[WebCore MediaSource mock] (hardening)
82a21e0— MockSampleBox의 timeScale과 duration이 signed에서 unsigned integer로 변경되었습니다. 이를 통해 음수 값으로 인한 잘못된 시간 계산을 방지합니다. -
[WKBackForwardList test]
a27bc97— Build fix입니다. Forged file:// URL이 back-forward list validation에서 거부되는지 검증하는 테스트에서, 잘못 삽입된 formatting 문자가 제거되었습니다. -
[WebCore animation] (unresolved-offset)
699f1ca— view-timeline-range 키워드를 가진 keyframe이 일반 scroll timeline을 사용하는 animation에 적용될 때 발생하던 crash가 수정되었습니다. 이제 AcceleratedEffect 생성 과정에서 computed offset이 정상적으로 resolve됩니다. -
[WebCore WebXR] (UAF)
1d46772— Cross-realm iframe의 WebXRSystem이 garbage collect된 이후 XRSession이 end()를 호출하면 WebXR에서 use-after-free가 발생했습니다. WeakPtr을 도입하고 null check를 추가하는 방식으로 수정되었습니다. -
[PrettyPatch] (XSS)
9bb8fdf— Binary image diff를 렌더링할 때 image URL을 HTML-escape하도록 수정되어, bugs.webkit.org에 악성 markup이 삽입되는 XSS가 방지됩니다. -
[WebCore animation] (hardening)
06319c3— Keyframe의 offset이 NaN인 경우 accelerated animation transform에서 발생하던 crash가 수정되었습니다. Computed되지 않은 offset으로 style resolution을 시도하지 않도록, 조기에 false를 반환하는 방식으로 처리됩니다.