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

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

- Канонический HTML: [/incidents/pytorch-nightly-torchtriton](https://ai-first.tech/incidents/pytorch-nightly-torchtriton)
- Язык: русский
- Редакционный принцип: защитный контекст без вредоносных полезных нагрузок и инструкций обхода.

- Дата: 2022-12-25
- Категория: Цепочка поставки
- Затронуто: Пользователи ночных сборок PyTorch (PyTorch-nightly) для Linux, установленных через pip с 25 по 30 декабря 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.

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

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

## Меры защиты

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

Связанные карточки угроз: A47, A21

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

- [Compromised PyTorch-nightly dependency chain between December 25th and December 30th, 2022](https://pytorch.org/blog/compromised-nightly-dependency/) — PyTorch
- [PyTorch discloses malicious dependency chain compromise over holidays](https://www.bleepingcomputer.com/news/security/pytorch-discloses-malicious-dependency-chain-compromise-over-holidays/) — BleepingComputer
