Новости · Безопасность файлов

FaceHugger: три дыры в Hugging Face Diffusers превращают ИИ-модель в исполняемый код

Мы привыкли, что «опасный файл» — это подозрительное вложение в письме или архив с паролем. Но файлом, который запускает чужой код, может оказаться и вполне безобидная на вид ИИ-модель. Исследователи показали, как специально собранная модель на Hugging Face тихо выполняет команды на компьютере разработчика ещё до того, как хоть что-то сгенерирует.

Коротко: набор уязвимостей FaceHugger в библиотеке Hugging Face Diffusers позволяет вредоносной ИИ-модели обойти защиту trust_remote_code и запустить произвольный код прямо при загрузке через from_pretrained. Три CVE закрыты в Diffusers 0.38.0 — обновитесь и не грузите модели из непроверенных репозиториев.

5 августа 2026 Редакция LoadFile Чтение 6 мин
Контейнер ИИ-модели со скрытым вредоносным кодом внутри
Содержание
  1. Что случилось
  2. ИИ-модель — это набор файлов, а trust_remote_code — её «замок»
  3. Как работают три уязвимости
  4. Кому и чем это грозит
  5. Что делать
  6. Частые вопросы
  7. Источники

Что случилось

Исследователи компании Zafran Security (Гал Забан и Идо Шани) раскрыли три уязвимости в Diffusers — популярной Python-библиотеке Hugging Face, на которой запускают генеративные модели вроде Stable Diffusion. Набор дыр получил общее имя FaceHugger. Суть проста: собранный злоумышленником репозиторий модели заставляет библиотеку выполнить произвольный код на машине, которая эту модель загружает.

По данным Zafran, о проблемах сообщили Hugging Face 19 марта 2026 года, CVE опубликовали в мае, а публичный разбор вышел 27 июля 2026 года и разошёлся по профильным изданиям в начале августа. Масштаб потенциального охвата большой: только за июль 2026 года Diffusers скачали более 8,1 млн раз.

ИИ-модель — это набор файлов, а trust_remote_code — её «замок»

ИИ-модель на Hugging Face — это не один бинарник, а набор файлов: веса (обычно .safetensors или .bin), конфиги и, что важно, иногда собственный код пайплайна на Python. Когда вы вызываете DiffusionPipeline.from_pretrained("автор/модель"), библиотека скачивает эти файлы и может подключить кастомный пайплайн — то есть чужой .py-файл из репозитория.

trust_remote_code — это как раз защитный «замок»: флаг, который должен требовать явного согласия пользователя, прежде чем выполнить любой присланный вместе с моделью код. Идея в том, что без вашего «да» неотревьюенный Python из чужого репозитория не запустится. FaceHugger показывает, что этот замок можно открыть в обход — модель-файл исполняет код, хотя вы такого разрешения не давали.

!
Почему это про файлы

Загрузка модели ничем не отличается от открытия документа: программа читает присланные файлы и что-то с ними делает. Если формат позволяет протащить внутрь исполняемый код, «открытие» превращается в запуск — ровно как со спрятанным вредоносом в SVG-картинках или разбором недоверенного JSON.

Как работают три уязвимости

Корень проблемы один: проверка trust_remote_code выполняется в первой фазе загрузки, а фактический код подключается позже. Любой приём, при котором загрузчик видит код, которого «не заметил» контроль, обходит защиту. Zafran описали три сценария.

CVECVSSМеханизм обхода
CVE-2026-448278.8Инъекция кода через «None.py»: из-за особенности форматирования строк библиотека резолвит несуществующий кастомный пайплайн в файл None.py и исполняет его.
CVE-2026-458047.5Состояние гонки (TOCTOU): загрузка идёт двумя последовательными HTTP-запросами, а проверка — только на первом. В окно около 0,3 секунды между запросами репозиторий подменяют.
CVE-2026-445138.8Три варианта одной проблемы: подгрузка пайплайна из чужого репозитория, обход через локальный снапшот и вредоносные кастомные компоненты.

Общий знаменатель — рассинхрон «время проверки vs. время использования». Если между моментом, когда защита сказала «код безопасен», и моментом, когда код реально загрузился, что-то поменялось (имя файла, содержимое репозитория, путь к снапшоту), запускается уже не то, что проверяли.

Кому и чем это грозит

Под ударом — все, кто вызывает DiffusionPipeline.from_pretrained с кастомными пайплайнами и версией Diffusers ниже 0.38.0. Практически это разработчики, дата-сайентисты и CI-конвейеры, которые тянут модели прямо с Hugging Face Hub. Результат обхода — выполнение произвольного кода в контексте процесса: кража токенов доступа и ключей, доступ к данным, закрепление в системе.

Это классическая проблема цепочки поставок ИИ: доверять принято самой платформе, а опасность приезжает внутри конкретного «файла модели» от стороннего автора. Признаков массовой эксплуатации в дикой природе на момент публикации нет, но публичный разбор снижает порог входа для атакующих.

Что делать

  1. Обновите Diffusers до 0.38.0 или новее. В этой версии проверки перенесли на шаг динамической загрузки модуля, закрыв все три CVE. Команда: pip install -U diffusers.
  2. Грузите модели только из проверенных источников. Официальные и аудированные репозитории — да; случайный форк «с интересным пайплайном» — нет.
  3. Проверяйте локальные снапшоты на лишние .py. Перед вызовом from_pretrained загляните в скачанную папку модели: неожиданные Python-файлы — красный флаг.
  4. Не указывайте custom_pipeline на недоверенные репозитории. Именно этот путь чаще всего и приводит к запуску чужого кода.
  5. Ограничьте среду. Контроль исходящего трафика (egress), сегментация и гигиена секретов уменьшают ущерб, если код всё-таки запустится.
!
Общий принцип

Любой файл, который «умеет» исполнять код при открытии, стоит воспринимать как программу, а не как данные. Полезно заранее знать, какие расширения опасны, — мы собрали их в карте опасных расширений, а базовые правила проверки загрузок — в разделе безопасность файлов.

Частые вопросы

Мой обычный Stable Diffusion теперь опасен?

Официальные модели из проверенных репозиториев риска не несут. Опасность возникает, когда вы загружаете стороннюю модель с кастомным пайплайном на уязвимой версии Diffusers. Обновление до 0.38.0+ закрывает все три сценария.

Достаточно ли не включать trust_remote_code?

Нет. Смысл FaceHugger именно в том, что код исполняется в обход этого флага. Единственная надёжная мера — обновить библиотеку; отказ от кастомных пайплайнов из непроверенных источников — дополнительная страховка.

Файлы весов .safetensors тоже опасны?

Сам по себе .safetensors задумывался как безопасный формат хранения весов без исполняемого кода. В FaceHugger проблема не в весах, а в подключении Python-кода пайплайна. Но модели в старом формате .bin (Python pickle) — отдельный давний риск, их лучше избегать.

Источники

Читайте также