TL; DR
Клъстер от PyPI пакети заимства името uv, бързият и изключително популярен мениджър на пакети на Python, базиран на Rust, да се представят за UV помощници. Те почти не предлагат реална функционалност. Вместо това, те носят полезен товар за Windows, който може да се справи с... JupyterLab сървър с изключено удостоверяване и в по-късни версии го публикува в публичния интернет чрез обратен тунел.
Това е цялата история в един ред: името на надежден инструмент като примамка и JupyterLab като двигател за дистанционно изпълнение на код. Jupyter сървърът изпълнява какъвто и да е код, който въвеждате в notebook клетка; стартирана с празен токен и свързана с всеки мрежов интерфейс е отворен интерпретатор, който всеки, който може да достигне порта, може да управлява.
Проследяваме клъстера като FauxUVДвата разгледани пакета са moon-uv (0.0.1 – 0.0.16) и my-magic-uv-helper (0.0.1), публикуван от същия оператор и активен в PyPI към момента на анализа.
| Екосистема | PyPI |
| Услуги | moon-uv (0.0.1-0.0.16), my-magic-uv-helper S |
| Платформно насочена | Windows |
| Основно поведение | Неавтентичен JupyterLab сървър, публикуван в интернет чрез обратен тунел |
| Злоупотреба с легитимни инструменти | UV, JupyterLab, cloudflared, Pingy |
Примамката: име, на което вече имате доверие
uv е един от най-инсталираните инструменти на Python през последните две години, така че „помощник за uv„“ е пакет, който разработчикът инсталира без да се замисля. FauxUV изгражда изцяло своята репутация на това име. Пакетите обгръщат истински uv инсталатор от Astral — URL адресите в полезния товар сочат към истински, реномирани хостове — така че един бърз поглед не вижда нищо друго освен надеждни препратки. Нито един от пакетите всъщност не добавя uv функционалност; името е цялата маскировка.
JupyterLab като RCE двигател
Централният елемент на полезния товар е стартер, който стартира JupyterLab след премахване на всички предпазни огради:
jupyter server --with jupyterlab --ip=0.0.0.0 # listen on every interface --ServerApp.token="" # no password, no token --allow_origin='*' # accept cross-origin connections --disable_check_xsrf # allow a remote browser/WebSocket to drive it Всеки флаг премахва защита, а изпратеният скрипт дори ги анотира (на оригиналния китайски): празният токен „изключва проверките за пароли и токени — всеки може да се свърже.“ лаборатория Юпитер е легитимна IDE за наука за данни, но не еebook клетката изпълнява произволен код по дизайн. Конфигурирана по този начин и свързана с 0.0.0.0, той престава да бъде IDE и се превръща в неавтентична отдалечена обвивка на хоста — не се изисква персонализиран двоичен файл със зловреден софтуер, а само масов инструмент, насочен в грешна посока.
Две поддържащи части правят това постижимо и повторяемо:
- Спусък за безшумна инсталация. Ранните версии работят с PowerShell с -Заобикаляне на политиката за изпълнение направо от setup.py on pip инсталиране, на заден план с потиснати грешки, така че пиукам изглежда нормално. По-късните версии преместват същия примитив в пип-ув инструмент за команден ред — и напълно премахнете автоматичното изпълнение по време на инсталиране.
- Обществен обратен тунел. Сървър на 0.0.0.0 все още е достъпен само от хостове, които могат да се насочат към машината. Вграден модул отваря [Pinggy](https://pinggy.io/) SSH обратен тунел, който пренасочва локалния Jupyter порт към публичен адрес, премахвайки това ограничение. Изпратеният скрипт също така носи — коментиран — алтернативен път, използвайки Cloudflare-овия избухнал в облаци и Netsh порт-прокси към Linode IP, документирайки същата цел чрез различна инфраструктура.
Сглобено: инсталирайте пакета и хост на Windows в крайна сметка ще стартира JupyterLab без парола и ще го публикува в отворения интернет.
Как еволюира FauxUV
Версиите на FauxUV се доставяха една след друга, а точката на задействане на полезния товар се преместваше между тях – напомняне, че една маркирана версия рядко разказва цялата история на даден пакет.
| Етап | Версии | Тригер | Какво добавя |
|---|---|---|---|
| Install-hook | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py при инсталиране на pip | uv install + PATH предварителна команда |
| CLI-runtime | moon-uv 0.0.5-0.0.13 | pip-uv команда | стартерът на JupyterLab без парола |
| Тунел | moon-uv 0.0.14-0.0.16 | pip-uv команда | активен обратен тунел Pingy |
Забележително е, че автоматичното стартиране по време на инсталиране беше отстранява в по-късните, по-способни версии — така че скенерът се задейства само по време на жизнения цикъл hooks бих оценил по-новите издания като по-малко рисковано, точно наобратно.
Индикатори за компромис
Потвърдено чрез прочитане на изходния код на пакета; крайните точки са маркирани коментира присъстват във файловете, но не се изпълняват от анализираната версия. Мрежовите индикатори са деактивирани.
| Тип | индикатор |
|---|---|
| Инсталиране на команда | powershell -ExecutionPolicy Bypass извличане на оригиналния инсталатор на UV, по време на инсталиране на PIP |
| флагове на JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Обратен тунел (активен) | free[.]pinggy[.]io:443 пренасочване на локално 127.0.0.1:8888 |
| Тунелен хост (коментиран) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (коментиран) | 45[.]79[.]134[.]161 (Линоде) чрез netsh port-proxy |
| Постоянство | добавя се в началото %USERPROFILE%\.local\bin към потребителя PATH |
Поведенчески сигнали, за които си струва да се обърне внимание, независимо от тези точни низове: a pip инсталиране което се ражда powershell -ExecutionPolicy Bypassвсеки юпитер комбиниране на стартиране токен = „“ с –ip=0.0.0.0и изходящ SSH към *.pinggy.io* от разработчик или CI машина.
Наблюдавано поведение и произход
Двата пакета споделят един и същ автор и метод: име на надежден инструмент, защита само от грешки в Windows, потискане на грешки във фонов режим и разчитане на надеждни инструменти, така че бърз поглед вижда само надеждни URL адреси. Източникът съдържа коментари на китайски език, описващи ясно флаговете, свързани със сигурността; ние ги представяме като наблюдаеми твърдения във файла, а не като твърдение за мотив. allow_origin стойност и colab.bat Името на файла отразява неформалните работни потоци „споделяне на локалната ми среда за изпълнение“, които се разпространяват за Google Colab. Какъвто и да е произходът, пакетираният резултат е един и същ.
Въздействие и насоки за защитниците
Кой е изложен на FauxUV. Разработчици на Windows и CI изпълнители, които pip инсталиране един от тези пакети. JupyterLab без парола на 0.0.0.0 е дистанционно изпълнение на код за всеки, който може да достигне порта; тунелът премахва ограничението „кой може да го достигне“. Сървърът работи от името на инсталиращия потребител, наследявайки файловете, токените и облачните идентификационни данни на този потребител.
Защо е лесно да се пропусне. Всеки мрежов низ сочи към реномиран хост — Astral, JupyterLab, избухнал в облаци, Pinggy, Colab. Няма двоичен файл със зловреден софтуер за хеширане и няма обфусиран блоб за декодиране. Сканирането, базирано на репутация и сигнатури, подценява това, поради което поведенческият въпрос... какво прави машината след инсталирането на този пакет — е този, който го хваща.
ориентиране:
- Третирайте всяко време на инсталиране powershell -ExecutionPolicy Bypass като сигнал за прекъсване на изграждането, независимо от URL адреса, който извлича.
- Сигнализирайте юпитер стартиран с празен токен и –ip=0.0.0.0; тази комбинация никога не трябва да се появява на работна станция или бегач.
- Монитор за изходящ SSH към тунелни доставчици (*.pinggy.io*, *.trycloudflare.com) от среди за разработчици и CI.
- Инсталирайте uv от [официалния му източник](https://docs.astral.sh/uv/) и бъдете скептични към „помощните“ пакети на трети страни, които обгръщат инструмент, чието инсталиране е вече тривиално.
- Закрепване и повторен преглед на зависимостите при надграждане — редът на пакета може да създава нови възможности версия след версия.



