
Foxit Reader CVE-2018-14442용 PoC
PDF는 문서를 나타내는 데 사용되는 파일 형식입니다. PDF는 여러 데이터 객체로 구성됩니다.
단순 기본 객체 Integer, Number, Boolean, Null
복합 객체
| Format | Name |
|---|---|
| [.*] | Array |
| (.*) | String |
| <<.*>> | Dictionary |
| <.*> | Hex String |
| /.* | Name |
| stream.*endstream | Stream |
이 객체들은 PDF가 어떻게 보이고 무엇을 포함하는지 정의합니다. PDF의 구조는 Direct(직접) 객체와 Indirect(간접) 객체의 두 가지 유형으로 존재합니다. 간접 객체는 객체 번호(Object number)와 세대 번호(Generation number)로 시작하며 그 뒤에 실제 객체가 옵니다. 간접 객체는 n m R 형식으로 다른 객체에서 직접 참조될 수 있습니다. 여기서 n과 m은 각각 객체 번호와 세대 번호입니다.
사전(Dictionary) 객체는 문서의 기본 구성 요소입니다. 페이지나 문서 자체를 구성하는 데 필요한 몇 가지 일반적인 사전 객체가 있습니다. 가장 중요한 것은 다른 모든 Pages, Metadata, Names 등에 대한 링크를 정의하는 Root 사전이며, 각 항목은 다른 객체가 될 수 있습니다.
스트림(Stream) 객체는 글꼴, 그림 또는 압축/암호화된 데이터와 같은 대부분의 이진 데이터를 포함합니다.
PDF 문서는 내용을 무단 액세스로부터 보호하기 위해 암호화될 수 있습니다. 암호화는 Encrypt 사전 자체와 같은 일부 예외를 제외하고 문서의 PDF 파일에 있는 모든 문자열과 스트림에 적용됩니다. 암호화는 주로 스트림 객체에 적용됩니다. 암호화는 문서의 내용보다는 구조에 대한 정보를 전달하는 데 주로 사용되는 정수나 부울 값과 같은 다른 객체 유형에는 적용되지 않습니다.
암호화 관련 정보는 문서의 트레일러(trailer) 사전에 있는 "Encrypt" 항목의 값인 문서의 암호화 사전에 저장되어야 합니다.
CPDF_Parser::StartParse는 암호화된 PDF의 간접 객체에 대해 m_pCryptoHandler를 설정합니다. m_pCryptoHandler는 CPDF_Parser::ReleaseEncryptHandler가 완료되면 null로 설정되어야 합니다. 그러나 CPDF_Parser::ReleaseEncryptHandler는 CPDF_Parser의 CryptoHandler 참조를 제거하지 않아 댕글링(dangling) 상태가 됩니다.
이후 파서가 Root 사전에서 참조하는 객체를 파싱하기 시작하면 m_pCryptoHandler+8이 호출되어 데이터를 복호화합니다.
유사한 버그가 pdfium의 커밋 741c362fb75fd8acd2ed2059c6e3e716a63a7ac8에서 패치되었습니다. https://bugs.chromium.org/p/chromium/issues/detail?id=726503 참조.
PDF는 문서에 JS를 포함할 수 있으며, Catalog 유형 사전의 OpenAction에 입력하면 자동으로 실행될 수 있습니다. JS 실행이 가능해지면 프로세스 공간에 객체를 스프레이하여 ROP 체인을 작성할 예측 가능한 주소를 확보할 수 있습니다.
Foxit Reader에서 PDF 문서에 서명할 때 설치 디렉터리의 plugins\jrsys\x86\jrsysMSCryptoDll.dll을 사용하여 서명 정보를 읽습니다. 이때 jrsysCryptoDll.dll은 정적 주소 0x10000000에 로드됩니다. 이 DLL은 VirtualAlloc을 가져오므로 페이로드를 실행하기가 더 쉽습니다. 첨부된 익스플로잇은 힙 스프레이를 사용하여 예측 가능한 메모리 레이아웃을 확보하고, ROP 체인을 사용하여 RWX 페이지를 할당하고 페이로드를 복사 및 실행합니다.
이 익스플로잇은 MS Windows 7 Enterprise Build 7601 SP1 x86에서 실행되는 Foxit Reader 9.0.1.1049 x86을 사용하여 테스트되었습니다. 익스플로잇은 힙이 특정 상태에 있어야 하므로, 익스플로잇이 실패하면 다시 시도하십시오. 비디오 데모를 참조하십시오. 이 취약점은 Android용 Foxit PDF Reader 및 Converter에도 존재합니다.
bitcoins.pdf는 해제된 메모리를 재할당하고 핵심 버그를 트리거하는 조작된 PDF입니다. 디버거에서 크래시를 재현하려면 FoxitReader.exe에 대해 Page Heaps를 활성화하고 bitcoins.pdf를 여십시오.
이 크래시는 Payatu에서 개발한 퍼징 플랫폼인 Cloudfuzz에 의해 발견되었습니다. 추가 분석 및 익스플로잇은 Sudhakar가 수행했습니다.