[CoreIPC] [GPUP] off-main-thread ~RemoteAudioMediaStreamTrackRendererInternalUnitManagerUnit mutates unlocked AudioSession interruption-observer WeakHashSet
LayoutTests/fast/mediastream/delete-audio-unit.html
Source/WebCore/platform/mediastream/cocoa/AudioMediaStreamTrackRendererUnit.cpp
WebKit의 GPU process는 RemoteAudioMediaStreamTrackRendererInternalUnitManager를 호스팅합니다. 이 컴포넌트는 WebProcess를 대신해 audio rendering unit을 관리합니다. 각 unit은 real-time rendering thread에서 audio rendering callback을 실행하며, 생성·소멸·observer 등록 등 lifecycle 관련 작업은 반드시 main thread에서만 수행되어야 합니다. AudioSession은 interruption observer를 WeakHashSet으로 관리하는데, 이 구조는 thread-safe하지 않습니다.
이 commit은 thread-safety race를 수정합니다. 실행 중인 audio unit을 IPC를 통해 삭제하면 destructor가 rendering thread에서 실행될 수 있었고, 이로 인해 WeakHashSet이 보호 없이 변경되는 문제가 있었습니다.
IPC로 유발된 삭제 경로에서는 어느 thread가 마지막 reference를 해제할지 보장되지 않았습니다. rendering thread가 활성 상태인 경우, destructor와 AudioSession::removeObserver() 호출이 해당 thread에서 실행되면서 동시에 접근하는 main thread와 race condition이 발생했습니다.
수정은 unit이 해제되기 전에 반드시 중단되도록 보장합니다. 이를 통해 rendering thread가 마지막 reference를 보유하지 않도록 합니다. 아울러 새로운 internals API deleteAudioUnit()을 통해 테스트에서 race condition을 재현할 수 있게 되었습니다.
BEFORE (racy):
WebProcess GPUProcess main thread Rendering thread
│ │ │
├──IPC: deleteUnit────►│ │ ← unit still running
│ remove unit from map │
│ (main drops its ref) │
│ unit dtor fires here
│ ──► AudioSession::removeObserver()
│ [unlocked WeakHashSet write]
AFTER (fixed):
WebProcess GPUProcess main thread Rendering thread
│ │ │
├──IPC: deleteUnit────►│ │
│ unit->stop() │
│ (rendering thread releases ref) │
│ remove unit from map │
│ (last ref drops on main thread) │
│ unit dtor fires on main thread │
│ ──► AudioSession::removeObserver() [safe]│
Significance
GPU process 내에서 web을 통해 도달 가능한 race condition입니다. 공격자가 제어하는 MediaStream으로 IPC timing을 조작하면 취약한 코드 경로를 유발할 수 있으며, 잘못된 thread에서 AudioSession observer map이 손상될 가능성이 있습니다.
Audit directions
이 수정은 ref-counting 규율에 의존합니다. unit을 중단하면 rendering thread가 IPC 측 해제보다 먼저 reference를 해제해야 합니다. stop() 호출이 rendering thread의 ref-drop에 대해 동기적으로 보장되는지, 아니면 여전히 race window가 남아있는지 확인해야 합니다.
동일한 ownership 패턴이 audio stack 내 다른 observer 등록 및 IPC 유발 lifecycle 변경에도 적용됩니다. AudioSession observer 등록·해제 호출 지점에서 유사한 off-thread destructor 경로가 있는지 점검하는 것이 유용합니다.
새로운 deleteAudioUnit() internals hook을 활용하면 fuzzing 과정에서 이 race condition을 더 안정적으로 재현할 수 있습니다.
포인터의 constant-folding을 방지합니다. WebAssembly.Memory.grow()가 vector를 재할당한 이후 stale 포인터로 out-of-bounds 쓰기가 가능합니다.
-
[WebKit UIProcess / WebFrameProxy] (type confusion)
15c722b— WebFrameProxy에서 잘못된 컨테이너의 end()를 비교하여 고아 frame이 감지를 회피하는 문제를 수정하였습니다. 손상된 WebContent가 cross-page frame을 UI process의 focused frame으로 주입하면, 순회 중 type confusion과 EXC_ARM_PAC_FAIL이 발생할 수 있었습니다. -
[WebCore CloseWatcher] (UAF)
ae9baa4— CloseWatcherManager가 마지막 Ref를 보유한 이후 AbortSignal lambda가 WeakPtr를 통해 실행될 때 CloseWatcher::destroy()에서 발생하는 use-after-free를 수정합니다. WeakPtr를 RefPtr로 변환하여 소멸 중에도 watcher가 유지되도록 하였습니다. -
[WebKit Process Model] (sandbox bypass)
e9f94fd— 12개 IPC handler에서 sender 소유권 검증이 누락되어, 손상된 WebContent가 sibling tab ID를 brute-force하여 cross-tab 보안 상태에 접근할 수 있었습니다. 각 handler에 MESSAGE_CHECK assertion을 추가하여 수정하였습니다. -
[WebCore AVFoundation] (race condition, UAF)
d4b40e1— flushAndRemoveImage @catch 경로에서 크로스 스레드 UAF를 수정하였습니다. background queue error handler가 thread-safe하지 않은 SampleBufferDisplayLayerClient의 WeakPtr를 역참조하는 동안 main 스레드에서 RemoteSampleBufferDisplayLayer가 해제될 수 있었습니다. -
[UIProcess RemoteScrollingTree] (UAF, race condition)
6a97574— 크로스 스레드 use-after-free를 수정하였습니다. m_progressBasedTimelineRegistry가 main 스레드에서 해제되는 동안 ScrollingThread가 동기화 없이 이를 읽는 문제입니다. scroll-driven animation 전환과 빠른 스크롤을 통해 발화할 수 있습니다. -
[WebCore MessagePort] (validator bypass)
899dd99— Network Process의 MessagePort 소유권 검증을 수정하였습니다. 손상된 WebContent가 위조된 ProcessIdentifier를 통해 다른 프로세스의 포트에 대한 close, entangle, disentangle 연산을 위조하는 것을 방지합니다. -
[WebKit RemoteObjectRegistry] (authorization bypass)
972966a— 손상된 WebContent process가 동일 pool 내 무관한 WebPageProxy의 _WKRemoteObjectRegistry에 IPC 메시지를 전송하는 것을 방지합니다. 이를 허용하면 다른 페이지가 등록한 객체에 대해 임의 Objective-C 메서드 호출이 가능합니다. -
[WebGPU] (validator bypass)
97e8c4b— PipelineLayout::makeInvalid()가 vector를 초기화하면서 std::optional을 engaged 상태로 두어 검증이 건너뛰어지는 문제를 수정하였습니다. 오염된 layout이 호환되지 않는 argument buffer와 함께 Metal dispatch에 도달하여 GPU out-of-bounds 접근이 발생합니다. getBindGroupLayout(index)를 통해 도달 가능합니다. -
[WebKit IPC] (sandbox bypass)
7e6fba5— FormDataReference에서 빈 sandbox extension handle을 허용하던 IPC validator를 수정하였습니다. 검증 로직을 생성자로 이동하여 Cocoa 플랫폼에서 조작된 IPC 메시지를 통한 sandbox escape를 방지합니다. -
[WebCore XSLT] (UAF)
a8459d4— 컴파일 실패 시 libxslt가 import된 stylesheet를 해제하여 dangling m_stylesheetDoc 포인터가 남는 heap UAF 문제입니다. 다단계 XSL import chain에서 지연된 subresource는 parseString()에서 use-after-free를 발화시킵니다. XML 처리 지시어를 통해 도달 가능합니다. -
[WebCore FocusController] (UAF)
87fedd8— blur event handler가 document를 제거하면 focus element 탐색 중 dangling pointer가 남는 focus traversal의 use-after-free를 수정하였습니다. FocusController에 smart pointer를 적용하여 해결하였습니다. -
[WebKit NetworkProcess IDB blob validation] (validator bypass)
5be1236— blob 경로 검증을 디렉토리 수준에서 파일별 권한으로 강화하였습니다. WebContent가 다른 origin의 IDB storage를 가리키는 file-backed blob을 등록하는 것을 방지하여 cross-origin 데이터 탈취를 차단합니다. -
[WebCore mediastream] (UAF)
a14d1c0— RTCPeerConnection garbage collection 이후 setCodecPreferences()를 통해 도달 가능한 RtpTransceiver codec 상태의 use-after-free를 수정하였습니다. 연결이 닫힌 경우 no-op guard를 추가하였습니다. -
[WebCore TextTrack] (data race, UAF)
e379531— GC 스레드가 TextTrackCue::m_track을 읽는 동안 main 스레드가 이를 null로 설정하는 data race로 인해 use-after-free가 발생합니다. CheckedPtr를 적용하고 동기화 잠금을 추가하여 수정하였습니다. HTML media TextTrack API를 통해 웹에서 도달 가능합니다. -
[WebKit Extensions / SQLiteStore] (race condition, UAF)
abe6e82— Web Extensions SQLiteStore에서 weak-null 조기 반환 경로가 main 스레드 대신 background WorkQueue에서 completion handler를 호출하여, extension 재로드 중 동시 HashMap 변경으로 인한 heap use-after-free를 수정하였습니다. 세 store 서브클래스의 영향받는 경로에서 handler를 main 스레드로 dispatch하도록 변경하였습니다. -
[WebExtension SQLite stores] (race condition, UAF)
6d6ea48— WorkQueue lambda에 캡처된 JSON::Object Ref가 main 스레드와 worker 스레드에서 동시에 refcount 업데이트되어 조기 해제 및 heap-use-after-free가 발생하는 WebExtension SQLite store의 race condition을 수정하였습니다. -
[WebGPU Device] (uint32 wraparound, OOB read)
0077500— index buffer clamping에서 saturating addition을 사용하여 uint32 wraparound를 수정하였습니다. 공격자가 제어하는 인덱스를 통한 bounds check 우회 및 GPU out-of-bounds 읽기를 방지합니다. -
[WebGPU RemoteBuffer] (race condition)
ce589a4— IPC를 통해 m_bufferMapCount가 음수가 되는 상태 혼란을 방지하였습니다. 이 경우 getMappedRange()가 일관성 없는 buffer 상태로 진행되어 공격자 메모리에 대한 동시 GPU 쓰기가 가능했습니다. -
[WebKit NetworkProcess] (sandbox bypass)
ec611da— 이후 로컬 파일 로드(예: HTTP redirect를 file://로)에서 sandbox extension 확인을 건너뛰는 우회를 수정하였습니다. 이제 로드 순서에 관계없이 모든 file:// 요청이 검증됩니다. -
[JSC WasmGC] (validator bypass)
5df8b0b— br_on_cast 플래그의 reserved bit 검증을 추가하였습니다. 이전에는 validator가 잘못 해석된 플래그 바이트를 통해 null이 non-null type check를 통과하도록 허용했습니다. -
[WebKit NetworkProcess] (sandbox bypass)
022bc68— Network process가 보호된 시스템 디렉토리에 대한 form 업로드를 위한 sandbox extension을 생성하지 못하도록 방지합니다. 손상된 renderer가 Network process를 속여 민감한 경로에 대한 읽기 권한을 스스로 부여하는 것을 차단합니다. -
[WebCore web-locks] (UAF)
7a5ee54— WebLockManager::query()의 completion handler가 캡처한 worker 스레드 DeferredPromise가 handler 호출 없이 종료될 때 main 스레드에서 소멸되어 발생하는 크로스 스레드 use-after-free를 수정합니다. -
[JSC DFG] (type confusion)
d75a9fd— 런타임에 전환 없이 프로퍼티를 추가하는 dictionary 구조에 대해 DFG가 property absence를 캐시하여 발생하는 type confusion을 수정하였습니다. stale cache로 인한 잘못된 type 가정을 방지합니다. -
[WebKit NetworkProcess] (IPC validation bypass)
c5fabb4— 손상된 WebContent process가 shouldRestrictHTTPResponseAccess를 false로 설정하여 응답 헤더 sanitization(Set-Cookie 제거, cross-origin 필터링)을 우회할 수 있는 미검증 IPC 필드를 제거하였습니다. -
[JSC Structure] (Proxy invariant bypass)
336c35e— SlowPutArrayStorage 구조의 stale HasNonConfigurableProperties 비트를 수정하였습니다. Proxy handler가 invariant check를 우회하여 non-configurable 배열 프로퍼티에 대해 잘못된 값을 반환하는 것을 방지합니다. -
[JSC FTL] (UAF)
a2de66f— GC 가능한 vmCall 이후까지 Array.indexOf/includes 컴파일에서 ensureStillAliveHere(base)를 지연하도록 수정하였습니다. 연산 도중 base 배열이 수집될 수 있는 잠재적 UAF를 수정합니다. -
[WebCore XMLDocumentParser] (UAF)
ba3be26— custom element 생성자가 파싱 도중 요소를 re-parent하거나 adopt하여 parserAppendChild 불변식을 위반하는 XML parser의 use-after-free를 수정하였습니다. reaction stack이 소진된 이후 재확인을 추가하여 요소가 여러 child list에 연결되는 것을 방지합니다. -
[WebCore MediaSession] (UAF)
d6fb60c— MediaMetadata artwork loader callback에서 ArtworkImageLoader가 교체된 이후 객체보다 오래 살아남을 수 있는 raw this 포인터를 lambda가 캡처하는 use-after-free를 수정하였습니다. WeakPtr 캡처와 null 체크를 적용하여 crash를 방지합니다. -
[WebKit Blob registration] (Sandbox bypass)
a18c0a8— blob 등록에서 replacementPath 검증을 강화하여 임의 파일 삭제를 방지합니다. 손상된 web process가 extension handle을 생략하여 sandbox 확인을 우회한 뒤 나중에 FileSystem::deleteFile()을 발화시킬 수 있었습니다. 이제 해당 경로에 유효한 sandbox extension이 필요합니다. -
[WebCore graphics / PixelBuffer] (information disclosure)
0f85710— GetPixelBuffer의 초기화되지 않은 heap disclosure를 수정합니다. non-RGB 색공간 변환이 실패하면 stale heap 바이트가 호출자에게 반환될 수 있었습니다. RGB 색공간 검증과 오류 시 zero-fill을 추가하였습니다. -
[WebKit UIProcess / back/forward list] (sandbox bypass)
9d4788b— back/forward 탐색 검증을 프로세스 전역에서 프로세스별 기준으로 변경하였습니다. 손상된 WebContent process가 IPC 메시지에서 file:// URL을 위조하여 무단으로 파일 시스템에 접근하는 것을 방지합니다. -
[JSC TypedArray] (OOB read)
7a9d149— map callback이 소스 ArrayBuffer를 리사이즈하거나 분리할 때 루프가 새 경계를 넘어 진행하여 발생하는 TypedArray.from()의 out-of-bounds 읽기를 수정합니다. -
[WebKit IndexedDB] (validator bypass)
e2b88c2— 활성 version change 연산 중에 도착하는 IndexedDB 트랜잭션을 거부합니다. 손상된 WebContent process가 위조된 IPC 메시지를 통해 클라이언트 측 검증을 우회하는 것을 방지합니다. -
[JSC WASM JIT] (UAF)
20d1bae— WASM re-tier 경로에서 callsite 재패칭 중에 OMGOSREntryCallee를 무조건 유지하여 UAF를 수정합니다. 새로운 BBQCallee가 교체될 때 패칭 중에 stale weak reference가 동시에 해제될 수 있었습니다. -
[WebGPU RenderPassEncoder] (OOB read)
543f99d— baseVertex 검증에서 부호 있는 음수 오버플로우를 수정하였습니다. INT32_MIN이 자기 자신으로 wrap되어 bounds checking을 우회하고 OOB vertex buffer 읽기가 가능했습니다. baseVertex를 int64_t로 확장한 뒤 음수 처리하도록 수정하였습니다. -
[JSC Yarr JIT] (OOB read)
bd5f1e5— negativeOffsetIndexedAddress에서 원래 값 대신 조정된 base register를 사용하도록 수정하였습니다. 조작된 Unicode 문자열을 통해 regex pattern matching에서 발생하는 out-of-bounds 읽기를 제거합니다. -
[WebCore mediastream] (race condition UAF)
e7f7480— clone()과 pixelBuffer() 사이에서 VideoFrameLibWebRTC::m_conversionCallback에 대한 data race로 인한 use-after-free를 수정하였습니다. 잠금 획득과 스레드 어노테이션을 추가하여 callback 접근을 동기화하고, WebCodecs API를 통해 해제된 callback이 역참조되는 것을 방지합니다. -
[JSC WebAssembly] (UAF)
a012bab— WebAssembly.Memory.toResizableBuffer() 호출과 GC 압박이 맞물릴 때, wasm에서 생성된 ArrayBuffer가 리사이즈 연산 도중 아직 사용 중인 상태에서 GC가 WebAssembly.Memory를 수집하는 use-after-free를 수정하였습니다. -
[WebCore Background Fetch] (UAF)
bbd73ca— background fetch progress event 처리에서 heap use-after-free를 수정하였습니다. document 반복 중에 동기 이벤트가 발화되면 handler가 iterator를 무효화할 수 있었습니다. 이제 이벤트는 반복이 완료된 이후 큐에 넣어 발화하도록 변경하였습니다. -
[WebCore video frames] (heap disclosure)
7c03dc5— bytesPerRow=0으로 설정된 SharedVideoFrameInfo IPC를 처리할 때 CVPixelBuffer 패딩을 통해 GPU heap 메모리가 노출되는 문제를 수정하였습니다. 미사용 버퍼 영역을 zero로 채워 수정합니다. -
[WebCore SharedVideoFrameInfo] (Heap disclosure)
5d977a0— WebProcess가 bytesPerRow=0으로 IPC 메시지를 조작하면 초기화되지 않은 CVPixelBuffer 데이터가 할당되어 GPU process heap 메모리가 유출됩니다. 할당된 버퍼를 memset하여 disclosure를 방지합니다. -
[WebCore animations] (UAF)
5c9eba9— AnimationTimelinesController::suspendAnimations에서 applyPendingAcceleratedAnimations가 레이아웃을 발화시킬 때 반복 중 m_timelines HashSet이 변경되어 발생하는 use-after-free를 수정하였습니다. scroll-timeline 및 view-timeline CSS 프로퍼티를 통해 웹에서 도달 가능합니다. -
[WebCore AVFoundation CDM] (race condition)
e5439f4— 잠금 없이 m_sessions Vector를 변경하는 main 스레드의 createSession()과 오프-main-스레드 destructor 간의 race로 heap 손상이 발생하였습니다. 소멸을 main 스레드로 고정하여 수정하였습니다. -
[WebCore MIME type cache] (race condition)
576ee4a— 보호되지 않은 컬렉션에 대한 동시 접근을 통해 MIME type 검증에서 use-after-free가 발생하는 data race를 수정하였습니다. 웹에서 도달 가능한 media element type checking에 영향을 미칩니다. -
[WebKit Network process] (sandbox bypass)
74d0c62— Network process가 sandbox extension 없이 JS fetch()를 통한 임시 디렉토리 파일 읽기를 허용하는 웹에서 도달 가능한 sandbox bypass입니다. MobileSafari에 대해 제한하도록 수정하였으나, 서드파티 앱은 적절한 sandbox-extension 인프라가 갖춰질 때까지 적용 예외입니다. -
[WebKit NetworkProcess] (sandbox bypass hardening)
442b80b— macOS에서 sandbox extension 없이 로컬 파일 로드를 차단하도록 활성화하였습니다. 손상된 WebContent가 보호된 파일에 접근하는 것을 방지합니다. -
[JSC JIT] (exception confusion)
f9e6d8b— getByIdMegamorphic JIT 연산에 throw scope를 추가하였습니다. 누락된 scope로 인해 사용자 정의 getter의 exception 이후에도 실행이 계속되어, 일관성 없는 상태의 객체에 접근하는 것이 가능했습니다. -
[WebGPU Queue] (hardening)
81aff73— 1D texture write fast-path에 누락된 heightForMetal 체크를 추가하였습니다. 공격자가 제어하는 WebGPU 명령으로 zero height로 Metal replaceRegion이 호출되는 것을 방지합니다. -
[bmalloc libpas] (OOB)
6cccd5e— 공격자가 제어하는 allocation 레코드를 통한 OOB read/write에 대비하여 libpas MAR registry를 강화하였습니다. frame count를 검증하고 직접 배열 인덱싱 대신 bounds-checking accessor 함수를 사용합니다. -
[JSC bytecode] (OOB read)
449c42b— MultiWide 레코드 이후 Extension ExpressionInfo를 emit할 때의 잘못된 offset 계산을 수정합니다. 잘못된 offset이 decoder에 전달되어 encoded-info 버퍼 내에서 out-of-bounds 읽기가 발생합니다. 대용량 padding을 가진 generator + eval을 통해 웹에서 도달 가능합니다. -
[WebKit UIProcess] (UAF)
8ec0222— WKMarketplaceKit completion handler가 non-main 스레드에서 addConsoleError()를 호출하여 main 스레드 전용 객체 접근 시 crash가 발생하였습니다. ensureOnMainRunLoop()로 호출을 감싸 main 스레드로 dispatch하도록 수정하였습니다. -
[JSC WASM IPInt] (Integer overflow)
b44e37c— m_pendingOffset를 int32_t sentinel에서 std::optional로 변경하고 metadata offset 계산에 overflow 체크를 추가하였습니다. WASM branch target delta를 손상시킬 수 있는 integer overflow를 방지합니다. -
[JSC watchpoint] (UAF)
c98a8ac— isValid() override를 추가하여 AdaptiveValuePropertyInlineCacheClearingWatchpoint의 fire()가 GC에 의해 수집된 CodeBlock owner를 역참조하는 UAF를 수정하였습니다. -
[bmalloc libpas] (race condition)
82b692f— medium-size 디렉토리 조회에서 slow path가 heap-lock이 획득된 상태라고 잘못 가정하는 race condition을 수정하였습니다. 동시 스레드가 요청보다 작은 크기의 allocation을 받아 실제 슬롯 크기를 넘어 쓰기를 수행하면 heap 손상이 발생합니다. -
[JSC WASM] (validator bypass)
0f0de8f— WASM streaming compiler가 legacy와 spec-compliant exception handling을 혼합한 모듈을 거부하도록 수정하였습니다. streaming과 non-streaming 컴파일 경로 간의 일관성을 보장합니다. -
[WebKit GPUProcess / graphics] (dangling reference)
b63b114— prepareBufferForDisplay가 활성 상태일 때 MESSAGE_CHECK를 통해 DynamicContentScalingDisplayList IPC를 거부합니다. 사용 중인 graphics context의 소멸과 그로 인한 dangling reference를 방지합니다. -
[ANGLE Transform Feedback] (validator bypass)
bec77c5— ResumeTransformFeedback에서 활성 program이 transform feedback 객체의 program과 일치하는지 검증이 누락되어 WebGL을 통해 out-of-spec 상태가 가능했습니다. 이 전제 조건을 강제하는 검증을 추가하였습니다. -
[WebKit IPC] (Race condition)
267fa38— sendMessageImpl()이 잠금 외부에서 callback을 읽고 호출하는 동안 invalidate()가 동기화 없이 이를 초기화하는 data race를 수정하였습니다. 잠금 하에서 안전하게 복사할 수 있도록 Box<>로 감쌌습니다. -
[JSC Repatch] (race condition)
140ce5b— megamorphic→generic 전환 중 GC와 동시 JIT 사이의 data race를 수정하기 위해 세 IC repatch slow-path 함수에 ConcurrentJSLocker guard를 추가하였습니다. -
[WebCore graphics ANGLE] (hardening)
ce030f7— ANGLE backend의 PixelStorei가 이제 입력 파라미터를 검증하여 UNPACK_* 설정만 허용하고 그 외는 InvalidOperation 오류로 거부합니다. -
[WebCore Filters] (Information disclosure)
d3cffdd— 비대칭 blur 반경으로 alpha-only 이미지를 처리할 때 FEGaussianBlur의 임시 버퍼에 초기화되지 않은 heap 메모리가 포함되는 문제를 수정하였습니다. SVG filter와 canvas getImageData()를 통해 heap 내용이 노출될 수 있었습니다. -
[WebCore JS bindings] (sentinel escape)
6ea1f0a— promise-pair 연산에서 IDL 인자 변환이 실패하면 빈 JSValue sentinel이 JavaScript로 유출됩니다. 악성 toString()을 가진 navigation.navigate() 호출을 통해 공격자가 이를 발화시킬 수 있었으며, 두 번째 promise는 rejected되지 않은 상태로 남았습니다. -
[WebGPU BindGroupLayout] (validator bypass)
aad3188— bind group layout 검증에서 stale WeakPtr 비교가 호환되지 않는 explicit/destroyed-auto layout 조합을 잘못 허용하여, 잘못된 GPU 리소스 바인딩이 하위 실행에 도달하는 문제를 수정하였습니다. -
[ANGLE Metal renderer] (OOB read)
8d4c709— ANGLE Metal DrawElements pipeline 단계에서 offset과 count 불일치가 pool-allocated 중간 버퍼에 잘못된 offset이 적용될 때 out-of-bounds 읽기를 유발하는 문제를 수정하였습니다. -
[JSC DFG] (type confusion)
0d6fe16— spread operator에 대한 DFG abstract interpreter의 structure 예측이 cellButterflyOnlyAtomStringsStructure를 누락하는 문제를 수정합니다. 불완전한 예측은 JIT 코드의 speculation guard를 약화시켜 잘못된 type 가정을 허용할 수 있었습니다. -
[WebCore filters] (uninitialized memory)
bb98ffd— CSS filter effect를 통해 pixel buffer 복사 실패 시 초기화되지 않은 heap 내용이 반환되는 문제를 수정합니다. 복사를 검증하고 실패 시 null을 반환하도록 변경하였습니다. -
[WebKit UIProcess WebsiteDataStore] (UAF)
e1084c3— 비동기 lambda가 host와 protocol 문자열을 참조로 캡처하여, 함수 반환 이후 비동기적으로 발화하면 dangling reference에 접근하는 use-after-free를 수정하였습니다. -
[WebCore Storage Access] (gesture bypass)
d8576e6— requestStorageAccess() rejection handler의 합성된 user gesture를 수정하였습니다. cross-site iframe이 사용자 상호작용 없이 gesture-gated API를 호출하는 것이 가능했습니다. -
[JSC DFG] (Lifetime fix)
c3ca56b— DFGArgumentsEliminationPhase에서 여러 inline call frame에 걸쳐 루프 변수를 재사용하여 노드가 잘못된 범위에서 스캔되는 버그를 수정하였습니다. 이로 인해 사용 중인 heap-allocated arguments가 잘못 제거될 수 있었습니다. -
[WebGPU] (validator bypass)
67b563b— importExternalTexture에서 cache hit가 cross-origin 체크를 건너뛰어 CORS 없이 cross-origin 비디오 데이터를 읽을 수 있는 origin-clean 검증 우회를 수정하였습니다. -
[WebKit NetworkStorageManager] (hardening)
937bbd7— putOrAdd handler에 MESSAGE_CHECK를 추가하여 std::nullptr_t 또는 Invalid variant를 가진 IDBKeyData를 거부합니다. 손상된 WebContent process가 잘못된 형식의 key를 전송할 때 Network process crash를 방지합니다. -
[WebCore EventRegion] (UAF)
eaa2b44— EventRegionContext::shrinkWrapInteractionRegions에서 m_interactionRegions.insert()가 재할당을 발화한 이후 vector 요소에 대한 참조가 dangling 상태가 되는 heap-use-after-free를 수정하였습니다. 원래 인덱스를 저장하고 vector에서 다시 조회하는 방식으로 수정하였습니다. -
[WebGPU BindGroup] (validator bypass)
57ae126— WebGPU bind group descriptor의 중복 binding 항목을 거부합니다. 중복 항목은 이전에 setBindGroup의 dynamic-offset 검증이 dispatch 시 적용된 offset과 달라지게 하여 OOB GPU 버퍼 접근을 가능하게 했습니다. -
[WebCore graphics / PathCG] (race condition)
95f9f59— PathCG::strokeContains()의 전역 CGContextRef에 대한 비동기화 접근을 수정하였습니다. isPointInStroke()에 대한 동시 OffscreenCanvas worker 호출이 공유 graphics context 상태를 race하며 손상시킬 수 있었습니다. -
[WebCore async-clipboard] (SOP bypass)
73645ab— cross-origin iframe이 postMessage를 통해 최상위 페이지의 UserGestureToken을 수신하여 clipboard SOP를 우회하고 프롬프트 없이 read/write가 가능했습니다. cross-origin으로 전파되지 않는 global object의 transient activation을 요구하도록 수정하였습니다. -
[WebKit Extensions / Declarative Net Request] (UAF)
ea3fbf9— 안전하지 않은 static NSArray 초기화를 dispatch_once로 교체하여 declarativeNetRequest 규칙 컴파일 중 동시 접근을 방지합니다. UI Process에서의 use-after-free를 방지합니다. -
[bmalloc libpas] (information disclosure)
dce31d0— MAR 로깅이 활성화된 상태에서 zeroed allocator가 초기화되지 않은 heap 메모리를 반환하여 해제된 할당 내용 대신 stale heap 내용이 노출되었습니다. -
[ANGLE MSL compiler] (validator bypass)
6d057b7— ANGLE MSL compiler에서 중첩된 loop initializer/expression과 처리되지 않은 expression 패턴에 대한 무한 루프 감지가 누락된 문제를 수정하였습니다. 조작된 WebGL shader로 이 체크를 우회하면 GPU hang 또는 드라이버 수준의 문제가 발생할 수 있습니다. -
[WebKit NetworkProcess IPC] (hardening)
a90c33d— CacheStorageRepresentation IPC endpoint를 AllowTestOnlyIPC 뒤에 배치하였습니다. 이전에 프로덕션 web content에서 접근 가능했던 test-only NetworkProcess handler를 차단합니다. -
[JSC / WasmGC] (hardening)
736ce62— WasmGC 객체에 private field와 메서드 설치를 금지하여 고정 레이아웃 불변식을 보존합니다. V8 및 SpiderMonkey와 동일한 방식으로 type system 무결성을 유지합니다. -
[WebCore loader] (timing oracle)
d7c0b5a— cross-origin parent가 same-document iframe을 탐색할 때 합성 load event에 지연 타이머를 추가하였습니다. 즉각적인 load event 관찰을 통해 공격자가 iframe URL을 추측할 수 있는 timing oracle을 제거합니다. -
[WebKit NetworkProcess] (access restriction)
e66a3f3— Networking process sandbox 제한을 세분화하였습니다. 차단 경로 목록을 상위 임시 디렉토리에서 temp 폴더만으로 변경하여, sandbox 보호를 유지하면서 정상적인 업로드는 허용합니다. -
[WebKit NetworkSessionCocoa] (privacy bypass)
971435f— Cocoa의 WebSocket 요청에서 mutableRequest가 nil일 때 쿠키 partitioning 정책 적용을 건너뛰어, opt-in partitioning 하에서 사이트 경계를 넘어 비분할 쿠키가 유출될 수 있었습니다. mutableRequest가 항상 초기화되도록 수정하였습니다. -
[WebCore FEMorphology filter] (off-by-one)
d97d1af— FEMorphology filter의 병렬 job 스티칭에서 off-by-one을 수정하였습니다. 이전 job의 height 대신 현재 job의 height를 사용하여 대상 y-offset을 진행시켜, SVG filter 렌더링 중 scratch buffer 행이 대상 pixel buffer의 잘못된 위치에 기록되었습니다. -
[bugs.webkit.org Commits] (Stored XSS)
f9eddca— Commits extension에서 캡처된 commit 식별자가 이스케이프 없이 링크 HTML에 삽입되어 stored XSS가 가능했습니다. 캡처 그룹에 html_quote를 적용하고 regex 매처를 유효한 commit 식별자만 허용하도록 좁혀 수정하였습니다. -
[JSC Yarr] (O(N²) DoS)
0012e61— 반복되는 non-greedy 그룹 패턴으로 인한 O(N²) 코드 방출을 통한 DoS를 방지하기 위해 Yarr regex JIT 코드 생성을 16 MB로 제한합니다. 한계 초과 시 interpreter로 fallback합니다. -
[WebCore MediaSource mock] (hardening)
82a21e0— MockSampleBox의 timeScale과 duration을 부호 있는 정수에서 부호 없는 정수로 변경하였습니다. 음수 값으로 인한 잘못된 시간 계산을 방지합니다. -
[WKBackForwardList test]
a27bc97— 빌드 수정: back-forward list 검증에서 위조된 file:// URL이 거부되는지 확인하는 테스트에서 잘못된 서식 문자를 제거하였습니다. -
[WebCore animation] (unresolved-offset)
699f1ca— view-timeline-range 키워드를 가진 keyframe이 일반 scroll timeline을 사용하는 animation에 적용될 때 발생하는 crash를 수정하였습니다. AcceleratedEffect 생성 중 computed offset을 올바르게 계산하도록 수정하였습니다. -
[WebCore WebXR] (UAF)
1d46772— XRSession이 cross-realm iframe의 WebXRSystem이 garbage collection된 이후 end()를 호출할 때 발생하는 WebXR의 use-after-free를 수정합니다. WeakPtr 적용과 null 체크를 추가하였습니다. -
[PrettyPatch] (XSS)
9bb8fdf— binary image diff 렌더링에서 이미지 URL을 HTML 이스케이프하여 XSS를 수정하였습니다. bugs.webkit.org에 악성 마크업이 삽입되는 것을 방지합니다. -
[WebCore animation] (hardening)
06319c3— keyframe의 offset이 NaN일 때 accelerated animation transform에서 발생하는 crash를 수정하였습니다. 미계산 offset으로 style resolution을 시도하지 않도록 조기 반환합니다.