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

Автор: @hexadec1mal

В чате сидит Guard-бот, будьте внимательнее.
Download Telegram
Research suggestion: llm4pyc

Люди, сталкивающиеся с pyc-файлами для Python, знают, что начиная с 3.9 появляются значительные трудности с декомпиляцией. Об инструментах, частично помогающих в этом вопросе, мы писали в ESCalator.

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

Байт-код виртуальной машины CPython в целом проще, чем x86/x86-64. У CPython главная проблема заключается в значительных изменениях байт-кода между версиями. Данную проблему подсвечивает rocky, создатель декомпиляторов uncompyle6 и decompyle3 и серии других тулзов для Python.

К слову, ChatGPT, Claude, DeepSeek худо-бедно справляются с этой историей, но всё равно неидеально.

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

Предлагаю выпустить по этой теме 1-2 статьи Crossref/ВАК. Также для тех, кто возьмет эту тему в качестве курсовой или диплома, готов дополнительно помочь с сопровождением, включая поиск источников, наполнение и ревью.

Ищу пару человек. Критерий: вы сталкивались с pyc-файлами и вполне уверенно пишете на Python.

Для связи: @hexadec1mal

#ресерч #python #llm4pyc
@disasm_me_ch
🔥5
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