
Full exploit chain (CVE-2019-11708 & CVE-2019-9810) against Firefox on Windows 64-bit.
Ceci est une chaîne d'exploitation complète compromettant le navigateur (CVE-2019-11708 & CVE-2019-9810) ciblant Firefox sur Windows 64 bits. Elle utilise CVE-2019-9810 pour obtenir l'exécution de code dans le processus de contenu ainsi que dans le processus parent, et CVE-2019-11708 pour tromper le processus parent afin qu'il navigue vers une URL arbitraire.

J'ai couvert la cause racine de CVE-2019-9810 et son exploitation dans l'article A journey into IonMonkey: root-causing CVE-2019-9810 et dans le dépôt GitHub associé.
CVE-2019-11708 a été corrigé par le bulletin mfsa2019-19 et a été attribué au Bug 1559858 dans le traqueur de bugs de Mozilla. Voici le résumé du problème :
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.
Vous pouvez trouver le commit corrigeant le problème ici : Clean up prompt open calls in Prompter.jsm.
Un article complet sur le problème ainsi que les techniques utilisées dans l'exploit seront décrits dans un prochain article sur doar-e.github.io.
L'exploit a été testé sur Windows 19H2 64 bits et cible une version personnalisée de Firefox, donc ne soyez pas surpris si un peu de travail est nécessaire pour le faire fonctionner ailleurs :). Cependant, si vous souhaitez simplement exécuter l'exploit sans rien compiler, j'ai préparé un navigateur pré-packagé que j'ai téléchargé dans release/firefox-68.0a1.en-US.win64.7z. Il inclut également le shell js.exe ainsi que les informations de symboles privés pour js.exe, firefox.exe et xul.dll.
L'exploit suppose que le support de BigInt est activé dans Firefox, ce que vous pouvez faire en basculant javascript.options.bigint dans about:config.

Le processus d'exploitation utilise une corruption de données pour obtenir l'exécution de JS privilégié, également appelée God Mode (qui est fondamentalement une implémentation de une technique utilisée lors du Pwn2Own2014 par Jüri Aedla) qui est très différente (et beaucoup plus pratique) de la façon dont j'avais exploité CVE-2019-9810. Cela signifie qu'il n'y a pas de détournement de flux de contrôle pendant la chaîne d'exploitation.
Services.mm.loadFrameScript) au lieu de hooks bricolés et sales.En réalité, il y a un tas de détails plus subtils qui ne sont pas décrits ci-dessus, donc si vous êtes intéressé, vous êtes invité à chercher la vérité et à lire les sources / le futur article :).
MISE À JOUR 13 juin 2020 : Selon @rtfingc / Issue #1, Mozilla a atténué la corruption de données présentée dans cet exploit avec un commit du 10 février 2020 : Bug 1602485.
Pour construire la charge utile, il vous suffit d'exécuter nmake depuis une invite 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
Cela crée un fichier payload.exe / payload.pdb dans le répertoire payload\bin.
J'ai écrit cet exploit contre une version locale de Windows synchronisée avec l'identifiant de révision suivant : 2abb636ad481768b7c88619080cf224b2c266b2d (si vous ne souhaitez pas le construire vous-même, j'ai téléchargé ma version ici : release/firefox-68.0a1.en-US.win64.7z) :
$ hg --debug id -i
2abb636ad481768b7c88619080cf224b2c266b2d
Et j'ai utilisé le fichier mozconfig suivant :
. "$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