[하루한줄] CVE-2021-30734: Safari WebAssembly LLInt에서 발견된 Integer Overflow 취약점

URL

Exploitation of a JavaScriptCore WebAssembly Vulnerability

Target

Safari <14.1.1

Explain

Safari의 WebAssembly는 세 단계를 거쳐 실행되는데 그 첫 번째 단계인 LLInt(Low Level Interpreter)에 interger overflow 취약점(CVE-2021-30734)이 발생하여 Safari 14.1.1 버전에서 패치되었습니다. LLInt의 Parser는 함수의 유효성을 검사하는 과정에서 m_max_StackSize 필드를 사용해 함수가 사용할 스택의 최대 크기를 추적합니다. 파싱이 끝나면 m_max_StackSize 값을 16 byte alignment로 맞추기 위해 LLIntGenerator::Finalize 함수를 호출해 반올림하고 m_numCalleeLocals 필드에 저장합니다.

만약 m_max_StackSize 값이 0xffffffff이라면 16 byte alignment를 맞추기 위해 올림 계산을 하게 되어 integer overflow가 발생하고 m_numCalleeLocals의 값이 0x0으로 저장됩니다. 함수가 실제로 사용하는 스택의 크기와 LLInt가 추적하는 크기가 서로 달라지게 되고 메모리 오염으로 이어집니다.