V8 1의 웹 어셈블리 동작 및 취약점

웹 어셈블리

웹에 있는 모든 언어의 바이너리를 처리할 수 있는 저수준 언어입니다.

https://github.com/WebAssembly/wabt


v8 이륙

V8에서는 wasm 코드에 빠르게 입력할 수 있도록 wasm용 리프트오프 파이프라인을 추가했습니다.

터보팬에서 Wasm을 실행할 수 있지만, Liftoff를 사용하면 더 적은 단계로 인해 시작 시간이 더 빨라집니다.

wasm은 스택 기반 기계이며 모듈화되어 있습니다.

Wasm의 VM은 다른 프로세스 및 시스템과 격리되어 있습니다.

그러나 가져오기 및 내보내기를 통해 js와 통신할 수 있습니다.

바이너리가 웹에서 실행되는 동안 웹 및 바이너리 공격이 모두 가능합니다.

웹 어셈블리 메모리 할당

Wasm 모듈이 인스턴스를 만들 때 저장소 개체를 만듭니다. JS는 내부적으로 ArrayBuffer를 생성합니다.

webassembly에 포함된 특정 문자열을 읽으려면 ArrayBuffer에서 시작 위치를 반환하여 JS에서 사용할 수 있습니다. 내부적으로 도우미 기능이 있으므로 JS에서 적절한 주소를 보고 수행할 작업을 알 수 있습니다.

ArrayBuffer로 구축되었기 때문에 JS Garbage Collector에서 관리할 수 있습니다. 참조 카운터가 0이 되면 자동으로 해제됩니다.


블랙햇 워즘 vm

웹 어셈블리 VM은 선형 메모리 모델을 사용합니다. 따라서 webassembly VM은 ArrayBuffer에 할당된 메모리에만 접근할 수 있습니다.

저장소가 분리되어 있기 때문에 보안 기술이 적용되지 않는 경우가 있습니다.

1.ASLR

2. 스택 카나리아

3. 힙 경화

4.nx, DEP

사실 모든 보안 기술은 성능의 대가를 치르고, wasm은 그 속도에 짜증이 났기 때문에 이 세 가지가 적용되지 않은 것 같습니다.

악용하다


작업 익스플로잇 기술

wasm은 바이너리 익스플로잇이면서 동시에 웹 익스플로잇이 될 수 있지만 이전의 모든 바이너리 익스플로잇이 그런 것은 아닙니다.

ROP 및 UAF와 같은 것은 모든 메모리에 액세스할 수 없고 함수 테이블의 함수가 사용 중인 동안 GC가 메모리를 해제하기 때문에 까다롭습니다. 그러나 간단한 bof와 함께 xss를 활용하는 것과 같은 복잡한 기술이 필요합니다.

CTF에서 웹어셈블리를 사용하는 이유는 결국 rwx 페이지가 할당되기 때문입니다.

웹어셈블리 인스턴스를 할당하고 그 안에 있는 쉘코드를 실행하여 쉘이 실행되는 것은 아니지만 요점은 자바 객체 속성을 멋지게 수정하고 이를 실행하는 데 사용되는 브라우저 엔진이 사용하는 rwx 범위에 쉘코드를 넣는 것 같습니다.

참조

https://developer.mozilla.org/en-US/docs/WebAssembly

https://webassembly.org/

https://v8.dev/blog/liftoff