pypi


PyTorch обнаружил вредоносную зависимость с тем же именем, что и у библиотеки torchtriton во фреймворке. Это привело к успешной компрометации через вектор атаки путаницы зависимостей. Подробности — к старту нашего курса «Белый хакер».


Администрация PyTorch предупреждает пользователей, которые установили PyTorch-nightly в праздничные дни, о том, что нужно удалить фреймворк и его поддельную зависимость torchtriton.


ML-фреймворк PyTorch с открытым кодом получил широкое распространение в коммерческой и академической сферах, от компьютерного зрения до обработки естественного языка.


Вредоносная torchtriton нацелена на пользователей PyTorch-nightly


Как предупреждает команда PyTorch, пользователи, установившие PyTorch-nightly с 25 по 30 декабря 2022 года должны убедиться, что их системы не скомпрометированы.


Предупреждение последовало после появления зависимости torchtriton в праздничные дни в реестре Python Package Index (PyPI) — официальном репозитории стороннего ПО для Python.


«Пожалуйста, немедленно удалите его [PyTorch] и torchtriton, используйте последние бинарники nightly, новее 30 декабря 2022 года», — советует команда PyTorch.

Вредоносная зависимость PyTorch от PyPI


Вредоносная torchtriton на PyPI названа как официальная библиотека, опубликованная в репозитории PyTorch-nightly. При извлечении зависимостей экосистемы Python приоритет PyPI выше, поэтому скачивается вредоносный, а не штатный пакет PyTorch.


«Поскольку PyPI index имеет приоритет, этот вредоносный пакет устанавливался вместо версии из нашего официального репозитория. Такой дизайн позволяет любому человеку зарегистрировать пакет с тем же именем, что и существующий в индексе третьей стороны, и pip установит свою версию по умолчанию», — пишет команда PyTorch во вчерашнем посте с раскрытием уязвимости.


На момент написания [этого материала] BleepingComputer показал, что за прошедшую неделю [с 25 по 31 декабря] число скачиваний вредоносной зависимости torchtriton превысило 2300.


Этот тип атак через цепочки поставок известен как «путаница зависимостей». Впервые о путанице зависимостей сообщил в 2021 году BleepingComputer, когда этот вектор атаки популяризовал белый хакер Алекс Бирсон.


PyTorch заявляет, что пользователей стабильных пакетов PyTorch уязвимость не затрагивает.


Хакер крадёт конфиденциальные данные, заявляя о соотсветствующем этике исследовании


Вредоносный torchtriton не только исследует систему в поисках основных идентификационных сведений (например, IP-адреса, имени пользователя, текущего рабочего каталога), но и крадёт конфиденциальные данные:


  • Получает системную информацию:
    • сервера имён из /etc/resolv.conf;
    • имя хоста из gethostname();
    • текущее имя пользователя из getlogin();
    • имя текущего рабочего каталога из getcwd();
    • переменные окружения.
       
  • Читает следующие файлы:
    • /etc/hosts;
    • /etc/passwd;
    • Первую 1000 файлов в $HOME/*;
    • $HOME/.gitconfig;
    • $HOME/.ssh/*.

Затем он загружает все эти данные, в том числе содержимое файла, на домен h4ck.cfd.


Команда PyTorch объясняет, что вредоносный бинарник triton в поддельном torchtriton, выполняется, только когда пользователь импортирует triton в свою сборку. Это требует явного кода, то есть не является поведением PyTorch по умолчанию.


Уведомление на домене h4ck.cfd подразумевает, что вся операция является этическим анализом (ethical research), но анализ однозначно указывает на обратное.


«Здравствуйте, если вы наткнулись на это в своих логах, вероятно, это связано с тем, что ваш Python был неправильно сконфигурирован и был уязвим к атаке путаницы зависимостей. Для идентификации уязвимых компаний скрипт отправляет мне метаданные о хосте (такие как имя хоста и текущий рабочий каталог). После того как я определил, кто оказался уязвим, и [сообщил] о найденном, все метаданные о вашем сервере будут удалены».

Вопреки приведённой формулировке бинарный файл собирает не только «метаданные», но и упомянутые выше секретные сведения, включая SSH-ключи и файлы gitconfighosts и passwd, а также содержимое 1000 файлов из каталога HOME.


BleepingComputer получил копию вредоноса, который, согласно VirusTotal, на момент написания материала показывает чистую репутацию. Но не дайте себя обмануть.


Мы заметили, что, в отличие от нескольких исследовательских пакетов и PoC-эксплойтов, которые бросаются в глаза из-за своих целей и поведения, torchtriton во избежание обнаружения использует известные технологии anti-VM. Что важнее, «полезные данные» вредоноса замаскированы и содержатся исключительно в двоичном виде, например, в файлах Linux ELF. Это выделяет библиотеку на фоне "белых" эксплойтов путаницы зависимостей прошлого доставлялись в виде простого текста.


Мы заметили, что экземпляр читает .bash_history (список команд и ввода пользователя в терминал, а это — ещё один признак вредоносного ПО.


Это не первый случай, когда хакер заявляет, что его действия представляют собой белое хакерство, как только его ловят на эксфильтрации секретов.


В середине 2022 года весьма популярные библиотеки Python и PHP — ctx и PHPass соответственно — были компрометированы и изменены для кражи ключей AWS. Позднее исследователь, стоящий за атакой, заявил, что атака была исследованием, соответствующем этике.


Во избежание сомнений мы обратились за разъяснениями к владельцу h4ck.cfd. Публичные записи показывают, что домен зарегистрирован через Namecheap 21 декабря, всего за несколько дней до происшествия.


Ниже — полный текст заявления. Его мы получили от владельца домена, который, по-видимому, также связан с доменом wheezy.io.


Обратите внимание, что упоминание «Facebook» (эта организация в России признана экстремистской и запрещена) ниже уместно с учётом концепции PyTorch в Meta AI (Meta также признана экстремистской и запрещена в России). 


«Привет, я — человек, который заявил права на пакет torchtriton на PyPi. Обратите внимание, что он не был задуман как вредоносный!

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

Я признаю свою вину и приношу свои извинения. В то же время я хочу заверить, что в мои намерения не входила кража чьих-то секретов. Я уже сообщил об этой уязвимости в Facebook 29 декабря (почти за три дня до объявления), после того, как убедился, что уязвимость действительно существует. Я также сделал многочисленные сообщения другим компаниям, которые пострадали от этой уязвимости, через свои программы HackerOne. Если бы у меня был злой умысел, я бы не стал заполнять отчёты баг-баунти, а просто продал бы данные тому, кто предложит самую высокую цену.

Ещё раз приношу свои извинения за любую дестабилизацию и заверяю, что все полученные мной данные удалены.

Кстати, в своём сообщении об ошибке на Facebook я уже предложил передать им пакет PyPi, но пока не получил от них никакого ответа».

Ответные меры


Команда PyTorch переименовала зависимость torchtriton в 'pytorch-triton' и зарезервировала на PyPI пакет-заглушку во избежание подобных атак. Группа стремится заявить о правах собственности на существующий torchtriton на PyPI, чтобы обезвредить текущую атаку.


PyTorch переименовывает зависимость во избежание дальнейших атак


PyTorch переименовывает зависимость во избежание дальнейших атак


Для удаления цепочки вредоносных зависимостей пользователям следует выполнить команды:


$ pip3 uninstall -y torch torchvision torchaudio torchtriton
$ pip3 cache purge

Запуск следующей команды приведёт к поиску вредоносного бинарного кода и покажет, подверглись ли вы атаке:


python3 -c "import pathlib;import importlib.util;s=importlib.util.find_spec('triton');
affected=any(x.name == 'triton' for x in (pathlib.Path(s.submodule_search_locations[0] 
if s is not None else '/' ) / 'runtime').glob('*'));
print('You are {}affected'.format('' if affected else 'not '))"

Хэш SHA256 ELF-бинарника "triton": 2385b29489cd9e35f92c072780f903ae2e517ed422eae67246ae50a5cc738a0e.


А мы научим вас аккуратно работать с данными, чтобы вы прокачали карьеру и стали востребованным IT-специалистом. Скидка 45% по промокоду HABR.




Комментарии (5)


  1. baldr
    11.01.2023 00:22

    Осталось подождать пока какой-то новый хакер узнает про невидимые Unicode-символы и появятся пакеты с именами типа requestsㅤ (Хабр может не показывать, но в конце есть невидимый символ \u3164, который относится к разряду букв).

    Даже визуально просматривая каждую строчку кода, невозможно это будет найти.


    1. Vadem
      11.01.2023 00:31
      +1

      Я не проверял, но вроде как нельзя не ASCII символы в именах пакетов: https://peps.python.org/pep-0508/#names


      1. baldr
        11.01.2023 00:40

        Спасибо, действительно, pip не хочет такое устанавливать. Не могу сказать про pyenv и прочие poetry.


  1. andreymal
    11.01.2023 01:54
    +6

    Впервые о путанице зависимостей сообщил в 2021 году

    А можно я похвалю сам себя — я предвидел подобный вид атак ещё в 2018 году) https://ru.stackoverflow.com/questions/882086


    1. domix32
      11.01.2023 19:18

      Как-то так в расте публикуемые крейты подписываются. Вероятно какой-то механизм подписей должен был существовать и у колёс