Цепочка поставки · 25 декабря 2022

Подмена зависимости torchtriton в ночных сборках PyTorch

На PyPI был загружен пакет torchtriton с тем же именем, что и зависимость ночных сборок PyTorch из собственного индекса проекта, но с более высокой версией. Из-за приоритета PyPI pip устанавливал подменённый пакет, который собирал системную информацию, SSH-ключи и файлы из домашнего каталога. Стабильные версии PyTorch не пострадали.

Иллюстрация к инциденту «Подмена зависимости torchtriton в ночных сборках PyTorch»
ЗатронутоПользователи ночных сборок PyTorch (PyTorch-nightly) для Linux, установленных через pip с 25 по 30 декабря 2022 года
КритичностьВысокий
Дата25 декабря 2022

Что произошло

25 декабря 2022 года на PyPI появился пакет torchtriton, совпадающий по имени с зависимостью ночных сборок PyTorch. С 25 по 30 декабря пользователи, устанавливавшие PyTorch-nightly для Linux через pip, получали его вместо легитимной версии. Вредоносный бинарный файл собирал имя хоста и пользователя, переменные окружения, содержимое /etc/passwd, конфигурацию git, файлы из каталога .ssh и до тысячи файлов из домашнего каталога. Данные отправлялись через зашифрованные DNS-запросы. PyTorch узнал о проблеме 30 декабря и раскрыл её публично. По данным BleepingComputer, за неделю пакет скачали более 2300 раз; автор пакета заявил, что действовал в исследовательских целях.

Где нарушилась защита

PyTorch распространял зависимость через собственный индекс, но не зарезервировал то же имя на PyPI. Граница доверия нарушилась из-за поведения pip: при одновременном использовании нескольких индексов он выбирает пакет с наибольшей версией, и публичный реестр оказался приоритетнее доверенного. Это классическая подмена зависимости (dependency confusion), направленная на ML-исследователей и инженеров.

Последствия

  • Вредоносный пакет устанавливался вместе с ночными сборками PyTorch в течение пяти дней
  • По данным BleepingComputer, более 2300 загрузок за неделю
  • С затронутых машин могли быть похищены SSH-ключи, переменные окружения и файлы из домашнего каталога

Реакция

PyTorch заменил зависимость на pytorch-triton, зарегистрировал заглушку на PyPI, удалил затронутые ночные сборки и через PyPI получил контроль над именем torchtriton.

Уроки для бизнеса

  1. Внутренние и частные имена пакетов нужно резервировать в публичных реестрах
  2. Экспериментальные сборки ML-фреймворков часто ставят на машины с доступом к ценным данным и ключам
  3. Смешивание публичных и частных индексов без явного приоритета создаёт риск подмены

Меры, которые предотвратили бы инцидент

  • Единый внутренний прокси-репозиторий с явным приоритетом источников для каждого пакета
  • Фиксация версий и хэшей зависимостей ML-окружений
  • Запрет ночных и экспериментальных сборок в средах с доступом к производственным данным
  • Мониторинг аномальных DNS-запросов с машин разработчиков и серверов обучения
Проверка фактов

Первоисточники

PyTorch · 2022-12-31Compromised PyTorch-nightly dependency chain between December 25th and December 30th, 2022BleepingComputer · 2023-01-01PyTorch discloses malicious dependency chain compromise over holidays