[하루한줄] CVE-2020-15994 : Chrome WebAssembly Engine UAF 취약점

URL

Exploiting CVE-2020-15994 Chrome WebAssembly Engine UAF Vulnerability

Target

Google Chrome WebAssembly

Explain

Google Chrome의 V8 WebAssembly 엔진에서 발견된 UAF 취약점에 대한 상세 정보가 공개되었습니다. WebAssembly는 JS의 단점을 보완하기 위해 브라우저에서 저수준 언어로 작성된 코드를 컴파일해 네이티브로 동작할 수 있도록 하는 기술 표준입니다.

WebAssembly의 AsyncCompileJob 객체는 WebAssembly.instantiateStreaming 함수에서 사용되는 기본 V8 객체이며 WebAssembly의 비동기 컴파일을 지원합니다.

취약점을 트리거하는 데 사용되는 함수는 다음과 같습니다.

AsyncCompileJob::FinishModule - 컴파일된 WebAssembly 코드를 Javascript 객체로 인스턴스 화함
AsyncCompileJob::Abort - WebAssembly 코드 다운로드 실패 시 호출되며 모든 컴파일 프로세스를 취소함
위 두 함수는 모두 AsyncCompileJob 객체를 해제하는 기능이 있습니다.

WebAssembly.instantiateStreaming 함수를 이용하여 WebAssembly 코드를 컴파일하는 경우 WebAssembly 코드에서 Javascript 함수 및 객체에 접근하기 위한 인터페이스로 importObject를 사용합니다. 이때 importObject에 Getter를 정의하면 InstanceBuilder::SanitizeImports 함수는 Getter 함수를 콜백으로 호출합니다.

Getter를 AsyncCompileJob::Abort 로 정의해 콜백 함수로 호출하면 AsyncCompileJob::FinishModule 함수 이후 해제된 AsyncCompileJob 객체에 접근할 수 있어 UAF를 트리거할 수 있습니다.