
Vollständige Exploit-Kette (CVE-2019-11708 & CVE-2019-9810) gegen Firefox unter Windows 64-bit.
Dies ist eine vollständige Browser-Compromise-Exploit-Chain (CVE-2019-11708 & CVE-2019-9810), die auf Firefox unter Windows 64-Bit abzielt. Sie nutzt CVE-2019-9810, um Code-Ausführung sowohl im Content-Prozess als auch im Parent-Prozess zu erlangen, und CVE-2019-11708, um den Parent-Prozess dazu zu bringen, eine beliebige URL zu besuchen.

Ich habe die Ursache und Ausnutzung von CVE-2019-9810 bereits im Artikel A journey into IonMonkey: root-causing CVE-2019-9810 und im zugehörigen GitHub-Repository behandelt.
CVE-2019-11708 wurde durch das Bulletin mfsa2019-19 behoben und im Mozilla-Bug-Tracker als Bug 1559858 eingetragen. Hier ist die Zusammenfassung des Problems:
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.
Der Commit, der das Problem behebt, ist hier zu finden: Clean up prompt open calls in Prompter.jsm.
Eine ausführliche Beschreibung des Problems sowie der im Exploit verwendeten Techniken wird in einem kommenden Artikel auf doar-e.github.io gegeben.
Der Exploit wurde gegen Windows 19H2 64-Bit getestet und zielt auf einen benutzerdefinierten Build von Firefox ab; seien Sie also nicht überrascht, wenn etwas Arbeit nötig ist, um ihn woanders zum Laufen zu bringen :). Wenn Sie den Exploit jedoch einfach ausführen möchten, ohne etwas zu kompilieren, habe ich einen gepackten Browser vorbereitet, den ich unter release/firefox-68.0a1.en-US.win64.7z hochgeladen habe. Er enthält auch die js.exe-Shell sowie private Symboldaten für js.exe, firefox.exe und xul.dll.
Der Exploit setzt voraus, dass die Unterstützung für BigInt in Firefox aktiviert ist, was Sie durch Umschalten von javascript.options.bigint in about:config tun können.

Der Ausnutzungsprozess verwendet eine Datenkorruption, um privilegierte JS-Ausführung zu erlangen, auch bekannt als God Mode (was im Grunde eine Implementierung einer in Pwn2Own2014 verwendeten Technik von Jüri Aedla ist), was sich stark (und viel bequemer) von der Art unterscheidet, wie ich CVE-2019-9810 ausgenutzt habe. Das bedeutet, dass während der Exploit-Chain kein Kontrollfluss entführt wird.
Services.mm.loadFrameScript) implementiert, anstatt mit hacky und schmutzigen Hooks.In Wirklichkeit gibt es eine Reihe subtilerer Details, die oben nicht beschrieben sind. Wenn Sie interessiert sind, sind Sie eingeladen, die Wahrheit zu erforschen und die Quellen / den zukünftigen Artikel zu lesen :).
UPDATE 13. Juni 2020: Laut @rtfingc / Issue #1 hat Mozilla die in diesem Exploit vorgestellte Datenkorruption mit einem Commit vom 10. Februar 2020 gemildert: Bug 1602485.
Um die Payload zu erstellen, müssen Sie lediglich nmake von einer VS 2017 x64-Eingabeaufforderung aus ausführen.
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
Dies erzeugt eine payload.exe / payload.pdb-Datei im Verzeichnis payload\bin.
Ich habe diesen Exploit gegen einen lokalen Windows-Build geschrieben, der auf die folgende Revisions-ID synchronisiert wurde: 2abb636ad481768b7c88619080cf224b2c266b2d (falls Sie ihn nicht selbst bauen möchten, habe ich meinen Build hier hochgeladen: release/firefox-68.0a1.en-US.win64.7z):
$ hg --debug id -i
2abb636ad481768b7c88619080cf224b2c266b2d
Und ich habe die folgende mozconfig-Datei verwendet:
. "$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