
Cadeia de exploração completa (CVE-2019-11708 e CVE-2019-9810) contra o Firefox no Windows de 64 bits.
Esta é uma cadeia de exploração completa de comprometimento do navegador (CVE-2019-11708 & CVE-2019-9810) que tem como alvo o Firefox no Windows 64 bits. Ela usa a CVE-2019-9810 para obter execução de código tanto no processo de conteúdo quanto no processo pai, e a CVE-2019-11708 para enganar o processo pai a navegar para uma URL arbitrária.

Já abordei a causa raiz e a exploração da CVE-2019-9810 no artigo A journey into IonMonkey: root-causing CVE-2019-9810 e no repositório do GitHub associado.
A CVE-2019-11708 foi corrigida pelo boletim mfsa2019-19 e recebeu o identificador Bug 1559858 no rastreador de bugs da Mozilla. Aqui está o resumo do problema:
Insufficient vetting of parameters passed with the Prompt:Open IPC message between child
and parent processes can result in the non-sandboxed parent process opening web content
chosen by a compromised child process. When combined with additional vulnerabilities this
could result in executing arbitrary code on the user's computer.
Você pode encontrar o commit que trata do problema aqui: Limpeza das chamadas de abertura de prompt no Prompter.jsm.
Uma descrição completa do problema, bem como as técnicas usadas na exploração, serão descritas em um próximo artigo em doar-e.github.io.
O exploit foi testado no Windows 19H2 64 bits e tem como alvo uma compilação personalizada do Firefox, então não se surpreenda se for necessário algum trabalho para fazê-lo funcionar em outros lugares :). No entanto, se você quiser apenas executar o exploit sem compilar nada, preparei um navegador empacotado que enviei em release/firefox-68.0a1.en-US.win64.7z. Ele também inclui o shell js.exe e informações de símbolos privados para js.exe, firefox.exe e xul.dll.
O exploit assume que o suporte para BigInt está ativado no Firefox, o que pode ser feito alternando javascript.options.bigint em about:config.

O processo de exploração usa uma corrupção de dados para obter execução JS privilegiada, também conhecida como God Mode (que é basicamente uma implementação de uma técnica usada no Pwn2Own2014 por Jüri Aedla), que é muito diferente (e muito mais conveniente) da maneira como explorei a CVE-2019-9810. Isso significa que não há sequestro de fluxo de controle durante a cadeia de exploração.
Services.mm.loadFrameScript) em vez de hacky and dirty hooks.Na realidade, há uma série de detalhes mais sutis que não são descritos acima, então se você estiver interessado, é convidado a buscar a verdade e ler as fontes / artigo futuro :).
ATUALIZAÇÃO 13 de junho de 2020: De acordo com @rtfingc / Issue #1, a Mozilla mitigou a corrupção de dados apresentada neste exploit com um commit de 10 de fevereiro de 2020: Bug 1602485.
Para compilar o payload, basta executar nmake de um prompt do VS 2017 x64.
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
Isso cria um arquivo payload.exe/payload.pdb dentro do diretório payload\bin.
Escrevi este exploit contra uma compilação local do Windows sincronizada com o seguinte ID de revisão: 2abb636ad481768b7c88619080cf224b2c266b2d (se você não quiser compilar por conta própria, enviei minha compilação aqui: release/firefox-68.0a1.en-US.win64.7z):
$ hg --debug id -i
2abb636ad481768b7c88619080cf224b2c266b2d
E usei o seguinte arquivo 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