← All reports
8 picks from 557 commits
2026-06-27 – 07-03

This Week in WebKit — August 17-23, 2026

557건
전체 commit 수
145건
보안 수정 건수
High 5건, Medium 1건 심층 분석; 나머지는 appendix에서 triage
109명
기여자 수
Top components WebCore · WebKit · JSC · Other · Platform

Featured

Security fixes

Notable development

Other security-relevant changes

  • [WebKit UIProcess / WebPageProxy] (sandbox bypass) 248f89aWebPageProxy::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) 87d2036ReadableStream.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) efe4920history.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) 629adf4AsyncFileStream::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 — WebXR XRSessionInit에서 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) 8fd92b1Array.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) b48b4d4encode()가 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) 2f91fd7BiquadFilterNode::setType()에서 graphLock()을 잡도록 추가해, audio thread의 kernel 재할당과의 race를 방지합니다. main thread가 m_kernels Vector에서 해제된 kernel pointer를 로드해 파괴된 BiquadDSPKernel로 virtual dispatch가 발생할 수 있던 UAF를 막습니다.

  • [WebKit NetworkProcess / loadPing] (validator bypass) 6aa96bcloadPing()에 MESSAGE_CHECK가 추가되어 firstPartyForCookies를 검증합니다. compromised web process가 cross-origin URL을 위조해 관련 없는 origin의 cookie를 탈취하는 상황을 방지합니다.

  • [WebCore SVG] (UAF) a93904bgetPointAtLength()에서 caching된 raw renderer pointer가, 중첩된 getTotalLength()updateLayoutIgnorePendingStylesheets()를 유발하면서 stale해져 renderer 객체에 대한 UAF를 일으켰습니다. cache를 제거하고 renderer 접근을 사용 직전으로 지연시켜 수정했습니다.

  • [WebKit ITP] (IPC validator bypass) 5044a54ResourceLoadStatisticsUpdated, LogUserInteraction, RequestStorageAccessUnderOpener IPC 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) e147963WebCodecsAudioData::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를 반환하는 방식으로 처리됩니다.