본문 바로가기

hacking & security/vm & web browser3

Chrome V8 BigInt Type-Confusion Bug (* poc code of this bug : https://github.com/zbvs/opensource-research/tree/master/v8/speculative_bigint ) V8 엔진에서 JIT 버그를 찾게 되었다. BigInt 타입에 대한 Type-Confusion 버그였는데 안타깝게도 BigInt의 특성 때문에 OOB Read까지만 가능했고 이 버그만으로는 Exploit이 가능하지는 않았다. Chrome Fullchain Exploit을 해보자고 팀으로 준비중비였는데 언젠가 써먹을 날이 오겠지 하고 냅 두었다가 어느 순간 패치가 되어있었다. 묵혀뒀던 이 버그에 대해 이야기를 하려 한다. 버그의 PoC는 V8 8.0 버전 쯤에서 테스트했었는데 아마 V8 7.5 ~ 8.4 정도 버전까지 .. 2021. 1. 9.
Chrome V8 Garbage Collector and Write Barrier 자바스크립트 엔진은 오브젝트들에 대한 레퍼런스들을 추적하고 레퍼런스들이 없어지면 가비지 컬렉팅한다. 크롬 V8은 2개의 가비지 컬렉터가 있는데 하나는 Minor GC라 하며 전체 메모리 공간 중 Young Space라 불리는 메모리 공간이 부족할 때 활동하는 가비지 컬렉터이다. 따라서 상대적으로 빈번히 GC를 실행한다. 하나는 Major GC이며 가끔씩 Young Space 뿐만 아니라 Heap Space 전체를 통째로 가비지 컬렉팅할 때 동작한다. 이번 글은 주로 Minor GC에 대해 다룰 것이다. Minor GC는 Young Space라 불리는 지역을 관리하는데 Young Space는 새로 생성된 Object들이 존재하는 Heap Space이다. Minor GC는 이 Young Space를 다시 두.. 2021. 1. 8.
Chrome V8 Map and Map Transition Chrome 웹 브라우져의 V8은 Map이라는 내부 Object로 오브젝트의 구조 정보를 저장한다. 말하자면 V8에서는 Map이 곧 오브젝트의 class혹은 타입을 의미한다. 만약 두 오브젝트가 똑같은 프로퍼티를 가지고 있다면 같은 Map을 공유하고 다른 프로퍼티를 가지고 있다면 다른 Map을 가지게 된다. V8 Turbofan은 자바스크립트 코드를 컴파일 할때 타입 피드백을 이용해 컴파일하는데 예를 들어 아래 그림과 같이 my_obj라는 {a:int, b:int} 프로퍼티를 가진 오브젝트가 temp함수의 argument로 사용되었다면 V8은 그 Object의 Map을 피드백으로 저장한다. 피드백으로 저장된 Map정보는 나중에 JIT-Compiler가 컴파일을 진행할 때 타입정보로 이용한다. 자바스크립트.. 2021. 1. 8.