Pillow, biblioteka, przez którą aplikacje w Pythonie otwierają i zmniejszają obrazki, dostała 16 października 2026 roku wersję 13.0 z poprawkami około 40 luk. Kilka z nich pozwala w określonych warunkach uruchomić obcy kod już przy otwarciu spreparowanego pliku. Aktualizacji potrzebuje przede wszystkim serwis, który przyjmuje zdjęcia od użytkowników i przepuszcza je przez Pillow, na przykład żeby zrobić miniaturę. Lista zmian wersji 13.0.0 wymienia 42 komunikaty bezpieczeństwa, w tym 3 krytyczne. Te luki dotyczą wersji do 12.3.0 włącznie. Osobna, mniej groźna luka w eksporcie do formatu Arrow obejmuje też 13.0.0 i nie ma jeszcze poprawki. Ataków na razie nikt nie zgłosił (stan na 23 października 2026 roku, godz. 14:00).
Czym jest Pillow i kogo dotyczą luki
Pillow to biblioteka Pythona do otwierania, przetwarzania i zapisywania obrazów, rozwijana jako kontynuacja dawnej PIL (Python Imaging Library). Dlatego w kodzie importuje się ją jako PIL. Używaliśmy jej między innymi w teście zmniejszania zdjęć. Często trafia do projektu jako zależność innego pakietu. Pole ImageField we frameworku Django wymaga zainstalowanego Pillow. Każdy formularz z awatarem albo zdjęciem produktu w Django ciągnie więc tę bibliotekę.
Luki dotyczą sytuacji, w której Pillow otwiera albo zapisuje plik pochodzący z niezaufanego źródła. Skrypt zmniejszający własne zdjęcia z wakacji ryzykuje niewiele. Sklep, CMS albo system obiegu dokumentów z publicznym formularzem wgrywania plików ryzykuje dużo więcej. Funkcja Image.open() rozpoznaje format po zawartości pliku, a nie po rozszerzeniu ani typie MIME. Opisuje to wprost dokumentacja bezpieczeństwa Pillow. Plik nazwany avatar.png może więc trafić do dekodera TIFF albo JPEG 2000. Filtr rozszerzeń w formularzu przed tym nie chroni.
Jak sprawdzić wersję Pillow w projekcie
Wersję sprawdzisz jednym z dwóch poleceń, uruchomionych w tym samym środowisku wirtualnym, w którym działa aplikacja:
python -m pip show pillow
python -c "import PIL; print(PIL.__version__)"
Wynik 12.3.0 lub niższy oznacza wersję z lukami załatanymi w 13.0.0. Na naszym komputerze testowym z Pythonem 3.14.3 oba polecenia pokazały 12.2.0. Każde środowisko wirtualne i każdy obraz Dockera trzeba sprawdzić osobno, bo każde ma własną kopię biblioteki. Warto też przejrzeć requirements.txt albo plik blokady zależności, żeby przypięta wersja nie wróciła przy kolejnym wdrożeniu.
Aktualizacja według instrukcji instalacji Pillow to python3 -m pip install --upgrade Pillow. Po niej uruchom testy, bo 13.0 zmienia kilka zachowań. Na przykład przestaje po cichu przycinać wartości przy zapisie obrazów w trybie I do PNG.
Python 3.10 zatrzyma się na wersji 12.3.0
Pillow 13.0 nie obsługuje już Pythona 3.10, który według listy zmian skończył okres wsparcia w październiku 2026 roku. Pakiet na PyPI wymaga Pythona 3.11 lub nowszego. Na Pythonie 3.10 polecenie aktualizacji zainstaluje więc najwyżej 12.3.0, czyli wersję podatną. Projekt na tym interpreterze musi najpierw przejść na nowszego Pythona. Dopiero wtedy dostanie poprawki.
Pierwsza Misja AI · Kodożercy
AI bez technikaliów – kurs i certyfikat
Pierwsza Misja AI to kurs Kodożerców dla absolutnych początkujących. Fabuła w konwencji science fiction, gamifikacja, ćwiczenia na żywym modelu, certyfikat na koniec.
Zacznij Pierwszą Misję →
Które luki w Pillow są najgroźniejsze i kiedy działają
Najgroźniejsze są trzy błędy w dekoderach. Zapisują one dane poza przydzieloną pamięcią już podczas odczytu obrazka. Przy dwóch z nich autorzy zgłoszeń pokazali uruchomienie polecenia. Każda z tych luk ma jednak warunek: konkretny format, dodatkowy pakiet albo określoną operację w kodzie aplikacji.
Tabela: luka, waga i warunek ataku
| Luka | Waga | Kiedy grozi | Operacja |
|---|---|---|---|
| CVE-2026-112398, dekoder JPEG w plikach FPX (FlashPix) | krytyczna | zainstalowany dodatkowy pakiet olefile; autor pokazał uruchomienie polecenia po Image.open() jednego pliku na Pillow 12.2.0 | odczyt |
| CVE-2026-96639, pliki wieloklatkowe (MPO, PSD, DCX, MIC) | krytyczna, CVSS 9,8 | aplikacja przechodzi przez kolejne klatki pliku; autor pokazał wykonanie polecenia we własnym testowym serwisie z wgrywaniem plików MPO | odczyt |
| GHSA-8g5g-8vmr-9782, dekoder JPEG przy zmniejszaniu | krytyczna w liście zmian, wysoka w komunikacie | Image.thumbnail() na bezstratnym pliku JPEG; ograniczenie formatów do JPEG nie pomaga | odczyt |
| GHSA-78g4-xqwv-q3g8, dołączona biblioteka OpenJPEG | wysoka | pliki JPEG 2000; gotowe pakiety binarne (koła) z PyPI od wersji 11.1.0 | odczyt |
| CVE-2026-112393 i CVE-2026-112902, koder TIFF | wysoka | aplikacja zapisuje otrzymany obrazek ponownie jako TIFF | zapis |
| CVE-2026-96778, komentarz w JPEG | wysoka | ponowny zapis jako JPEG z zachowaniem profilu kolorów ICC | zapis |
| CVE-2026-112900, EPS i Ghostscript | średnia | napastnik wpływa na nazwę pliku przekazaną do Image.open() (zaczyna się od - albo @) | odczyt |
| CVE-2026-114501, eksport do formatu Arrow | średnia, bez poprawki | ustawiona zmienna środowiskowa PILLOW_ALIGNMENT większa niż 1 | eksport |
Kiedy błędy w Pillow stają się groźne
Luka w plikach FPX jest najprostsza do wykorzystania. Komunikat GHSA-5x8w-8jj5-q52h zawiera opis exploita, czyli gotowego sposobu na wykorzystanie błędu, a plik rozpoznawany jest po nagłówku, niezależnie od nazwy. Warunkiem jest pakiet olefile, którego Pillow nie instaluje domyślnie. Na naszym komputerze bez olefile Pillow w ogóle nie rejestruje formatu FPX. Luki przy zapisie dotyczą z kolei usług, które przerabiają obrazki. Chodzi o konwersję do TIFF albo zapis jako JPEG z profilem kolorów.
Większość komunikatów o średniej wadze opisuje sposoby na zawieszenie procesu albo zapchanie pamięci. Są wśród nich bomby dekompresyjne, czyli małe pliki rozwijające się do gigabajtów, oraz nieskończone pętle. Jeden taki plik potrafi zatrzymać usługę, choć dostępu do serwera napastnikowi nie daje.

Skąd tyle luk w jednym wydaniu
Część zgłoszeń przyszła z narzędzi AI, co komunikaty opisują wprost tylko w kilku przypadkach. Dwa z nich, o dekoderze JPEG i o kafelkach TIFF, podają, że lukę znalazł Anthropic przy użyciu modelu Claude. Ręcznie zweryfikowała ją firma Ada Logics. Autor krytycznej luki CVE-2026-96639 pisze, że w odkryciu i weryfikacji pomagała mu analiza z AI. Szesnaście komunikatów ma wewnętrzne oznaczenia zaczynające się od ANT-2026. Ani Pillow, ani Anthropic nie wyjaśniają publicznie ich pochodzenia, więc nie przypisujemy ich nikomu. Polityka bezpieczeństwa Pillow ma dziś osobny punkt dla osób, które zgłaszają luki hurtowo albo szukają ich modelem językowym. Przed wysłaniem muszą same sprawdzić, czy opisane funkcje w ogóle istnieją.
Co zrobić poza aktualizacją Pillow
Aktualizacja do 13.0.0 zamyka wszystkie opisane wyżej luki poza CVE-2026-114501. Dokumentacja bezpieczeństwa Pillow zaleca też zabezpieczenia, które ograniczą skutki kolejnych błędów. W kolejności, którą podaje projekt:
- Przetwarzaj obrazy w odizolowanym procesie, ograniczonym przez seccomp, AppArmor albo kontener z ograniczeniami.
- Odrzucaj pliki EPS na wejściu aplikacji albo uruchamiaj Ghostscript w całkowicie odizolowanej piaskownicy.
- Nigdy nie przekazuj tekstu od użytkownika do
ImageMath.unsafe_eval(). - Aktualizuj Pillow i jego biblioteki C, śledź komunikaty bezpieczeństwa projektu.
- Nie ustawiaj
Image.MAX_IMAGE_PIXELS = Nonei traktuj ostrzeżenieDecompressionBombWarningjak błąd. - Ogranicz akceptowane formaty, na przykład przez
Image.open(..., formats=...). - Usuwaj metadane EXIF, XMP i ICC z obrazków od użytkowników, zanim opublikujesz je w serwisie.
Ograniczenie formatów sprawdziliśmy na Pillow 12.2.0. Plik TIFF otwierany przez Image.open(plik, formats=["JPEG", "PNG", "WEBP"]) kończy się błędem UnidentifiedImageError i nie trafia do dekodera TIFF. Lista dozwolonych formatów wyłącza więc dużą część opisanych luk, ale nie chroni przed błędami w dekoderze JPEG. Jeśli aplikacja nie potrzebuje formatów FPX i MIC, sprawdź, czy ma pakiet olefile. Polecenie python -m pip show olefile pokaże, czy nie trafił do środowiska jako zależność innej biblioteki. Pillow zaleca też instalację z przypiętymi sumami kontrolnymi (pip install --require-hashes). Chroni ona przed podmienioną paczką na PyPI, jak przy złośliwej wersji LiteLLM.
Luka CVE-2026-114501 nie ma jeszcze poprawki. Dotyczy wyłącznie aplikacji, które ustawiają zmienną PILLOW_ALIGNMENT powyżej 1 i eksportują obrazy do formatu Arrow. Wtedy w wyeksportowanych danych mogą się znaleźć resztki pamięci, na przykład pikseli z obrazka innego użytkownika. Jeśli nie ustawiasz tej zmiennej, ta luka cię nie dotyczy.
FAQ
Czy aktualizacja systemu Linux wystarczy, żeby załatać Pillow?
Nie, jeśli pip zainstalował gotowy pakiet binarny Pillow z PyPI, czyli tak zwane koło (wheel). Takie koło zawiera własne kopie bibliotek graficznych, między innymi OpenJPEG. Komunikat GHSA-78g4-xqwv-q3g8 zaznacza, że zaktualizowany system operacyjny ich nie wymieni. Trzeba zaktualizować sam Pillow. Gdy biblioteka pochodzi z pakietu dystrybucji, na przykład python3-pil w Debianie, poprawki dostarcza dystrybucja. Wtedy sprawdź jej komunikaty bezpieczeństwa.
Czy luki w Pillow są już wykorzystywane w atakach?
Na 23 października 2026 roku nikt nie zgłosił ataków. Katalog wykorzystywanych podatności amerykańskiej agencji CISA (stan z 21 października) nie zawiera żadnej pozycji dotyczącej Pillow. Komunikaty są jednak publiczne od 17 października. Przy luce w plikach FPX opisano działający sposób na uruchomienie polecenia, więc z aktualizacją nie warto czekać.
Masz pomysł na aplikację? Najpierw go zobacz
Zanim zainwestujesz w pełny system, przygotujemy klikalny prototyp, który pokażesz zespołowi albo klientom. Potem budujemy aplikację webową, która rośnie razem z firmą.
Podsumowanie
Pillow 13.0.0 z 16 października 2026 roku poprawia około 40 luk w bibliotece obrazków, z której korzysta wiele aplikacji w Pythonie, w tym trzy krytyczne. Najgroźniejsze błędy siedzą w dekoderach JPEG, FPX i plików wieloklatkowych i działają już przy odczycie pliku. Każdy ma jednak warunek, na przykład pakiet olefile albo konkretną operację w kodzie. Luki dotyczą wersji do 12.3.0 włącznie. Sprawdź wersję poleceniem python -m pip show pillow w każdym środowisku, zaktualizuj bibliotekę i ogranicz akceptowane formaty w Image.open(). Projekty na Pythonie 3.10 muszą najpierw przejść na nowszy interpreter. Osobna luka w eksporcie do formatu Arrow obejmuje też 13.0.0, ale dotyczy tylko rzadkiej konfiguracji i czeka na poprawkę. Stan na 23 października 2026 roku, godz. 14:00.
Newsletter · DevstockAcademy & Kodożercy
Bądź na bieżąco ze światem IT, AI i automatyzacji
Co wtorek: newsy z branży, praktyczne tipy i narzędzia które warto znać. Zero spamu.



