
PoC for Foxit Reader CVE-2018-14442 के लिए PoC
PDF एक फ़ाइल प्रारूप है जिसका उपयोग दस्तावेज़ों को प्रस्तुत करने के लिए किया जाता है। एक pdf कई डेटा ऑब्जेक्ट्स से बना होता है
सरल प्रिमिटिव ऑब्जेक्ट्स Integer, Number, Boolean, Null
जटिल ऑब्जेक्ट्स
| प्रारूप | नाम |
|---|---|
| [.*] | Array |
| (.*) | String |
| <<.*>> | Dictionary |
| <.*> | Hex String |
| /.* | Name |
| stream.*endstream | Stream |
ये ऑब्जेक्ट्स परिभाषित करते हैं कि pdf कैसा दिखता है और इसमें क्या होता है। pdf में संरचनाएँ 2 प्रकार की ऑब्जेक्ट्स में मौजूद होती हैं - प्रत्यक्ष और अप्रत्यक्ष। एक अप्रत्यक्ष ऑब्जेक्ट ऑब्जेक्ट संख्या और जनरेशन संख्या से शुरू होता है, जिसके बाद वास्तविक ऑब्जेक्ट होता है। अप्रत्यक्ष ऑब्जेक्ट्स को अन्य ऑब्जेक्ट्स में सीधे n m R के रूप में संदर्भित किया जा सकता है, जहाँ n और m क्रमशः ऑब्जेक्ट और जनरेशन संख्याएँ हैं।
Dictionary ऑब्जेक्ट्स दस्तावेज़ के मूल निर्माण खंड हैं। कुछ सामान्य dictionary ऑब्जेक्ट्स होते हैं जो पृष्ठ या दस्तावेज़ को बनाने के लिए आवश्यक होते हैं। सबसे महत्वपूर्ण Root dictionary है जो अन्य सभी Pages, Metadata, Names आदि के लिंक परिभाषित करती है, जिनमें से प्रत्येक कोई अन्य ऑब्जेक्ट हो सकता है।
Stream ऑब्जेक्ट्स में सबसे अधिक बाइनरी डेटा होता है जैसे फ़ॉन्ट, चित्र या संपीडित/एन्क्रिप्टेड डेटा।
एक PDF दस्तावेज़ को अनधिकृत पहुँच से सुरक्षित रखने के लिए एन्क्रिप्ट किया जा सकता है। एन्क्रिप्शन दस्तावेज़ की PDF फ़ाइल में सभी स्ट्रिंग्स और स्ट्रीम्स पर लागू होता है, कुछ अपवादों के साथ जैसे कि Encrypt dictionary स्वयं। एन्क्रिप्शन मुख्य रूप से stream ऑब्जेक्ट्स पर लागू होता है। एन्क्रिप्शन अन्य ऑब्जेक्ट प्रकारों जैसे integers और boolean मानों पर लागू नहीं होता, जिनका उपयोग मुख्य रूप से दस्तावेज़ की संरचना के बारे में जानकारी देने के लिए किया जाता है न कि उसकी सामग्री के बारे में।
एन्क्रिप्शन से संबंधित जानकारी दस्तावेज़ की encryption dictionary में संग्रहीत की जानी चाहिए, जो दस्तावेज़ की trailer dictionary में "Encrypt" प्रविष्टि का मान होगी।
CPDF_Parser::StartParse एक pdf के उन indirect ऑब्जेक्ट्स के लिए m_pCryptoHandler सेट करता है जो एन्क्रिप्टेड हैं। CPDF_Parser::ReleaseEncryptHandler पूरा होने पर m_pCryptoHandler को null किया जाना चाहिए। इसके बजाय CPDF_Parser::ReleaseEncryptHandler CPDF_Parser में CryptoHandler के संदर्भ को नहीं हटाता और यह dangling रहता है।
बाद में जब parser Root dictionary में संदर्भित ऑब्जेक्ट्स को पार्स करना शुरू करता है, तो डेटा को डिक्रिप्ट करने के लिए m_pCryptoHandler+8 को कॉल किया जाता है।
इसी तरह की एक बग pdfium में commit 741c362fb75fd8acd2ed2059c6e3e716a63a7ac8 में पैच की गई थी। देखें https://bugs.chromium.org/p/chromium/issues/detail?id=726503
PDF दस्तावेज़ों में JS एम्बेड करने की अनुमति होती है, जिसे Catalog प्रकार की dictionary के OpenAction में दर्ज किए जाने पर स्वचालित रूप से निष्पादित किया जा सकता है। एक बार जब हमारे पास JS निष्पादन हो जाता है, तो हम प्रोसेस स्पेस में ऑब्जेक्ट्स को स्प्रे कर सकते हैं ताकि हम एक पूर्वानुमानित पते पर पहुँच सकें जहाँ हम अपनी ROP चेन लिखेंगे।
जब Foxit Reader में एक PDF दस्तावेज़ पर हस्ताक्षर किया जाता है, तो यह हस्ताक्षरित जानकारी पढ़ने के लिए इंस्टॉलेशन निर्देशिका से plugins\jrsys\x86\jrsysMSCryptoDll.dll का उपयोग करता है, जो jrsysCryptoDll.dll को 0x10000000 के स्थिर पते पर लोड करता है। यह dll VirtualAlloc को इम्पोर्ट करता है जिससे payload को निष्पादित करना आसान हो जाता है। संलग्न exploit पूर्वानुमानित मेमोरी लेआउट प्राप्त करने के लिए heap spraying का उपयोग करता है और RWX पेज आवंटित करने, payload को कॉपी करने और निष्पादित करने के लिए एक rop चेन का उपयोग करता है।
इस exploit का परीक्षण MS Windows 7 Enterprise Build 7601 SP1 x86 पर चल रहे Foxit Reader 9.0.1.1049 x86 का उपयोग करके किया गया था। exploit के लिए heap को एक विशिष्ट स्थिति में होना आवश्यक है, यदि exploit विफल हो जाए, तो कृपया पुनः प्रयास करें। कृपया वीडियो डेमो देखें। यह भेद्यता Android के लिए Foxit PDF Reader और Converter में भी मौजूद है।
bitcoins.pdf वह विशेष रूप से निर्मित pdf है जो मुक्त की गई मेमोरी का पुनः-आवंटन करता है और मुख्य बग को ट्रिगर करता है। यदि आप debugger में क्रैश को पुनः उत्पन्न करना चाहते हैं, तो कृपया FoxitReader.exe के लिए Page Heaps सक्षम करें और bitcoins.pdf खोलें।
यह क्रैश Cloudfuzz द्वारा पाया गया - Payatu पर विकसित एक fuzzing प्लेटफ़ॉर्म। आगे का विश्लेषण और exploitation Sudhakar द्वारा किया गया।