Угрозы безопасности при загрузке нейросетей: скрытая опасность в open-source моделях 3:15
Загрузка предобученных моделей с популярных платформ, таких как Hugging Face Hub, стала привычным делом для исследователей и разработчиков. Однако, по словам ведущего канала Янника Килчера (Yannic Kilcher), эта практика таит в себе серьезную уязвимость: при загрузке модели на ваш компьютер может быть исполнен произвольный вредоносный код. Проблема заключается не в самой концепции нейросетей, а в механизмах сериализации данных, которые используются в экосистеме Python и PyTorch.
Как работает уязвимость: магия и опасность pickle 5:25
В основе работы большинства моделей лежит процесс сохранения и загрузки весов. В библиотеке PyTorch, которая является стандартом индустрии, для этого используется метод torch.save. В свою очередь, torch.save опирается на стандартный модуль Python под названием pickle.
- Принцип Pickle: Этот модуль предназначен для сериализации объектов — превращения сложной структуры данных в поток байтов, который можно сохранить на диск, а затем восстановить в памяти.
- Тьюринг-полнота: В отличие от форматов вроде JSON,
pickleпозволяет сохранять практически любые объекты Python. Чтобы восстановить состояние этих объектов при загрузке (unpickling),pickleвынужден исполнять код. - Исполняемая среда: Янник Килчер демонстрирует, что при десериализации
pickleвызывает специальные «магические» методы (например,__reduce__), которые фактически указывают Python, какой код нужно выполнить для воссоздания объекта.
По мнению ведущего, это превращает любой загружаемый .bin или .pt файл модели в потенциальный «троянский конь». Злоумышленник может создать модель, которая при вызове from_pretrained втайне от пользователя откроет браузер, запустит криптомайнер или установит кейлоггер для перехвата паролей.
Создание «вредоносной» модели: эксперимент с eval и exec 14:14
Чтобы наглядно показать опасность, Килчер разработал библиотеку patch-torch-save (доступную на GitHub), которая позволяет внедрить произвольный код в процесс сохранения модели. Механика этого «эксперимента» выглядит следующим образом:
- Захват функции: Библиотека берет исходный код функции, которую хочет исполнить злоумышленник (например, открытие веб-сайта).
- Манипуляция: Вместо стандартного словаря весов создается «плохой» объект (
bad_dict), который при загрузке черезtorch.loadиспользует функцииevalиexec. - Исполнение: В момент, когда пользователь вызывает метод
from_pretrained, Python парсит и исполняет внедренный код, а затем «подменяет» его оригинальными данными модели, чтобы пользователь ничего не заподозрил.
Автор подчеркивает: с точки зрения разработчика, использующего готовую модель, процесс выглядит абсолютно легитимно, а сама модель продолжает исправно работать.
Меры безопасности и реакция индустрии 17:30
Официальная документация Python и самого PyTorch содержат предупреждения: «Используйте pickle только для тех данных, которым вы доверяете». Однако, как отмечает Килчер, эти предупреждения часто игнорируются пользователями, а многие платформы долгое время не акцентировали внимание на этом риске.
В процессе подготовки материала автор связался с командой Hugging Face, чтобы обсудить проблему. В результате диалога:
- Информационные баннеры: В документации Hugging Face появились предупреждения о рисках безопасности при загрузке моделей.
- Сканеры вредоносного ПО: На платформе начали внедрять системы автоматического сканирования моделей на наличие подозрительного кода.
- Ограниченность решений: По мнению Килчера, единственным фундаментальным решением является повышение осведомленности сообщества, так как полностью исключить риск при использовании
pickleкрайне сложно.