TL; DR
Ett kluster av PyPI-paket lånade namnet uv, den snabba, enormt populära Rust-baserade Python-pakethanteraren, för att utge sig för att vara UV-hjälpare. De levererar nästan ingen riktig funktionalitet. Vad de istället har med sig är en Windows-nyttolast som står emot en JupyterLab-server med autentisering avstängd och publicerar den i senare versioner till det offentliga internet via en omvänd tunnel.
Det är hela historien i en rad: ett betrott verktygs namn som lockbete och JupyterLab som motor för fjärrkodexekvering. En Jupyter-server kör all kod du skriver in i en inteebook cell; en som startas med en tom token och är bunden till varje nätverksgränssnitt är en öppen tolk som alla som kan nå porten kan köra.
Vi följer klustret som FauxUVDe två paket som granskats är moon-uv (0.0.1-0.0.16) och my-magic-uv-helper (0.0.1), publicerad av samma operatör och live på PyPI vid tidpunkten för analysen.
| Ekosystem | PyPI |
| Paket | moon-uv (0.0.1-0.0.16), my-magic-uv-helper Lagring |
| Plattformsinriktad | Windows |
| Kärnbeteende | Oautentiserad JupyterLab-server, publicerad till internet via en omvänd tunnel |
| Legitima verktyg missbrukas | UV, JupyterLab, Cloudflared, Pinggy |
Lockelsen: ett namn du redan litar på
uv är ett av de mest installerade Python-verktygen under de senaste två åren, så "en hjälpreda för uv” är ett paket som en utvecklare installerar utan att tveka. FauxUV lägger all sin trovärdighet på det namnet. Paketen omsluter verklig uv installationsprogram från Astral — URL:erna i nyttolasten pekar på riktiga, välrenommerade webbhotell — så en snabb blick ser inget annat än pålitliga referenser. Inget av paketen lägger faktiskt till uv funktionalitet; namnet är hela förklädnaden.
JupyterLab som RCE-motor
Nyttolastens mittpunkt är en startanordning som startar JupyterLab med varje skyddsräcke borttaget:
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 Varje flagga tar bort ett skydd, och det levererade skriftspråket kommenterar dem till och med (på originalspråket på kinesiska): den tomma symbolen "stänger av lösenords- och tokenkontroller — vem som helst kan ansluta." jupyter lab är en legitim datavetenskaplig IDE, men inte enebook cell exekverar godtycklig kod av design. Konfigurerad på detta sätt och bunden till 0.0.0.0, den slutar vara en IDE och blir ett oautentiserat fjärrskal på värden — ingen anpassad binärfil för skadlig kod krävs, bara ett vanligt verktyg som pekar åt fel håll.
Två stödjande delar gör det åtkomligt och repeterbart:
- En tyst installationstrigger. Tidiga versioner kör PowerShell med -Kringgående körningspolicy direkt från setup.py on pip installera, i bakgrunden med fel undertryckta så pip ser normalt ut. Senare versioner flyttar samma primitiv till en pip-uv kommandoradsverktyget — och ta bort den automatiska körningen vid installation helt och hållet.
- En offentlig omvänd tunnel. En server på 0.0.0.0 är fortfarande bara nåbar av värdar som kan dirigera till maskinen. En paketerad modul öppnar en [Pinggy](https://pinggy.io/) SSH-omvänd tunnel som vidarebefordrar den lokala Jupyter-porten till en publik adress, vilket tar bort den begränsningen. Det levererade skriptet har också – kommenterat – en alternativ sökväg med Cloudflares molnutbländande och en netsh port-proxy till en Linode IP, som dokumenterar samma mål genom olika infrastrukturer.
Sammanfattningsvis: installera paketet, och en Windows-värd kör ett lösenordsfritt JupyterLab och publicerar det på det öppna internet.
Hur FauxUV utvecklades
FauxUVs versioner levererades i snabb följd, och nyttolastens utlösningspunkt rörde sig över dem – en påminnelse om att en flaggad version sällan berättar hela historien om en paketlinje.
| Etapp | versioner | Trigger | Vad det tillför |
|---|---|---|---|
| Installationskrok | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py vid pip-installation | uv install + PATH prepend |
| CLI-körning | moon-uv 0.0.5-0.0.13 | pip-uv kommando | den lösenordsfria JupyterLab-startaren |
| Tunnel | moon-uv 0.0.14-0.0.16 | pip-uv kommando | en aktiv Pinggy-omvänd tunnel |
Det är anmärkningsvärt att automatisk körning vid installationstid var avlägsnas i de senare, mer kapabla versionerna — så en skanner som endast är nyckelad på livscykeln hooks skulle poängsätta de nyare utgåvorna som mindre riskabelt, rakt bakvänt.
Indikatorer för kompromiss
Bekräftad genom att läsa paketets källkod; slutpunkter markerade kommenterade finns i filerna men körs inte av den analyserade versionen. Nätverksindikatorer är deaktiverade.
| Typ | Indikator |
|---|---|
| Installera kommando | powershell -ExecutionPolicy Bypass hämtar det äkta UV-installationsprogrammet vid pip-installationstillfället |
| JupyterLab-flaggor | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Omvänd tunnel (aktiv) | free[.]pinggy[.]io:443 vidarebefordran lokalt 127.0.0.1:8888 |
| Tunnelvärd (kommenterad) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (kommenterad) | 45[.]79[.]134[.]161 (Linode) via netsh port-proxy |
| Persistens | förbereder sig %USERPROFILE%\.local\bin till användarens PATH |
Beteendesignaler värda att uppmärksamma, oberoende av exakt dessa strängar: a pip installera som leker powershell - Kringgå exekveringspolicyvilken som helst jupyter lansera kombination token=”” med –ip=0.0.0.0och utgående SSH till *.pinggy.io från en utvecklare eller CI-maskin.
Observerat beteende och ursprung
De två paketen delar en författare och en metod: ett betrott verktygs namn, endast Windows-gating, felundertryckt bakgrundskörning och beroende av välrenommerade verktyg så att en snabb titt bara ser välrenommerade URL:er. Källkoden innehåller kommentarer på kinesiska som tydligt beskriver de säkerhetsrelevanta flaggorna; vi rapporterar dessa som observerbara uttalanden i filen, inte som ett påstående om motiv. tillåt_ursprung värde och ett colab.bat filnamnet ekar de informella arbetsflödena "dela min lokala runtime" som cirkulerar för Google Colab. Oavsett ursprung är det paketerade resultatet detsamma.
Påverkan och vägledning för försvarare
Vem exponeras för FauxUV? Windows-utvecklare och CI-användare som pip installera ett av dessa paket. Ett lösenordsfritt JupyterLab på 0.0.0.0 är fjärrkodkörning för alla som kan nå porten; tunneln tar bort gränsen för "vem som kan nå den". Servern körs som den installerande användaren och ärver den användarens filer, tokens och molnuppgifter.
Varför det är lätt att missa. Varje nätverkssträng pekar på en pålitlig värd — Astral, JupyterLab, molnutbländande, Pinggy, Colab. Det finns ingen binärfil för skadlig kod att hasha och ingen obfuskerad blob att avkoda. Ryktesbaserad och signaturbaserad skanning underskattar båda detta, vilket är anledningen till att beteendefrågan — vad gör maskinen när man installerar det här paketet? — är den som fångar den.
Vägledning:
- Hantera all installationstid powershell - Kringgå exekveringspolicy som en build-breaking-signal, oavsett vilken URL den hämtar.
- Varning på jupyter lanserades med en tom token och –ip=0.0.0.0; den kombinationen ska aldrig förekomma på en arbetsstation eller löpare.
- Övervaka utgående SSH till tunnelleverantörer (*.pinggy.io, *.trycloudflare.com) från utvecklare och CI-miljöer.
- installera uv från [dess officiella källa](https://docs.astral.sh/uv/) och var skeptisk till tredjeparts"hjälppaket" som omsluter ett verktyg som redan är enkelt att installera.
- Fäst och granska beroenden vid uppgradering — en paketrad kan utöka funktioner version för version.



