TL; DR
Un gruppo di pacchetti PyPI ha preso in prestito il nome di uv, il gestore di pacchetti Python basato su Rust, veloce e popolarissimo, per spacciarsi per helper uv. Non forniscono quasi nessuna funzionalità reale. Ciò che trasportano invece è un payload Windows che si mette in posizione un Server JupyterLab con autenticazione disattivata e, nelle versioni successive, lo pubblica su internet attraverso un tunnel inverso.
Questa è tutta la storia in una sola frase: Il nome di uno strumento affidabile funge da esca, e JupyterLab da motore per l'esecuzione remota del codice. Un server Jupyter esegue qualsiasi codice tu digiti in un file di testoebook cella; una avviata con un token vuoto e associata a ogni interfaccia di rete è un interprete aperto che chiunque possa raggiungere la porta può utilizzare.
Monitoriamo il cluster come Finto UV. I due pacchetti esaminati sono moon-uv (0.0.1-0.0.16) e my-magic-uv-helper (0.0.1), pubblicato dallo stesso operatore e attivo su PyPI al momento dell'analisi.
| Ecosistema | PyPI |
| personalizzati | moon-uv (0.0.1-0.0.16), my-magic-uv-helper (0.0.1) |
| Piattaforma mirata | Windows |
| Comportamento fondamentale | Server JupyterLab non autenticato, pubblicato su Internet tramite un tunnel inverso. |
| Strumenti legittimi usati in modo improprio | uv, JupyterLab, cloudflared, Pinggy |
L'attrattiva: un nome di cui ti fidi già
uv è uno degli strumenti Python più installati degli ultimi due anni, quindi "un aiuto per uv" è un pacchetto che uno sviluppatore installa senza pensarci due volte. FauxUV basa tutta la sua credibilità su questo nome. I pacchetti racchiudono il genuino uv programma di installazione da Astral: gli URL nel payload puntano a host reali e affidabili, quindi una rapida occhiata mostra solo riferimenti affidabili. Nessuno dei pacchetti aggiunge effettivamente uv funzionalità; il nome è l'intero travestimento.
JupyterLab come motore RCE
Il fulcro del carico utile è un programma di avvio che avvia JupyterLab senza alcuna limitazione:
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 Ogni bandiera elimina una protezione e lo script spedito li annota persino (in cinese originale): il token vuoto "Disattiva i controlli di password e token: chiunque può connettersi." laboratorio giove è un IDE legittimo per la scienza dei dati, ma nonebook La cella esegue codice arbitrario per impostazione predefinita. Configurata in questo modo e associata a 0.0.0.0, smette di essere un IDE e diventa una shell remota non autenticata sull'host: non è necessario alcun binario malware personalizzato, solo uno strumento comune indirizzato nella direzione sbagliata.
Due elementi di supporto rendono questo obiettivo raggiungibile e ripetibile:
- Un trigger di installazione silenziosa. Le prime versioni eseguono PowerShell con -ExecutionPolicy Bypass direttamente dal setup.py on installazione pip, in background con errori soppressi quindi seme sembra normale. Le versioni successive spostano la stessa primitiva in un pip-uv strumento da riga di comando — e rimuovere completamente l'esecuzione automatica durante l'installazione.
- Un tunnel pubblico a senso inverso. Un server su 0.0.0.0 è ancora raggiungibile solo dagli host che possono instradare alla macchina. Un modulo incluso apre un [Pinggy](https://pinggy.io/) Tunnel inverso SSH che inoltra la porta locale di Jupyter a un indirizzo pubblico, rimuovendo tale limite. Lo script distribuito include anche, commentato, un percorso alternativo che utilizza Cloudflare cloudflared e netsh Configurazione di un port proxy verso un indirizzo IP di Linode, documentando lo stesso obiettivo attraverso un'infrastruttura diversa.
In sintesi: installando il pacchetto, un computer Windows si ritrova con un'istanza di JupyterLab senza password, pubblicata su internet.
Come si è evoluto FauxUV
Le versioni di FauxUV sono state rilasciate in rapida successione e il punto di attivazione del payload si è spostato tra di esse: un promemoria del fatto che una singola versione segnalata raramente racconta tutta la storia di una linea di prodotti.
| Stage | versioni | grilletto | Cosa aggiunge |
|---|---|---|---|
| gancio di installazione | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py su pip install | installazione uv + prefisso PATH |
| Runtime CLI | moon-uv 0.0.5-0.0.13 | pip-uv command | il launcher di JupyterLab senza password |
| Tunnel | moon-uv 0.0.14-0.0.16 | pip-uv command | un tunnel inverso Pinggy attivo |
In particolare, l'esecuzione automatica al momento dell'installazione era rimosso nelle versioni successive, più capaci, quindi uno scanner basato solo sul ciclo di vita hooks assegnerebbe un punteggio alle uscite più recenti come meno rischioso, esattamente il contrario.
Indicatori di compromesso
Confermato dalla lettura del codice sorgente del pacchetto; endpoint contrassegnati ha commentato sono presenti nei file ma non vengono eseguiti dalla versione analizzata. Gli indicatori di rete sono stati neutralizzati.
| Tipo | |
|---|---|
| comando Installa | powershell -ExecutionPolicy Bypass recupero del programma di installazione UV autentico, al momento dell'installazione di pip |
| Flag di JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Tunnel inverso (attivo) | free[.]pinggy[.]io:443 inoltro locale 127.0.0.1:8888 |
| Host del tunnel (commentato) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (commentato) | 45[.]79[.]134[.]161 (Linode) via netsh port-proxy |
| Persistenza | antepone %USERPROFILE%\.local\bin al percorso utente |
Segnali comportamentali su cui vale la pena allertare, indipendentemente da queste stringhe esatte: a installazione pip che genera PowerShell - Bypass dei criteri di esecuzione; Qualunque giove lancio combinato token="" con –ip=0.0.0.0; e SSH in uscita verso *.pinggy.io da una macchina di sviluppo o di integrazione continua (CI).
Comportamento osservato e provenienza
I due pacchetti condividono un autore e un metodo: il nome di uno strumento affidabile, il controllo solo su Windows, l'esecuzione in background con soppressione degli errori e la dipendenza da strumenti affidabili, quindi una rapida occhiata mostra solo URL affidabili. Il codice sorgente contiene commenti in lingua cinese che descrivono chiaramente i flag rilevanti per la sicurezza; li riportiamo come dichiarazioni osservabili nel file, non come un'affermazione sul movente. consenti_origine valore e a colab.bat Il nome del file rispecchia i flussi di lavoro informali di "condivisione del runtime locale" che circolano per Google Colab. Qualunque sia l'origine, il risultato finale è lo stesso.
Impatto e linee guida per i difensori
Chi è esposto a FauxUV. sviluppatori Windows e runner CI che installazione pip uno di questi pacchetti. Un JupyterLab senza password su 0.0.0.0 Si tratta di esecuzione di codice remoto per chiunque possa raggiungere la porta; il tunnel elimina la limitazione di "chi può raggiungerla". Il server viene eseguito con i privilegi dell'utente che ha effettuato l'installazione, ereditando file, token e credenziali cloud di tale utente.
Perché è facile non notarlo. Ogni stringa di rete punta a un host affidabile: Astral, JupyterLab, cloudflared, Pinggy, Colab. Non c'è alcun binario malware da hash e nessun blob offuscato da decodificare. La scansione basata sulla reputazione e sulla firma sottovaluta questo aspetto, motivo per cui la domanda comportamentale — cosa fa la macchina installando questo pacchetto — è colui che lo prende.
Guida:
- Trattare qualsiasi tempo di installazione PowerShell - Bypass dei criteri di esecuzione come segnale di interruzione della build, qualunque URL recuperi.
- Avviso su giove lanciato con un token vuoto e –ip=0.0.0.0; tale combinazione non dovrebbe mai comparire su una workstation o su un runner.
- Monitora le connessioni SSH in uscita verso i provider di tunnel (*.pinggy.io, *.trycloudflare.com) dagli ambienti di sviluppo e CI.
- Installazione uv dalla [sua fonte ufficiale](https://docs.astral.sh/uv/) e siate scettici nei confronti dei pacchetti "di supporto" di terze parti che racchiudono uno strumento già di per sé banale da installare.
- Blocca e rivedi le dipendenze durante l'aggiornamento: una linea di pacchetti può acquisire nuove funzionalità di versione in versione.



