
전체 익스플로잇 체인 (CVE-2019-11708 & CVE-2019-9810) — Windows 64비트의 Firefox 대상.
이것은 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 메시지와 함께 전달된 매개변수의 불충분한 검증으로 인해
샌드박스가 적용되지 않은 부모 프로세스가 손상된 자식 프로세스가 선택한 웹 콘텐츠를 열 수 있습니다.
추가 취약점과 결합되면 사용자 컴퓨터에서 임의의 코드를 실행할 수 있습니다.
문제를 해결한 커밋은 여기에서 찾을 수 있습니다: Prompter.jsm에서 프롬프트 열기 호출 정리.
문제에 대한 전체 분석과 익스플로잇에 사용된 기술은 doar-e.github.io에 곧 게재될 기사에서 설명됩니다.
익스플로잇은 Windows 19H2 64비트에서 테스트되었으며 Firefox의 맞춤 빌드를 대상으로 하므로 다른 환경에서 작동하게 하려면 약간의 작업이 필요하더라도 놀라지 마세요 :). 하지만 컴파일 없이 익스플로잇을 실행해보고 싶다면 release/firefox-68.0a1.en-US.win64.7z에 업로드한 패키지 브라우저를 준비했습니다. 여기에는 js.exe 셸과 js.exe, firefox.exe, xul.dll의 private 심볼 정보도 포함되어 있습니다.
익스플로잇은 Firefox에서 BigInt 지원이 활성화되어 있다고 가정합니다. 이는 about:config에서 javascript.options.bigint를 전환하여 설정할 수 있습니다.

익스플로잇 프로세스는 데이터 손상을 사용하여 권한 있는 JS 실행(일명 God Mode)을 얻습니다. 이는 Jüri Aedla가 Pwn2Own2014에서 사용한 기술의 구현이며, 제가 CVE-2019-9810을 익스플로잇했던 방식과는 매우 다릅니다(그리고 훨씬 더 편리합니다). 이는 익스플로잇 체인 동안 제어 흐름이 하이재킹되지 않음을 의미합니다.
Services.mm.loadFrameScript)을 사용하여 구현되었습니다.실제로는 위에서 설명하지 않은 더 미묘한 세부 사항들이 많이 있습니다. 따라서 관심이 있다면 진실을 찾아 소스 코드 / 향후 기사를 읽어보시기 바랍니다 :).
2020년 6월 13일 업데이트: @rtfingc / 이슈 #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 파일이 생성됩니다.
저는 다음 리비전 ID와 동기화된 로컬 Windows 빌드에 대해 이 익스플로잇을 작성했습니다: 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"
# .mozbuild에 있는 clang 버전 사용
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