Web Assembly
웹에서 어떠한 언어던 바이너리로 만들어진 파일을 처리할 수 있는 low-level 언어이다.
https://github.com/WebAssembly/wabt
V8에서 wasm을 위해 Liftoff pipeline을 추가해서 wasm 코드를 빠르게 시작할 수 있는 단계를 만들었다.
turbofan에서 wasm을 실행할 수 있지만 Liftoff를 사용하면 단계가 줄어서 start up 시간은 더 빠르다.
wasm은 Stack 기반의 머신이고 module화 되어있다.
wasm의 vm은 다른 프로세스, 시스템과 분리되어있다.
다만 import, export를 통해 js와 communication을 할 수 있다.
웹에서 바이너리를 실행하면서 웹 + 바이너리 공격 두 가지 모두 가능하다.
Web Assembly memory map
Wasm 모듈이 instance를 생성할때 memory object를 생성한다. JS 내부적으로 ArrayBuffer를 생성한다.
만약 web assembly에 포함된 특정 string을 읽고 싶다면, 해당 ArrayBuffer에서 시작 위치를 반환하면 JS에서 사용할 수 있다. 내부적으로 helperfunction있어 JS에서 해당 주소를 보고 어떤 동작을 할지 알 수 있다.
ArrayBuffer로 생성했기 때문에 JS의 garbage collector가 관리할 수 있다. 만약 reference counter가 0이되면 자동 해제 된다.
Web Assembly VM은 Linear Memory model을 사용한다. 그래서 web assembly vm은 ArrayBuffer에 할당된 메모리만 접근 할 수 있다.
메모리가 분리되어있기 때문에 보안기법이 적용되어있지 않은 것이 있다.
1. ASLR
2. stack canary
3. heap hardening
4. nx, DEP
사실 보안기법이 다 성능과 trade off를 하는 것이고 wasm은 속도가 빠른 것으로 어필을 했기 때문에 저 3가지를 굳이 적용하지 않은듯하다.
Exploit
wasm이 바이너리 exploit과 웹 exploit을 동시에 할 수 있지만, 이전 바이너리 exploit 모두가 되는 것은 아니다.
메모리 전체를 접근 할 수 없고 function table에서 함수를 사용하면서 GC가 free를 해주기 때문에 ROP나 UAF 같은 것들은 힘들다. 하지만 오히려 간단한 bof 이후 xss를 연계하여 exploit하는 등의 복합적인 테크닉이 요구된다.
CTF에서는 web assembly를 쓰는 이유는 결국 rwx page를 할당 받기 때문이다.
web assembly 인스턴스를 할당받고 그안에서 쉘코드를 띄운다고 해서 쉘이 실행되지 않지만 java object propertie를 잘 수정해서 브라우저 engine이 쓴느 rwx 영역에 쉘코드를 넣어서 실행해주는게 포인트인듯 하다.
참고 문헌
https://developer.mozilla.org/en-US/docs/WebAssembly
https://www.youtube.com/watch?v=DFPD9yI-C70
'0x00 공부 > Browser' 카테고리의 다른 글
Faith CTF 2019 oob-v8 (0) | 2023.03.21 |
---|---|
v8 exploit tech - addrof, fakeobj (0) | 2023.03.20 |
v8 환경 구축 (0) | 2023.03.16 |
JavaScript engine basic2 (0) | 2023.03.12 |
JavaScript engine basic1 (0) | 2023.03.12 |