Firefox의 SpiderMonkey 엔진 내 Wasm 컴포넌트에서 단일 오타로 인한 RCE(Remote Code Execution) 취약점이 발견됨
Wasm GC 배열 메타데이터(Wasm GC array metadata) 처리 과정에서 `&` 연산자를 `|`로 잘못 사용한 것이 원인
취약점은 UAF(Use-After-Free)로 이어졌으며, 힙 스프레이(Heap Spray) 기법을 통해 임의의 메모리 읽기/쓰기(Arbitrary Read/Write) 권한 획득
최종적으로 ASLR(Address Space Layout Randomization) 우회 및 RCE 익스플로잇(Exploit) 성공, Mozilla에 보고 및 패치 완료
취약점은 SpiderMonkey의 Wasm 컴포넌트 내에서 Wasm GC 배열 메타데이터(Wasm GC array metadata)를 리팩토링하는 과정에서 발생했다. 구체적으로, `&` 연산자를 `|`로 잘못 사용한 단일 문자 오타로 인해 UAF(Use-After-Free) 취약점이 발생했다. 이는 OOL(Out-of-line) 배열을 IL(Inline) 배열로 잘못 인식하게 만들었고, GC 과정에서 메모리 접근 오류를 유발했다.
오류는 `WasmArrayObject::obj_moved()` 함수 내에서 발생하며, GC가 Wasm 배열을 이동시킬 때 호출된다. 포워딩 포인터(Forwarding Pointer)를 설정하는 과정에서 오타로 인해 포인터의 LSB가 제대로 설정되지 않아, isDataInline() 함수가 OOL 배열을 IL 배열로 잘못 판단하게 된다. 그 결과, Ion 컴파일러(JIT compiler)가 해제된 메모리에 접근하여 UAF가 발생한다.
익스플로잇은 UAF 취약점을 활용하여 임의의 메모리 읽기/쓰기(Arbitrary Read/Write) 권한을 획득하는 방식으로 진행되었다. 힙 스프레이(Heap Spray)를 통해 해제된 메모리 영역을 특정 값으로 채우고, 이를 통해 ASLR(Address Space Layout Randomization) 우회를 수행했다. 최종적으로, 쉘을 실행하는 RCE(Remote Code Execution) 익스플로잇을 성공적으로 수행했다.
댓글에서는 오타와 같은 사소한 실수가 심각한 보안 취약점으로 이어질 수 있다는 점을 강조하며, 코드의 안전성을 높이기 위한 다양한 방안이 제시되었다. bitflags crate와 같은 Rust의 기능을 활용하여 비트 연산 오류(Bitwise Operation Error)를 줄이거나, C++의 named alternative operators를 사용하는 방법 등이 논의되었다. 결과적으로, 코드 리뷰 및 자동화된 테스트의 중요성이 강조되었다.