
Full exploit chain (CVE-2019-11708 & CVE-2019-9810) against Firefox on Windows 64-bit.
这是一个针对 Windows 64 位 Firefox 的完整浏览器妥协利用链(CVE-2019-11708 和 CVE-2019-9810)。它利用 CVE-2019-9810 在内容进程和父进程中获取代码执行权限,并利用 CVE-2019-11708 诱骗父进程浏览到任意 URL。

我曾在一篇题为 A journey into IonMonkey: root-causing CVE-2019-9810 的文章以及相关的 github 仓库 中详细介绍了 CVE-2019-9810 的根因和利用方法。
CVE-2019-11708 已通过公告 mfsa2019-19 修复,并在 Mozilla 错误跟踪器中分配了 Bug 1559858。以下是该问题的摘要:
对子进程和父进程之间 Prompt:Open IPC 消息中传递的参数审查不足,可能导致非沙箱化的父进程打开由受损子进程选择的 Web 内容。当与其他漏洞结合时,这可能导致在用户计算机上执行任意代码。
修复该问题的提交可在此处找到:Clean up prompt open calls in Prompter.jsm。
关于该问题以及利用中使用的技术的完整文档将在 doar-e.github.io 上即将发表的文章中描述。
该 exploit 已在 Windows 19H2 64 位上进行测试,针对的是 Firefox 的自定义构建,因此如果需要进行一些调整才能在其他环境下运行,请不要感到惊讶 :)。但是,如果您只想运行 exploit 而不编译任何内容,我准备了一个打包好的浏览器,上传在 release/firefox-68.0a1.en-US.win64.7z 中。它还包含了 js.exe shell 以及 js.exe、firefox.exe 和 xul.dll 的私有符号信息。
该 exploit 假设 Firefox 中启用了对 BigInt 的支持,您可以通过在 about:config 中切换 javascript.options.bigint 来启用。

利用过程使用数据损坏来获得特权 JS 执行,即 God Mode(这基本上是 Jüri Aedla 在 Pwn2Own2014 中使用的一种技术 的实现),这与之前利用 CVE-2019-9810 的方式非常不同(而且方便得多)。这意味着在整个利用链过程中不会劫持控制流。
Services.mm.loadFrameScript)实现的,而不是使用 hacky 和 dirty 的钩子。实际上,还有更多细微的细节未在上文中描述,因此如果您感兴趣,欢迎去探寻真相并阅读源代码 / 未来的文章 :)。
2020 年 6 月 13 日更新:根据 @rtfingc / Issue #1,Mozilla 已在 2020 年 2 月 10 日通过一次提交缓解了此利用中展示的数据损坏:Bug 1602485。
要构建有效载荷,只需在 VS 2017 x64 提示符下运行 nmake。
CVE-2019-11708\payload>nmake
Microsoft (R) Program Maintenance Utility Version 14.16.27034.0
Copyright (C) Microsoft Corporation. All rights reserved.
taskkill /f /im payload.exe
ERROR: The process "payload.exe" not found.
if not exist .\bin mkdir bin
python src\genheaders.py sprites
cl /O1 /nologo /ZI /W3 /D_AMD64_ /DWIN_X64 /sdl /Febin\payload.exe src\payload.cc /link /nologo /debug:full user32.lib
payload.cc
del *.obj *.pdb *.idb
if exist .\bin del bin\*.exp bin\*.ilk bin\*.lib
start .\bin\payload.exe
这会在 payload\bin 目录中创建一个 payload.exe / payload.pdb 文件。
我针对本地 Windows 构建编写了此 exploit,同步到以下版本 ID:2abb636ad481768b7c88619080cf224b2c266b2d(如果您不想自己构建,我已将我的构建上传到此处:release/firefox-68.0a1.en-US.win64.7z):
$ hg --debug id -i
2abb636ad481768b7c88619080cf224b2c266b2d
并且我使用了以下 mozconfig 文件:
. "$topsrcdir/browser/config/mozconfigs/win64/common-win64"
ac_add_options --disable-crashreporter
ac_add_options --enable-debug-symbols
. "$topsrcdir/build/mozconfig.clang-cl"
. "$topsrcdir/build/mozconfig.lld-link"
# Use the clang version in .mozbuild
CLANG_LIB_DIR="$(cd ~/.mozbuild/clang/lib/clang/*/lib/windows && pwd)"
export LIB=$LIB:$CLANG_LIB_DIR
ac_add_options --enable-js-shell
ac_add_options --enable-jitspew
mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-ff64