Firefox SpiderMonkey 엔진, 단일 오타로 RCE 취약점 발생!
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 과정에서 메모리 접근 오류를 유발했다.
UAF(Use-After-Free) 취약점 분석
오류는 `WasmArrayObject::obj_moved()` 함수 내에서 발생하며, GC가 Wasm 배열을 이동시킬 때 호출된다. 포워딩 포인터(Forwarding Pointer)를 설정하는 과정에서 오타로 인해 포인터의 LSB가 제대로 설정되지 않아, isDataInline() 함수가 OOL 배열을 IL 배열로 잘못 판단하게 된다. 그 결과, Ion 컴파일러(JIT compiler)가 해제된 메모리에 접근하여 UAF가 발생한다.
익스플로잇(Exploit) 과정 상세 분석
익스플로잇은 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를 사용하는 방법 등이 논의되었다. 결과적으로, 코드 리뷰 및 자동화된 테스트의 중요성이 강조되었다.