Pillow 13.0.0 corectează vulnerabilități critice în procesarea imaginilor: actualizați acum mediile Python
Pillow este biblioteca de imagini folosită implicit în majoritatea proiectelor Python. Mentenanții au lansat versiunea 13.0.0 (pe 16 octombrie), o actualizare de securitate amplă care corectează mai multe erori de memorie și de execuție de comenzi. Cea mai notabilă permite unui atacator să ruleze comenzi de sistem pe un server controlând doar numele unui fișier imagine. Conținutul imaginii nu trebuie să fie malițios. Deocamdată nu s-a raportat exploatare activă, dar Pillow stă la baza formularelor de upload, a serviciilor de thumbnail, a fluxurilor de documente și a proiectelor de ML, deci expunerea reală este mare.
Ce s-a întâmplat
Versiunea 13.0.0 rezolvă probleme de severitate de la scăzută la critică. Cele mai importante pentru echipele de apărare:
- CVE-2026-112900 (EPS / Ghostscript). Pentru a deschide imagini EPS, Pillow transmite numele fișierului programului extern Ghostscript (
gs) fără să-l valideze. Un nume construit special poate face Ghostscript să-l trateze ca instrucțiuni și să încarce comenzi furnizate de atacator. Problema contează doar pe serverele undegseste instalat, iar atacatorul trebuie să poată influența numele fișierului. Exact asta se întâmplă la endpoint-urile de upload care păstrează sau derivă numele fișierului din datele utilizatorului. Sunt afectate versiunile 2.6.0 – 12.3.0. - Depășiri de buffer la decodarea JPEG (critice, după evaluarea mentenanților). Una dintre ele, în componenta FlashPix (FPX), a fost demonstrată ca permițând execuție de comenzi printr-un singur apel
Image.open()pe un fișier special construit, dacă pachetul opționalolefileeste instalat. Pillow alege decodorul după conținutul fișierului, nu după extensie, așa că un fișier redenumit ajunge oricum la el. A doua, CVE-2026-112403, depășește un buffer la generarea thumbnail-ului unui JPEG lossless manipulat. Avizul raportează o oprire a procesului, nu execuție de cod. Această problemă a fost descoperită prin cercetare asistată de AI și validată manual. - CVE-2026-112393 (TIFF). Această eroare există în Pillow din 2013. Se declanșează la salvarea unui TIFF comprimat într-un buffer din memorie, un tipar uzual pentru serviciile care re-encodează un upload și îl returnează. Singură, provoacă oprirea procesului. Cercetătorii au obținut execuție de cod doar combinând-o cu o altă eroare care expune adrese de memorie. Salvarea într-un fișier obișnuit pe disc nu este afectată.
- O eroare de gestionare a memoriei prin care date vechi ale imaginii sunt reutilizate după schimbarea modului de culoare, tot critică după evaluarea mentenanților.
De ce contează
Înregistrările CVE evaluează problemele EPS, TIFF și JPEG-thumbnail cu 9,2/10. Fiecare depinde însă de condiții pe care scorul nu le surprinde complet, iar mentenanții le-au evaluat între moderat și critic. Interpretați-le ca „critice dacă codul vostru urmează acel tipar”, nu „critice peste tot”. La momentul publicării nu este cunoscută exploatarea problemei EPS, însă pentru problema TIFF există un proof of concept public. Pillow este descărcată de sute de milioane de ori pe lună și ajunge adesea în proiect ca dependență indirectă. Multe echipe o rulează fără să știe, de multe ori în imagini de container nereconstruite de luni de zile.
Ce trebuie făcut
- Actualizați la Pillow 13.0.0 peste tot:
pip install -U "Pillow>=13.0.0". Pillow 13 renunță la Python 3.10, deci aceste medii au nevoie și de Python 3.11+. - Reconstruiți toate containerele, pachetele wheel și imaginile de bază care includ o versiune veche. Actualizarea fișierului de dependențe nu este suficientă.
- Căutați dependențele indirecte. Verificați arborele de dependențe și SBOM-ul, nu doar
requirements.txt. Pillow vine des prin biblioteci de ML, PDF sau raportare. - Până la actualizare, blocați fiecare cale de atac:
- EPS: eliminați
gsde pe serverele care procesează upload-uri nesigure și nu transmiteți niciodată un nume de fișier controlat de utilizator cătreImage.open(). - Thumbnail-uri JPEG: evitați
draft()/thumbnail()pe JPEG-uri nesigure, apelați întâiload()sau folosițireducing_gap=None. - TIFF: tratați salvarea imaginilor primite de la utilizatori în
io.BytesIOca pe o operație sensibilă. - Generați numele fișierelor pe server în loc să le păstrați pe cele primite.
- EPS: eliminați
Serviciul nostru de code review asistat de AI caută exact acest tip de risc: o bibliotecă învechită ascunsă în arborele de dependențe, plus cod care îi transmite date controlate de utilizator, cum ar fi numele fișierelor. Analiștii noștri confirmă fiecare potrivire înainte să ajungă în raportul vostru.
Credit: acest articol rezumă și dezvoltă materialul original publicat de The Hacker News. Detaliile tehnice provin din acel material și din avizele de securitate ale proiectului Pillow.
