
POC 곧 제공 예정
Google Chrome(버전 123 및 이전)에서 WebAssembly(WASM) 가비지 컬렉션 타입 처리에 영향을 미치는 치명적인 원격 코드 실행 취약점입니다. 이 버그는 타입 혼동을 유발하여 임의 메모리 읽기/쓰기 및 궁극적으로 코드 실행으로 이어질 수 있습니다.
이 취약점은 WASM의 등재귀적(isorecursive) 정규 타입 ID와 JavaScript-to-WASM 변환 함수에서 사용되는 wasm::HeapType / wasm::ValueType 표현 간의 혼동에서 비롯됩니다.
결정적으로, 정규 타입 ID는 kV8MaxWasmTypes에 전� 바인딩되지 않습니다. 호스트 메모리가 지원하는 한 계속 커질 수 있습니다.
ValueType 클래스는 힙 타입을 20비트 필드에 인코딩하지만, 정규 타입 ID는 이 한계를 초과할 수 있습니다. 다음과 같은 정규 타입 ID가
tn = t0 + 0x100000 * n
20비트로 잘리면 t0과 별칭이 생겨 타입 혼동 공격이 가능해집니다.
또한 kAny + 0x100000 * n(여기서 kAny = 1000005)과 일치하는 정규 타입 ID는 타입 검사를 우회하고 임의의 WASM 타입 혼동을 허용합니다.
어드바이저리는 익스플로잇을 세 단계로 설명합니다:
1,000,000개 이상의 타입을 가진 WASM 모듈을 제작하면 정규 타입 ID가 래핑되어 구조체 타입과 참조 타입 사이의 혼동이 가능해집니다. kAny와 별칭이 되도록 제작된 구조체 타입은 JS-to-WASM 타입 검사를 우회합니다.
ArrayBuffer 백업 저장소 필드를 수정함으로써 공격자는 임의 주소에 기록된 값이 메타데이터 주소가 되는 쓰기 작업을 얻습니다. 이는 SlotSpanMetadata 구조체를 활용하여 chrome.dll 주소를 유출하고 임의 메모리 쓰기를 달성합니다.
익스플로잇은 CodePointerTable을 하이재킹하고 실행을 ROP 체인으로 전환하여 셸코드 영역을 실행 가능하게 표시합니다.
PoC는 다음을 시연합니다:
kAny와 별칭이 되는 구조체 타입을 생성하여 JS-to-WASM 타입 검사 우회.이는 Manfred Paul이 발견하고 Pwn2Own Vancouver 2024에서 발표한 CVE-2024-2887의 변종입니다. 다른 벡터를 통해 유사한 타입 정규화 약점을 악용합니다.
Google Chrome 123 및 이전 버전.
Google Chrome 124에서 수정됨.
Seunghyun Lee (Xion, @0x10n), TyphoonPWN 2024 참가자.