Перейти к содержанию
Публикация AiManual

Safetensors: аудит безопасности подтвердил отсутствие критических уязвимостей

Внешний аудит safetensors подтвердил: критических уязвимостей нет, а Rust и архитектура без исполняемого кода делают формат безопаснее pickle. Разбираем результ

Коротко

Что будет в материале

  1. 01

    Что такое safetensors и почему он появился

  2. 02

    Результаты внешнего аудита безопасности

  3. 03

    Почему Rust повышает безопасность safetensors

  4. 04

    Сравнение безопасности: safetensors vs pickle

Что такое safetensors и почему он появился

Safetensors - это формат хранения тензоров для моделей машинного обучения, который исключает выполнение произвольного кода при загрузке. Его разработали Hugging Face, EleutherAI и Stability AI как замену pickle, который десятилетиями оставался стандартом сериализации в Python-экосистеме ML. Проблема pickle не в удобстве, а в его природе: десериализация pickle-файла может запустить любой код, встроенный в файл. Для моделей, которые распространяются через открытые хабы и загружаются тысячами разработчиков, это создаёт неприемлемый риск.

Формат safetensors решает задачу на уровне архитектуры. Файл содержит только сырые тензоры и метаданные, без байткода и инструкций для интерпретатора. Загрузить вредоносную модель через safetensors нельзя в принципе, потому что загружать там нечего, кроме чисел. Это ключевое отличие от pickle, где файл по сути является программой.

Проблема pickle: уязвимость к вредоносным файлам

Pickle сериализует объекты Python вместе с их состоянием и методами. При загрузке pickle-файла Python восстанавливает объект, выполняя инструкции из файла. Если злоумышленник встроит в pickle-файл вызов os.system() или subprocess.Popen(), этот код выполнится с правами пользователя, который открыл файл. Для ML-инженера это означает, что загрузка чужой модели может привести к запуску вредоносного скрипта, краже данных или компрометации сервера.

Атаки через pickle известны с 2018 года, когда исследователи публиковали демонстрации вредоносных моделей PyTorch. Файл весов модели размером в сотни мегабайт может содержать скрытый код, который активируется при вызове torch.load(). Даже доверенные источники не гарантируют безопасность: репозиторий может быть скомпрометирован, а цепочка зависимостей - подменена. В 2024-2026 годах количество моделей на Hugging Face Hub превысило 2.2 миллиона, и ручная проверка каждого файла стала невозможной.

Safetensors: безопасная альтернатива

Safetensors хранит тензоры в бинарном формате с отдельным JSON-заголовком для метаданных. В файле нет исполняемого кода, нет ссылок на классы Python, нет механизма десериализации объектов. Загрузка сводится к чтению байтов и восстановлению тензоров по описанию из заголовка. Это делает формат безопасным по построению, а не по соглашению.

Разработка велась совместно тремя организациями, каждая из которых имела свои требования к скорости и совместимости. Hugging Face нужен был формат для Hub, EleutherAI - для больших языковых моделей, Stability AI - для диффузионных моделей. Результат получился универсальным: safetensors поддерживает тензоры произвольной размерности, работает с PyTorch, TensorFlow, JAX и NumPy, и не зависит от версии Python.

Результаты внешнего аудита безопасности

Hugging Face, EleutherAI и Stability AI заказали внешний аудит безопасности библиотеки safetensors. Аудит подтвердил: критических уязвимостей, позволяющих выполнение произвольного кода, нет. Это важный результат для формата, который претендует на роль стандарта в индустрии. Проверка проводилась независимыми специалистами по безопасности, не аффилированными с разработчиками safetensors.

Аудит выявил незначительные неточности в спецификации и несколько недостающих проверок входных данных. Все найденные проблемы уже исправлены. Дополнительно команда улучшила тестовый набор, чтобы предотвратить регрессии в будущих версиях. Такой подход - заказать внешний аудит и публично раскрыть результаты - редкость для open-source проектов, но именно он формирует доверие к формату.

Ключевые находки аудита

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

Ни одна из находок не позволяла выполнить код или получить доступ к памяти за пределами выделенного буфера. Это подтверждает архитектурное преимущество safetensors: даже ошибки в реализации не приводят к катастрофическим последствиям, потому что формат не содержит исполняемых инструкций.

Исправления и улучшения после аудита

Разработчики внесли исправления в код и обновили спецификацию, чтобы устранить расхождения. Тестовый набор расширен кейсами, которые воспроизводят найденные граничные условия. Это стандартная практика для проектов с высокими требованиями к надёжности: каждый найденный баг превращается в тест, который не даст ему вернуться.

Для пользователей это означает, что текущая версия safetensors прошла независимую проверку и стала строже к входным данным. Модели, которые загружались раньше, продолжат работать, а некорректные файлы теперь отклоняются с понятными ошибками.

Почему Rust повышает безопасность safetensors

Библиотека safetensors написана на Rust. Этот выбор даёт гарантии безопасности памяти на уровне компилятора: Rust исключает целые классы уязвимостей, включая переполнение буфера, use-after-free и гонки данных. Для парсера бинарного формата это критично, потому что парсер - первая линия обороны против вредоносных файлов.

В C или C++ ошибка в обработке размера тензора может привести к записи за пределы буфера и последующему выполнению кода. В Rust такие ошибки невозможны в safe-коде: компилятор отклоняет код с потенциальным нарушением владения памятью. Это добавляет дополнительный уровень защиты, который не зависит от внимательности разработчика.

Rust также упрощает кросс-платформенную сборку. Библиотека safetensors компилируется в нативный код для Linux, macOS и Windows, а биндинги для Python распространяются через pip. Пользователь получает скорость нативного кода без необходимости устанавливать компилятор или собирать расширения вручную.

Сравнение безопасности: safetensors vs pickle

Прямое сравнение двух форматов показывает, почему переход на safetensors - это не вопрос предпочтений, а вопрос базовой гигиены. Pickle может выполнить произвольный код при загрузке. Safetensors не может. Pickle зависит от версии Python и структуры классов. Safetensors хранит только тензоры и метаданные. Pickle медленнее при загрузке больших файлов из-за накладных расходов на десериализацию объектов. Safetensors читает байты напрямую в память.

Для ML-инженера, который загружает десятки моделей в день, разница в скорости становится заметной. Для компании, которая внедряет AI в production, разница в безопасности становится критичной. Один вредоносный pickle-файл может скомпрометировать весь пайплайн.

Риски pickle: почему стоит отказаться

Вредоносные модели через pickle - не теоретическая угроза. В открытых репозиториях периодически находят файлы с встроенным кодом, который собирает переменные окружения, читает SSH-ключи или устанавливает бэкдоры. Даже если модель скачана с доверенного хаба, цепочка поставки может быть скомпрометирована на этапе загрузки или зеркалирования.

Отказ от pickle - это устранение целого вектора атак. Команды, которые переходят на safetensors, убирают необходимость запускать модели в изолированных средах только ради проверки безопасности. Это экономит время и снижает сложность инфраструктуры.

Преимущества safetensors в безопасности и скорости

Safetensors загружается быстрее pickle за счёт прямого отображения файла в память. Для моделей на несколько гигабайт разница может составлять секунды на каждую загрузку. В CI/CD-пайплайнах, где модели загружаются при каждом запуске тестов, это накапливается в минуты и часы.

Безопасность не требует компромиссов: формат не выполняет код, не зависит от версии Python и не требует доверия к источнику файла. Модель можно скачать из любого источника и загрузить без риска, что она запустит произвольный код. Это особенно важно для open-source экосистемы, где модели распространяются свободно и часто без проверки.

Планы по интеграции safetensors в экосистему Hugging Face

Hugging Face, EleutherAI и Stability AI планируют сделать safetensors форматом по умолчанию для сохранения моделей в экосистеме Hugging Face. Библиотека будет включена в transformers как базовая зависимость. Это означает, что каждый пользователь transformers автоматически получит поддержку safetensors без дополнительной установки.

Переход будет постепенным: сначала safetensors станет рекомендуемым форматом для новых моделей, затем - форматом по умолчанию для сохранения. Обратная совместимость с pickle сохранится, но новые модели будут публиковаться преимущественно в safetensors.

Включение в transformers как базовой зависимости

Когда safetensors станет базовой зависимостью transformers, разработчикам не нужно будет вручную устанавливать библиотеку или конвертировать модели. Вызов model.save_pretrained() будет автоматически сохранять веса в формате safetensors, если он доступен. Загрузка через from_pretrained() будет автоматически определять формат файла и использовать соответствующий парсер.

Это снижает порог входа: разработчик, который никогда не слышал о safetensors, начнёт использовать его по умолчанию. Безопасность станет стандартом, а не опцией.

Что это значит для разработчиков

Для ML-инженеров переход на safetensors означает меньше ручной работы и меньше рисков. Не нужно конвертировать модели, не нужно проверять файлы на вредоносный код, не нужно запускать загрузку в песочнице. Достаточно обновить transformers до версии с поддержкой safetensors и продолжить работу.

Рекомендуется начать использовать safetensors уже сейчас, не дожидаясь официального перехода. Многие популярные модели на Hugging Face Hub уже имеют файлы .safetensors. Загрузка таких моделей работает через стандартный API transformers, а выигрыш в безопасности и скорости доступен сразу.

Практическое применение safetensors

Использовать safetensors в проектах просто: API повторяет привычные методы transformers. Для сохранения модели в безопасном формате достаточно передать параметр safe_serialization=True. Для загрузки ничего менять не нужно - библиотека сама определит формат файла.

Многие популярные модели уже опубликованы в safetensors. На Hugging Face Hub файлы .safetensors лежат рядом с .bin, и разработчик может выбрать безопасный вариант без потери совместимости. Переход на safetensors не требует изменения кода модели или пайплайна обучения.

Примеры кода: сохранение и загрузка

Сохранение модели в safetensors:

from transformers import AutoModel

model = AutoModel.from_pretrained("bert-base-uncased")
model.save_pretrained("./model", safe_serialization=True)

Загрузка модели из safetensors:

from transformers import AutoModel

model = AutoModel.from_pretrained("./model")

API идентичен pickle-версии. Разница только в том, что файл model.safetensors не содержит исполняемого кода и загружается быстрее. Для моделей с несколькими шардами весов safetensors поддерживает ту же структуру файлов, что и pickle.

Доступные модели в формате safetensors

На Hugging Face Hub тысячи моделей уже имеют файлы .safetensors. Среди них - популярные языковые модели, диффузионные модели и энкодеры. Пользователи могут загружать их напрямую через from_pretrained(), указав репозиторий модели. Библиотека transformers автоматически выберет safetensors, если файл доступен.

Для моделей, которые ещё не конвертированы, можно выполнить конвертацию локально с помощью скрипта convert.py из репозитория safetensors. Процесс занимает минуты и не требует переобучения: веса просто пересохраняются в новый формат.

Ограничения и будущие улучшения

Аудит выявил незначительные неточности в спецификации, которые были исправлены. Это указывает на необходимость дальнейшего тестирования, особенно на граничных условиях и нестандартных тензорах. Формат safetensors молод, и его спецификация продолжает уточняться.

Планы по включению safetensors в transformers как базовой зависимости могут занять время. Экосистема Hugging Face огромна, и изменение зависимостей затрагивает тысячи проектов. Команда действует осторожно, чтобы не сломать обратную совместимость.

Сообщество продолжает работать над улучшением формата: расширяется поддержка новых типов данных, оптимизируется скорость загрузки, добавляются инструменты для конвертации. Безопасность моделей машинного обучения - тема, которая будет только набирать важность по мере роста числа моделей и их проникновения в production-системы. Статьи о безопасности AI-агентов и автоматизации AppSec показывают, что индустрия движется к более строгим стандартам проверки кода и артефактов. Safetensors - часть этого тренда: безопасность встраивается в формат данных, а не добавляется поверх.

Подписаться на канал