[ETC] V8 Engine

Magnolia·5일 전

포너블 취약점 분석하면 대표적으로 생각나는 두 가지

리눅스 커널과 V8

항상 포너블 공부하면서 V8에 대해 공부하고 취약점 분석을 해보고 싶다는 생각을 하곤했다.

아직 V8을 분석할 실력은 아니라고 생각하지만 한번 내가 목표로 하는 것에 대해 정리를 해보고 싶어서 이 블로그를 쓴다.

+ 처음 V8을 들었을 땐 진짜 엔진밖에 생각나지 않았다.
이거 아니고

이거다


V8 Engine

V8 Engine은 Google에서 만든 JavaScript 컴파일러로 C++을 기반으로 만들어졌다. 독립적으로 실행이 가능하고 다른 웹 브라우저 없이 JavaScript, Node.js 코드를 컴파일 할 수 있다.


JIT Compiler

V8은 JIT Compiler를 지원한다.
일반적인 Compiler에는 동적 컴파일(인터프리터)과 정적 컴파일(Compiler)가 있다.

JIT Compiler는 이 두 개를 합친 것으로 실행 시점에서 인터프리터 방식으로 바이트 코드를 생성한다.

그 후 V8 Engine은 바이트 코드를 기계어 코드로 만들고 그 코드를 캐싱하여 같은 함수가 여러 번 불릴 때 매번 기계어 코드를 생성하는 것을 방지한다.

V8 Engine에서 바이트코드로 바꾸는 컴파일러를 Ignition이라고 한다.

이렇게 빠르고 효율적인 컴파일러이기 때문에 Just-In-Time(JIT)이라고 불린다.

이를 통해 얻을 수 있는 이점이 있다.

  • 복잡한 최적화 과정은 바이트코드 컴파일러가 대신 해주므로 고려하지 않아도 된다.
  • 바이트 코드는 빠른 기계어 변환을 목적으로 설계되었기 때문에 일반적인 컴파일러보다 제작 과정이 수월하다.

JavaScript Engine AST

JavaScript는 인터프리터 되는 과정을 거치기 전에 해당 소스코드를 parser -> Abstract Syntax Tree 형태로 바꾸게 된다.

parser는 구문 분석기로 해당 소스가 컴파일 되기 전에 parser 소스로 공급해주면 소스를 분석하여 구분 분석을 수행하고 수행한 결과를 가지고 AST를 생성한다.

JavaScript의 parser는 lazy parser를 사용하는데 lazy parser의 궁극적인 목표는 중복되는 함수에 대한 처리와 만나는 함수를 사전에 구문 분석함으로써 함수를 건너 뛸 수 있도록 하는 작업을 수행한다. 이러한 최적화 과정을 거친 후 컴파일러 알고리즘에서 많이 사용되는 AST 자료구조를 사용하여 컴파일 작업을 돕게 된다.


V8 Engine Memory Structure

V8 Engine의 메모리 구조는 Stack과 Heap 두 가지 영역으로 나뉘게 된다.

Heap에 올라간 데이터들은 New와 Old 영역으로 나뉘어 GC를 통해 관리되게 한다.

Code Space는 JIT 컴파일러가 컴파일된 코드 블록을 저장하는 곳이다. 이곳은 실행 가능한 메모리가 있는 유일한 공간이다.

Heap에는 주로 Object가 올라가게 된다.

전역 스코프, 함수를 호출했을 때의 영역, Object를 참조하고 있는 변수들은 Stack 영역에 할당된다.

Stack 영역은 Frame이라는 단위로 묶여서 올라가고 처음 컴파일 될 때 Global Frame이라는 스택 제일 아래 영역에 전역 스코프나 기타 참조 변수들을 넣는다.

그 후 함수가 호출되면 해당 함수 이름으로된 Frame 영역이 생기고 함수가 끝나기 전까지 해당 Frame 영역에 변수들이 적재된다. 해당 함수에서 객체를 정의한다면 생성됨과 동시에 해당 객체를 Heap에 할당하고 스택에 입력된 값들을 Heap에 복사되어 넣게 한다.


정리

V8 JavaScript 엔진은 Google이 개발한 JavaScript 실행 엔진으로 Google Chrome과 Node.js에서 사용된다. JavaScript 코드를 파싱하여 AST로 변환한 뒤 인터프리터와 JIT 컴파일러를 통해 최적화된 기계어로 변환하여 실행하는 것이 특징이다. 보안 연구 관점에서는 객체 모델과 메모리 구조에서 발생하는 Type Confusion, OOB, UAF와 같은 취약점을 통해 브라우저 권한 탈취로 이어지는 익스플로잇 연구의 주요 대상이 되는 엔진이다.

0개의 댓글