‘hack.lu 2024’ 컨퍼런스가 10월 22일부터 나흘간 룩셈부르크에서 개최됐습니다. 올해 18회를 맞이한 ‘hack.lu’ 컨퍼런스는 매년 전 세계 사이버 보안 전문가들이 모여 최신 동향과 보안 기술을 공유하는 행사입니다. 발표나 전시 위주의 다른 유럽 Major 행사와 달리 최신 해킹 기술을 전파하기 위한 다양한 정보보안 교육까지 선보이는 컨퍼런스죠. 그 명성에 맞게 전문가 강연, 실습 워크숍, 모의해킹 대회(CTF,Capture The flag)등 다채로운 프로그램이 진행됐는데요. 이번 ‘hack.lu 2024’에 SK쉴더스의 화이트해커그룹 EQST가 참여했습니다.
SK쉴더스의 화이트해커그룹 EQST가 발표한 주제는 ‘Chrome V8 익스플로잇 교육’ 입니다. 크롬 등 다양한 어플리케이션에서 사용되고 있는 V8 엔진은 취약점 발생 시, 심각한 보안 위협이 발생할 수 있어 각별한 주의가 필요한데요. 다수의 크롬 취약점 공격이 원격 코드 실행(RCE, Remote Code Execution)*에 악용되고 있고, 그중 대부분이 V8에서 발생한 버그로부터 시작되고 있죠. 이러한 V8 엔진을 분석하고, 익스플로잇 기술을 이해하기 위해서는 상위 레벨의 해킹 지식이 필요하지만, 국내외 관련 교육이 드물고, 최신 자료가 적어 학습이 어려운 실정입니다. 게다가 V8은 매주 패치가 진행되고 특히 올해는 업데이트가 많이 되었습니다. 이러한 상황에서 SK쉴더스가 사이버 보안을 위해 축적한 노하우와 연구 결과를 활용해 V8에 대한 최신 기술을 공유했습니다. 이번 세미나에서는 24년 업데이트 된 부분까지 포함해 △V8 구조 및 동작 방식 △V8 디버깅* 방법 △V8 익스플로잇* 수행 등의 이론 설명을 진행했는데요. 이에 더해 청중들이 직접 V8 취약점을 찾고 분석해볼 수 있는 실습 시간을 제공해 편안한 연습 환경에서 더욱 흥미롭고 가치 있는 교육을 즐길 수 있도록 하였습니다.
*원격 코드 실행(RCE): 공격자가 대상 시스템이나 애플리케이션에 대한 직접적인 접근 없이 원격으로 임의의 코드(악성 코드 등)를 실행할 수 있는 상황을 뜻함.
* 디버깅:소프트웨어 개발 과정에서 발생하는 오류를 찾아내고 수정하는 과정
* 익스플로잇: PC나 서버의 보안 취약점을 이용한 공격 방법
SK쉴더스 EQST가 준비한 ‘Chrome V8 익스플로잇 교육’은 총 3개 섹션으로 진행됐습니다. 그중 첫 번째 섹션에서는 V8에 대한 취약점 분석 및 익스플로잇을 수행하기 위해 필요한 기초 이론을 다뤘죠.
V8은 C++로 개발된 Google의 JavaScript 및 WebAssembly를 실행하는 고성능 오픈소스 엔진으로, Chrome 브라우저와 Node.js 같은 서버측 자바스크립트 환경에서 코드를 실행하는 핵심 엔진입니다. V8의 가장 큰 강점 중 하나는 속도인데, 바로 JIT 컴파일러를 활용하고 있기 때문입니다. 인터프리터를 사용하는 대신 JIT(Just In Time) 컴파일러를 구현함으로써 코드 실행 시에 자바 스크립트 코드를 머신 코드로 컴파일하죠. 이로써 코드 실행 시점에 실시간으로 최적화를 수행해 실행 속도를 높이는데 핵심 역할을 하는 것입니다. 이러한 V8은 복잡한 구조로 구성되어있기 때문에 JIT 컴파일, 메모리 할당 최적화 과정 등에서 발생할 수 있는 논리적 오류가 자주 발견되는 편입니다. 원격 코드 실행(RCE)을 통해 악성코드를 실행하거나, 브라우저 샌드박스 탈출을 통한 시스템 권한 상승과 같은 심각도가 높은 취약점들이 다수의 V8 사용자 및 시스템 공격할 경우 상당한 영향력을 끼치기 때문에 매우 위험합니다. 따라서, V8 exploit을 많이 시도하는 것이죠. 이러한 V8은 ‘10년 [Full-codegen + Crankshaft], ‘16년[Ignition, Full-codegen, Crankshaft, Turbofan], ‘17년 [Ignition+ TurboFan (v5.9)], ‘18년 [Liftoff for WebAssembly(v6.9)], ‘21년 [Sparkplug (v9.1)], ‘23년 [Maglev] 순으로 발전되어 왔습니다.
그렇다면, V8 엔진의 디버깅 방법은 어떻게 될까요? Tool – Memory & Object – WSAM 에 대한 이해와 준비가 필요합니다.
우선, Tool에 대해 알아보겠습니다. V8 엔진 디버깅의 핵심은 D8입니다. D8은 디벨롭퍼 쉘로, 웹 브라우저를 실행하지 않고도 V8 엔진 동작을 확인하고, 디버깅 할 수 있습니다. D8은 ‘--allow-natives-syntax’, ‘--trace-turbo’, ‘--print-maglev-code& --trace-maglev-graph-building’, ‘--expose-gc’등의 디버깅 옵션을 제공합니다. 이 옵션들은 함수 최적화, 컴파일 과정 추적, 메모리 주소 이동 등의 분석에 용이하죠. Pwndbg 플러그인을 설치하고, GDB에서 V8 서포트 명령을 사용할 수 있도록 설정해주면 디버깅 준비가 완료됩니다.
이후, V8 엔진을 분석하고, 익스플로잇을 진행하기 위해서는 Memory구조와 Object에 대해 잘 아는 것이 중요합니다. Memory구조는 크게 stack과 heap으로 나뉘는데요. stack에는 smi와 포인터를 저장하며, 빠른 접근이 가능합니다. 반면, heap은 동적 데이터(문자열, 객체 등)를 저장하며 garbage collection을 통해 메모리를 관리하죠. 이를 통해 메모리 사용의 효율성을 높이고, 프로그램 실행 시 필요한 데이터를 빠르게 접근할 수 있습니다. V8의 객체는 map, properties, elements로 구성되어 있습니다. map은 객체의 구조 정보를 저장하며, properties는 비정수 인덱스의 값을 저장하고, elements는 정수 인덱스의 값을 저장합니다. 특히, 같은 properties를 가진 객체는 map을 공유함으로써 메모리 관리의 효율성을 높입니다.
Wasm은 WebAssembly의 약자로, 복잡한 연산이 필요한 곳(웹 기반Photoshop 등)에서 바이너리 명령 형식을 이용해 효율적이고 빠르게 작동합니다. 또한, 자바 스크립트와 함께 사용할 수 있기 때문에 Chrome을 포함한 많은 최신 웹 브라우저에서 Wasm 형식의 코드실행을 진행하고 있죠. 이러한 Wasm은 V8에서 사용할 때 rwx(Read, Write, Execute) 공간 할당하기 때문에 Wasm을 이용해 익스플로잇을 진행하고 쉘코드를 실행하는 것이 필요합니다.
V8 익스플로잇은 샌드박스 내에서 실행 가능 영역의 Code Entry Pointer를 활용하여 메모리를 변조하고 임의 코드를 실행하는 방식이었습니다. 그러나 Google은 이러한 취약점을 개선하기 위해 샌드박스 내에 존재하는 Code Entry Pointer를 제거하고, index 기반의 pointer table을 참조하도록 변경했습니다. 하지만, 여전히 샌드박스 내에 WASM instance가 생성한 실행 가능 영역의 포인터가 존재했고, 이를 이용한 우회 방식이 등장하였습니다.
Google은 이 과정을 방지하기 위해 샌드박스 내부에 존재하던 Wasm instance의 실행 가능 영역의 pointer를 제거하고, TrustedPointerTable을 통해 index 기반으로 참조하도록 패치했습니다. 하지만, 여전히 샌드박스 내부에 pointer table을 참조하기 위한 pointer가 존재할 가능성을 남겨두고 있어, 익스플로잇의 주요 목표는 이 pointer를 찾아내는 것인데요. Google은 현재도 이러한 샌드박스 구조를 지속적으로 개선하여 보안성을 강화하고 있죠. V8 익스플로잇의 복잡한 구조는 해커와 보안 연구자 간의 치열한 두뇌 싸움을 반영하며, 이러한 과정 속에서 기술적인 발전이 이루어지고 있습니다.
이외에도 2024년에 패치된 샌드박스 탈출기법을 소개하였고, 이를 테스트 할 수 있는 Web기반의 실습환경을 제공했습니다. 해당 환경은 별도의 환경 구성 없이 Web에 접속만 가능하면 1~2초만에 실습환경 사용이 가능하여, 행사장에서 큰 호응을 얻었습니다.
EQST에서는 V8과 같은 기존 해킹 연구분야 외에도 AI LLM 해킹가이드와 같은 최신 IT분야의 연구 성과물도 연내 외부로 배포할 예정입니다.