Сигурност

Редакция Overclock.bg ·

Критичен пропуск в Pillow: код чрез подготвен файл

Критичен пропуск в Pillow: код чрез подготвен файл

Критичен пропуск в Pillow — най-популярната библиотека за обработка на изображения в Python — позволява на нападател да изпълни команди на сървъра само като подаде файл с подходящо име. Уязвимостта носи номер CVE-2026-112900 и оценка 9.2 по CVSS, засяга всички версии от 2.6.0 до 12.3.0 включително и е закърпена в Pillow 13.0.0, излязла на 16 октомври 2026 г. Проблемът беше описан публично от изследователите на OX Security, а The Hacker News съобщи за него тази седмица.

Мащабът е основната причина за тревогата: Pillow се сваля около 436 милиона пъти месечно и стои под почти всяка Python услуга, която приема качени от потребители снимки — от аватари в уеб приложения до конвертори на документи и pipeline-и за машинно обучение.

Името на файла, не съдържанието му

Най-нелогичната част от този пропуск е, че вътре в самото изображение няма нищо злонамерено. Уязвимостта е в PIL.EpsImagePlugin.Ghostscript() — функцията, с която Pillow вика външната програма Ghostscript, за да разчете EPS файлове.

Pillow подава името на входния файл след аргумента -f, без да го нормализира до абсолютен път. Ако името започва с тире, Ghostscript го разчита не като файл, а като своя собствена опция — и чрез нея може да бъде насочен към втори файл с команди за изпълнение. Класическа argument injection, която прераства в изпълнение на код.

# Pillow 13.0.0 нормализира пътя, преди той да стигне до gs
infile = os.path.abspath(infile)

Важното условие: атаката работи само ако на машината е инсталиран Ghostscript (gs). Без него EPS кодерът изобщо не се задейства. Затова и първата препоръка на изследователите е най-простата — махнете gs от хостовете, които обработват непроверени качвания, и не подавайте имена на файлове, контролирани от потребител, директно на Image.open().

Любопитен детайл за контекста: в самите release notes на Pillow EPS argument injection е описан в групата със средна степен на опасност, докато външните бази данни и vuldb му дават 9.2. Разминаването идва от допускането колко лесно нападателят контролира името на файла — в типично уеб приложение, което запазва качения файл с оригиналното му име, отговорът е „напълно“.

Критична уязвимост в Pillow позволява изпълнение на код чрез подготвен файл Снимка: The Hacker News

Не е сам: още две дупки с 9.2

Pillow 13.0.0 не е ъпдейт за една уязвимост. Версията затваря десетки пропуска, два от които също с оценка 9.2:

  • CVE-2026-112403 — препълване на буфер в JPEG декодера при обработка на thumbnail. Задейства се през thumbnail() или draft(). Според Pillow бъгът е открит от Anthropic, използвайки Claude за проучване на сигурността на open source софтуер, и е потвърден ръчно от Ada Logics.
  • CVE-2026-112393 — препълване на heap буфер в TIFF кодера, налично в кода от 2013 г. Засяга запис в паметта, например в io.BytesIO, и за него вече има публичен proof-of-concept.

Ако не можете да ъпдейтнете веднага, за JPEG частта работи временно решение: извикайте load(), преди да пипате thumbnail, или изобщо прескочете draft() и thumbnail() върху ненадеждни файлове. А запазването на TIFF в буфер в паметта трябва да се третира като чувствителна операция, когато изображението идва от потребител.

Node2Shell: същата седмица, друг стек

Pillow не е единствената лоша новина за седмицата. Изследователи от Imperva демонстрираха работещ RCE exploit срещу официален билд на Node.js чрез подготвени Brotli данни — CVE-2026-111497, наречен Node2Shell.

Кодът е бил изпълнен върху официалния образ на Node.js 24.22.0 за Linux arm64, без дебъгер и без собствена компилация. Подготвените данни карат вградения Brotli декодер да стигне до смяна на блок, която структурата на потока изключва, и да продължи да работи в невалидно състояние — с out-of-bounds запис извън предвидения буфер.

Приложението стига до този декодер от двете страни на HTTP разговора: когато чете Brotli-компресиран отговор през вградения fetch(), или когато middleware декомпресира Brotli-компресирано тяло на заявка. Node.js обяви пропуска и пусна поправки на 21 октомври за линиите 22.x, 24.x и 26.x; върху закърпената 24.22.1 същите данни вече се отхвърлят. Imperva уточнява, че exploit-ът не сработва при всеки опит — изпълнението на код е изисквало няколко опита.

Какво да направите

Проверете коя версия на Pillow върви в production и ъпдейтнете до 13.0.0. Ако декомпресирате непроверени Brotli данни в Node.js, минете на закърпена версия. И в двата случая става дума за библиотеки, които стоят толкова дълбоко в стека, че малцина си спомнят, че са там — точно както при двете RCE дупки в PHP, заради които няколко европейски държави изключиха правителствени сайтове, или при пропуска с оценка 10.0 в GitLab, който стоя дванайсет години.

Няма данни за активна експлоатация на EPS пропуска, но публичният PoC за TIFF и демонстрацията на Imperva променят сметката: от „теоретично“ към „въпрос на дни“. Ъпдейтът е за един следобед, а алтернативата е да разчитате, че никой няма да качи файл с име, започващо с тире.

Харесва ви? Отбележете ни и ще ни виждате по-нагоре в Google.

Предпочитан източник в Google

Прочетете още