
CVE-2026-4372: модель угроз, анализ первопричины, воспроизведение и обнаружение
Оборонительный анализ критической уязвимости удалённого выполнения кода (RCE) в библиотеке Hugging Face
transformers.
| Поле | Значение |
|---|---|
| Идентификатор | CVE-2026-4372 / GHSA-29pf-2h5f-8g72 |
| Компонент | Hugging Face transformers |
| Класс | Удалённое выполнение кода (CWE-94, внедрение кода) |
| Точка входа | AutoModelForCausalLM.from_pretrained(), при загрузке модели |
| Механизм | Настройка внимания в config.json модели (attn_implementation / _attn_implementation_internal) заставляет библиотеку скачивать и запускать код атакующего |
| Ключевое свойство | Обходит trust_remote_code=False — настройку, на которую пользователи полагаются именно для предотвращения подобного |
| Исправлено в | transformers 5.3.0 |
Пользователь, который намеренно оставил trust_remote_code=False ради безопасности, всё равно оставался уязвимым.
Проверьте приведённые ниже сведения по официальным источникам, прежде чем считать их окончательными:
В обращении циркулируют два описания триггера:
config.json (_attn_implementation_internal).kernels, часто устанавливаемый через transformers[all].Скорее всего, это один и тот же путь: поле внимания указывает на репозиторий Hub, а
пакет kernels скачивает из него код и запускает его. Считайте приведённые здесь имена полей
предварительными, пока коммит с исправлением их не подтвердит.
[ Model repo on the Hub ] untrusted source
│ config.json, tokenizer, weights, (code)
▼
[ Download to local cache ]
▼
[ Read config.json ] settings become a config object
▼
[ Pick model class + attention type ]
▼
[ Build model, load weights ]
▼
[ Model runs in the user's process, with the user's permissions ]
| # | Граница | Защита, которая должна применяться |
|---|---|---|
| TB-1 | Hub → локальный диск | Доверенные репозитории, привязка к фиксированному коммиту |
| TB-2 | Файл конфигурации → объект конфигурации | Разрешены только известные безопасные значения |
| TB-3 | Объект конфигурации → исполняемый код | trust_remote_code |
| TB-4 | Модель → операционная система | Песочница, минимальные привилегии |
Ошибка представляет собой сбой на уровне TB-3: значение из файла конфигурации достигло исполнения кода, не пройдя проверку trust_remote_code.
В каждом случае жертва выполняет лишь обычный вызов,
AutoModelForCausalLM.from_pretrained("<repo-id>").
trust_remote_code защищает один способ запуска кода из репозитория: пользовательские файлы modeling_*.py.
Настройка attention была вторым способом, который никогда не проходил через эту защиту.
untrusted config.json attention setting
│
▼
"pick attention type" logic
│ never checks:
✗ ─────────────▶ trust_remote_code
▼
download + run code from the Hub (via `kernels`)
_) всё ещё можно было задать из недоверенного файла.kernels) незаметно включал атаку при установке, например через transformers[all].Защищайте опасное действие, а не один путь к нему. Каждый путь, который может привести к «выполнению кода», должен проходить одну и ту же проверку.
Защита — это один самодостаточный скрипт, defence/safe_load.py.
Его функция safe_from_pretrained() заменяет from_pretrained() и выполняет четыре проверки
до загрузки любой модели. Если одна из них не проходит, он выбрасывает UnsafeModelLoad, и ничего не загружается.
| # | Проверка | Что она делает |
|---|---|---|
| 1 | Версия | Отказывает, если transformers старше 5.3.0. Это и есть настоящее исправление. |
| 2 | Kernels | На старой версии отказывает, если установлен пакет kernels, поскольку атаке он нужен. |
| 3 | Конфигурация | Читает конфигурационные файлы модели и отказывает, если они содержат рискованную настройку (см. ниже). Модели из Hub проверяются и загружаются на одном и том же коммите. |
| 4 | Удалённый код | Всегда устанавливает trust_remote_code=False. Это лишь хорошая практика: данная CVE обходит её. |
Старая версия отклоняется на проверке 1. Проверки 2 и 3 выполняются на старой версии, только если
задана лабораторная опция allow_vulnerable_env=True.
Что блокирует проверка 3:
attn_implementation, _attn_implementation,
_attn_implementation_internal), которая не является встроенной. Разрешены только eager, sdpa,
flash_attention_2, flash_attention_3 и flex_attention, поэтому значение
вроде attacker-org/evil-kernel блокируется, даже внутри вложенной подконфигурации._attn_implementation_internal, auto_map и custom_pipelines.config=, поскольку она обошла бы проверку.Для моделей из Hub скачиваются только конфигурационные файлы, никогда — веса или код. Они
скачиваются на одном фиксированном коммите, и затем модель загружается с того же коммита,
поэтому файлы нельзя подменить между проверкой и загрузкой. После ознакомления с
предупреждениями человек может переопределить проверку 3 с помощью accept_findings=True.
| Ситуация | Что останавливает атаку |
|---|---|
transformers 5.3.0 или новее | Проверка 1 |
Старая версия, установлен kernels | Проверка 2 |
| Старая версия, рискованная настройка в конфигурации | Проверка 3 |
| Репозиторий изменён после проверки | Проверка 3 (проверяется и загружается один и тот же коммит) |
Ограничение: проверка 3 знает только перечисленные выше настройки, поэтому она не может поймать новую
атаку. Обновление до transformers>=5.3.0 — единственное полное исправление.
Компонент обнаружения выявляет потенциально небезопасные конфигурации моделей Hugging Face и уязвимые зависимости, связанные с CVE-2026-4372. Он предоставляет два независимых механизма обнаружения: статическое сканирование конфигурации и анализ зависимостей.
В отличие от компонента защиты, эти инструменты сообщают о потенциальных рисках безопасности, не загружая модели и не выполняя недоверенный код.
Файл: src/detection/static_detector.py