
Catena di exploit completa (CVE-2019-11708 & CVE-2019-9810) contro Firefox su Windows 64-bit.
Questa è una catena di exploit completa per compromettere il browser (CVE-2019-11708 e CVE-2019-9810) che prende di mira Firefox su Windows a 64 bit. Utilizza CVE-2019-9810 per ottenere l'esecuzione di codice sia nel processo content che nel processo padre e CVE-2019-11708 per ingannare il processo padre facendogli navigare verso un URL arbitrario.

In passato ho trattato la causa principale e lo sfruttamento di CVE-2019-9810 nell'articolo A journey into IonMonkey: root-causing CVE-2019-9810 e nel repository github associato.
CVE-2019-11708 è stato risolto dal bollettino mfsa2019-19 ed è stato assegnato al Bug 1559858 nel bug tracker di Mozilla. Ecco il riepilogo del 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.
Puoi trovare il commit che affronta il problema qui: Clean up prompt open calls in Prompter.jsm.
Una descrizione completa del problema e delle tecniche utilizzate nell'exploit sarà descritta in un prossimo articolo su doar-e.github.io.
L'exploit è stato testato su Windows 19H2 a 64 bit e prende di mira una build personalizzata di Firefox, quindi non sorprenderti se è necessario un po' di lavoro per farlo funzionare altrove :). Tuttavia, se vuoi solo eseguire l'exploit senza compilare nulla, ho preparato un browser impacchettato che ho caricato in release/firefox-68.0a1.en-US.win64.7z. Include anche la shell js.exe e le informazioni sui simboli privati per js.exe, firefox.exe e xul.dll.
L'exploit presuppone che il supporto per BigInt sia attivato in Firefox, cosa che puoi fare attivando javascript.options.bigint in about:config.

Il processo di sfruttamento utilizza una corruzione dei dati per ottenere l'esecuzione JS privilegiata, nota anche come God Mode (che è fondamentalmente un'implementazione di una tecnica usata in Pwn2Own2014 da Jüri Aedla) che è molto diversa (e molto più comoda) dal modo in cui avevo sfruttato CVE-2019-9810. Ciò significa che non c'è dirottamento del flusso di controllo durante la catena di exploit.
Services.mm.loadFrameScript) invece di hook sporchi e rozzi.In realtà, ci sono molti altri dettagli sottili non descritti sopra, quindi se sei interessato sei invitato a cercare la verità e leggere le fonti / il futuro articolo :).
AGGIORNAMENTO 13 giugno 2020: Secondo @rtfingc / Issue #1, Mozilla ha mitigato la corruzione dei dati presentata in questo exploit con un commit del 10 febbraio 2020: Bug 1602485.
Per compilare il payload, devi solo eseguire nmake da un prompt x64 di VS 2017.
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
Questo crea un file payload.exe / payload.pdb all'interno della directory payload\bin.
Ho scritto questo exploit contro una build locale di Windows sincronizzata al seguente id di revisione: 2abb636ad481768b7c88619080cf224b2c266b2d (se non hai voglia di compilarla da solo, ho caricato la mia build qui: release/firefox-68.0a1.en-US.win64.7z):
$ hg --debug id -i
2abb636ad481768b7c88619080cf224b2c266b2d
E ho usato il seguente file 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