Новости
Как вредоносный код спрятали в SVG-картинках с флагами
Четырёхэтапный вредонос раздробили и спрятали внутри SVG-картинок — на момент анализа его не видел ни один антивирус.
Мы привыкли, что «опасный файл» — это подозрительное вложение в письме или архив с паролем. Но файлом, который запускает чужой код, может оказаться и вполне безобидная на вид ИИ-модель. Исследователи показали, как специально собранная модель на Hugging Face тихо выполняет команды на компьютере разработчика ещё до того, как хоть что-то сгенерирует.
Коротко: набор уязвимостей FaceHugger в библиотеке Hugging Face Diffusers позволяет вредоносной ИИ-модели обойти защиту trust_remote_code и запустить произвольный код прямо при загрузке через from_pretrained. Три CVE закрыты в Diffusers 0.38.0 — обновитесь и не грузите модели из непроверенных репозиториев.

Исследователи компании Zafran Security (Гал Забан и Идо Шани) раскрыли три уязвимости в Diffusers — популярной Python-библиотеке Hugging Face, на которой запускают генеративные модели вроде Stable Diffusion. Набор дыр получил общее имя FaceHugger. Суть проста: собранный злоумышленником репозиторий модели заставляет библиотеку выполнить произвольный код на машине, которая эту модель загружает.
По данным Zafran, о проблемах сообщили Hugging Face 19 марта 2026 года, CVE опубликовали в мае, а публичный разбор вышел 27 июля 2026 года и разошёлся по профильным изданиям в начале августа. Масштаб потенциального охвата большой: только за июль 2026 года Diffusers скачали более 8,1 млн раз.
ИИ-модель на Hugging Face — это не один бинарник, а набор файлов: веса (обычно .safetensors или .bin), конфиги и, что важно, иногда собственный код пайплайна на Python. Когда вы вызываете DiffusionPipeline.from_pretrained("автор/модель"), библиотека скачивает эти файлы и может подключить кастомный пайплайн — то есть чужой .py-файл из репозитория.
trust_remote_code — это как раз защитный «замок»: флаг, который должен требовать явного согласия пользователя, прежде чем выполнить любой присланный вместе с моделью код. Идея в том, что без вашего «да» неотревьюенный Python из чужого репозитория не запустится. FaceHugger показывает, что этот замок можно открыть в обход — модель-файл исполняет код, хотя вы такого разрешения не давали.
Загрузка модели ничем не отличается от открытия документа: программа читает присланные файлы и что-то с ними делает. Если формат позволяет протащить внутрь исполняемый код, «открытие» превращается в запуск — ровно как со спрятанным вредоносом в SVG-картинках или разбором недоверенного JSON.
Корень проблемы один: проверка trust_remote_code выполняется в первой фазе загрузки, а фактический код подключается позже. Любой приём, при котором загрузчик видит код, которого «не заметил» контроль, обходит защиту. Zafran описали три сценария.
| CVE | CVSS | Механизм обхода |
|---|---|---|
| CVE-2026-44827 | 8.8 | Инъекция кода через «None.py»: из-за особенности форматирования строк библиотека резолвит несуществующий кастомный пайплайн в файл None.py и исполняет его. |
| CVE-2026-45804 | 7.5 | Состояние гонки (TOCTOU): загрузка идёт двумя последовательными HTTP-запросами, а проверка — только на первом. В окно около 0,3 секунды между запросами репозиторий подменяют. |
| CVE-2026-44513 | 8.8 | Три варианта одной проблемы: подгрузка пайплайна из чужого репозитория, обход через локальный снапшот и вредоносные кастомные компоненты. |
Общий знаменатель — рассинхрон «время проверки vs. время использования». Если между моментом, когда защита сказала «код безопасен», и моментом, когда код реально загрузился, что-то поменялось (имя файла, содержимое репозитория, путь к снапшоту), запускается уже не то, что проверяли.
Под ударом — все, кто вызывает DiffusionPipeline.from_pretrained с кастомными пайплайнами и версией Diffusers ниже 0.38.0. Практически это разработчики, дата-сайентисты и CI-конвейеры, которые тянут модели прямо с Hugging Face Hub. Результат обхода — выполнение произвольного кода в контексте процесса: кража токенов доступа и ключей, доступ к данным, закрепление в системе.
Это классическая проблема цепочки поставок ИИ: доверять принято самой платформе, а опасность приезжает внутри конкретного «файла модели» от стороннего автора. Признаков массовой эксплуатации в дикой природе на момент публикации нет, но публичный разбор снижает порог входа для атакующих.
pip install -U diffusers..py. Перед вызовом from_pretrained загляните в скачанную папку модели: неожиданные Python-файлы — красный флаг.custom_pipeline на недоверенные репозитории. Именно этот путь чаще всего и приводит к запуску чужого кода.Любой файл, который «умеет» исполнять код при открытии, стоит воспринимать как программу, а не как данные. Полезно заранее знать, какие расширения опасны, — мы собрали их в карте опасных расширений, а базовые правила проверки загрузок — в разделе безопасность файлов.
Официальные модели из проверенных репозиториев риска не несут. Опасность возникает, когда вы загружаете стороннюю модель с кастомным пайплайном на уязвимой версии Diffusers. Обновление до 0.38.0+ закрывает все три сценария.
Нет. Смысл FaceHugger именно в том, что код исполняется в обход этого флага. Единственная надёжная мера — обновить библиотеку; отказ от кастомных пайплайнов из непроверенных источников — дополнительная страховка.
Сам по себе .safetensors задумывался как безопасный формат хранения весов без исполняемого кода. В FaceHugger проблема не в весах, а в подключении Python-кода пайплайна. Но модели в старом формате .bin (Python pickle) — отдельный давний риск, их лучше избегать.