
CVE-2021-21220의 익스플로잇을 자세히 설명하는 교육용 프레젠테이션으로, WebAssembly를 통한 OOB 액세스 및 RCE로 이어지는 V8 JIT 유형 혼동과 완화 분석을 다룹니다.
이 발표는 Google Chrome의 V8 JavaScript 엔진에서 잘못된 JIT 컴파일러 최적화 가정으로 인해 발생한 취약점인 CVE-2021-21220의 악용을 설명합니다.
이 발표에서는 다음을 다룹니다:
이 발표의 목표는 최신 JavaScript 엔진 내부의 미묘한 최적화 오류가 다음과 같은 심각한 문제로 확대될 수 있음을 보여주는 것입니다:
이 악용 체인은 JIT 엔진이 성능과 보안 사이에서 균형을 맞추는 방식과, 잘못된 최적화 가정이 어떻게 악용 가능해질 수 있는지를 강조합니다.
이 발표는 V8의 주요 구성 요소를 소개합니다:
발표의 아키텍처 다이어그램은 JavaScript가 다음과 같이 전환되는 과정을 보여줍니다:
Parsing → Bytecode → Optimization → Execution
JavaScript는 고성능 실행이 까다로운 언어입니다. 그 이유는:
+ 같은 연산자가 여러 의미를 가질 수 있음V8은 런타임 동작을 추측하여 일반적인 실행 패턴을 최적화하기 위해 JIT 컴파일을 사용합니다.
이 취약점은 JIT 최적화 과정에서 발생하는 부호 있는 정수와 부호 없는 정수의 불일치에서 비롯됩니다.
설명된 주요 개념:
Uint32ArrayWord32XorChangeInt32ToInt64악용 코드는 다음 값을 남용합니다:
0x80000000
이 값은 32비트 정수의 부호 비트를 설정합니다.
이 취약점은 TurboFan이 다음 코드를 최적화하기 때문에 발생합니다:
x ^ 0
이를 완전히 제거해 버립니다.
이 최적화 과정에서:
그 결과 잘못된 머신 코드가 생성되고 공격자가 제어할 수 있는 값이 발생합니다.
이 악용은 잘못된 JIT 결과를 배열 동작 제어로 변환합니다.
이 발표에서는 다음을 시연합니다:
i로의 변환Array.shift() 길이 언더플로제시된 중요한 악용 개념:
배열 길이가 -1이 되면 공격자는 다음을 획득합니다:
그런 다음 악용 코드는 다음을 시연합니다:
이 발표는 공격자가 다음을 대상으로 삼을 수 있는 방법을 설명합니다:
공격 흐름:
이는 JavaScript 엔진 버그가 프로세스 수준의 코드 실행으로 전환될 수 있음을 보여줍니다.
마지막 섹션에서는 최신 브라우저 방어 기법을 다룹니다:
직접적인 포인터 노출과 힙 예측 가능성을 줄입니다.
원시 메모리 주소에 대한 직접 접근을 방지합니다.
메모리 영역을 격리하고 악용 영향을 줄입니다.
페이지가 동시에 쓰기 및 실행 가능 상태가 되는 것을 방지합니다.
또한 이 발표에는 부호 확장 문제를 수정한 실제 V8 패치 diff가 포함되어 있습니다.
이 발표는 다음을 보여줍니다:
이 자료는 다음 용도로만 엄격히 사용해야 합니다:
소유하지 않았거나 테스트 권한이 없는 시스템에 이 정보를 사용하지 마십시오.