TL; DR
Eine Gruppe von PyPI-Paketen hat den Namen übernommen uvDer schnelle, äußerst beliebte, auf Rust basierende Python-Paketmanager uv gibt sich als Hilfsprogramm aus. Er liefert fast keine wirkliche Funktionalität. Stattdessen transportiert er eine Windows-Payload, die ein JupyterLab-Server mit deaktivierter Authentifizierung und in späteren Versionen wird es über einen umgekehrten Tunnel im öffentlichen Internet veröffentlicht.
Das ist die ganze Geschichte in einem Satz: Der Name eines vertrauenswürdigen Tools als Köder und JupyterLab als Remote-Code-Ausführungs-Engine. Ein Jupyter-Server führt jeden Code aus, den Sie in eine Datei eingeben.ebook Eine Zelle, die mit einem leeren Token gestartet und an jede Netzwerkschnittstelle gebunden wird, ist ein offener Interpreter, den jeder, der den Port erreichen kann, ausführen kann.
Wir verfolgen den Cluster als FauxUVDie beiden untersuchten Pakete sind moon-uv (0.0.1-0.0.16) und my-magic-uv-helper (0.0.1), veröffentlicht vom selben Betreiber und zum Zeitpunkt der Analyse auf PyPI verfügbar.
| Ökosystem | PyPI |
| Pakete | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Plattform ausgerichtet | Windows |
| Kernverhalten | Nicht authentifizierter JupyterLab-Server, der über einen umgekehrten Tunnel im Internet veröffentlicht wurde |
| Legitime Werkzeuge missbraucht | uv, JupyterLab, cloudflared, Pinggy |
Der Köder: ein Name, dem Sie bereits vertrauen.
uv ist eines der am häufigsten installierten Python-Tools der letzten zwei Jahre, also „ein Helfer für uv„ist ein Paket, das ein Entwickler ohne langes Überlegen installiert. FauxUV verdankt seine Glaubwürdigkeit allein diesem Namen. Die Pakete umschließen die Richte deinen Sinn auf das, uv Der Installer von Astral – die URLs in der Nutzlast verweisen auf echte, seriöse Hosts – sodass auf den ersten Blick nur vertrauenswürdige Verweise zu sehen sind. Keines der Pakete fügt tatsächlich etwas hinzu. uv Funktionalität; der Name ist nur die Tarnung.
JupyterLab als RCE-Engine
Kernstück der Nutzlast ist ein Launcher, der JupyterLab ohne jegliche Sicherheitsvorkehrungen startet:
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 Jede Flagge hebt einen Schutz auf, und das mitgelieferte Skript vermerkt dies sogar (im chinesischen Original): das leere Token „Deaktiviert Passwort- und Tokenprüfungen – jeder kann sich verbinden.“ Jupyter-Labor ist eine legitime Data-Science-IDE, aber keineebook Die Zelle führt systembedingt beliebigen Code aus. So konfiguriert und gebunden an 0.0.0.0Es hört auf, eine IDE zu sein, und wird zu einer nicht authentifizierten Remote-Shell auf dem Host – es ist keine benutzerdefinierte Malware-Binärdatei erforderlich, nur ein gängiges Tool, das in die falsche Richtung gelenkt wird.
Zwei unterstützende Elemente machen dies erreichbar und wiederholbar:
- Ein stiller Installationsauslöser. Frühere Versionen führen PowerShell mit -ExecutionPolicy Bypass direkt von setup.py on pip installieren, im Hintergrund, wobei Fehler unterdrückt werden, so Pip Sieht normal aus. Spätere Versionen verschieben dasselbe Primitiv in ein Pip-UV Befehlszeilentool – und den automatischen Start während der Installation komplett deaktivieren.
- Ein öffentlicher Gegentunnel. Ein Server auf 0.0.0.0 ist weiterhin nur für Hosts erreichbar, die eine Route zu dem Rechner bereitstellen können. Ein mitgeliefertes Modul öffnet eine [Pinggy](https://pinggy.io/Ein SSH-Reverse-Tunnel leitet den lokalen Jupyter-Port an eine öffentliche Adresse weiter und hebt so diese Beschränkung auf. Das mitgelieferte Skript enthält außerdem – auskommentiert – einen alternativen Pfad über Cloudflare. cloudflared und einem netsh Port-Proxy zu einer Linode-IP, wodurch dasselbe Ziel durch eine andere Infrastruktur dokumentiert wird.
Zusammengefasst: Nach der Installation des Pakets läuft auf einem Windows-Rechner am Ende ein passwortloses JupyterLab, das im offenen Internet veröffentlicht wird.
Wie FauxUV entstanden ist
Die Versionen von FauxUV wurden in schneller Folge ausgeliefert, und der Auslösepunkt der Nutzlast verschob sich über sie hinweg – eine Erinnerung daran, dass eine markierte Version selten die ganze Geschichte einer Paketlinie erzählt.
| Praktikum | Versionen | Auslösen | Was es hinzufügt |
|---|---|---|---|
| Install-hook | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py bei pip install | uv install + PATH prepend |
| CLI-Laufzeitumgebung | moon-uv 0.0.5-0.0.13 | pip-uv Befehl | der passwortlose JupyterLab-Launcher |
| Tunnel | moon-uv 0.0.14-0.0.16 | pip-uv Befehl | ein aktiver Pinggy-Rückwärtstunnel |
Bemerkenswerterweise war der automatische Start während der Installation entfernt in den späteren, leistungsfähigeren Versionen – also ein Scanner, der nur auf den Lebenszyklus reagiert. hooks würde die neueren Veröffentlichungen wie folgt bewerten weniger riskant, genau umgekehrt.
Kompromissindikatoren
Bestätigt durch Lesen des Paketquellcodes; Endpunkte markiert kommentierte Sie sind in den Dateien vorhanden, werden aber von der analysierten Version nicht ausgeführt. Netzwerkindikatoren sind deaktiviert.
| Typ | Indikator |
|---|---|
| Befehl installieren | powershell -ExecutionPolicy Bypass Den originalen UV-Installer zum Zeitpunkt der Pip-Installation beschaffen |
| JupyterLab-Flags | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Umgekehrter Tunnel (aktiv) | free[.]pinggy[.]io:443 Weiterleitung lokal 127.0.0.1:8888 |
| Tunnel-Host (kommentiert) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (kommentiert) | 45[.]79[.]134[.]161 (Linode) via netsh port-proxy |
| Beharrlichkeit | steht vor %USERPROFILE%\.local\bin zum Benutzerpfad |
Verhaltenssignale, die unabhängig von diesen genauen Zeichenketten Anlass zur Beachtung geben: a pip installieren das erzeugt powershell -ExecutionPolicy Bypass;; irgendein Jupiter Start kombiniert token=”” und –ip=0.0.0.0und ausgehende SSH-Verbindungen zu *.pinggy.io von einem Entwickler- oder CI-Rechner.
Beobachtetes Verhalten und Herkunft
Die beiden Pakete haben denselben Autor und dieselbe Methode: den Namen eines vertrauenswürdigen Tools, die Beschränkung auf Windows, die fehlerunterdrückte Ausführung im Hintergrund und die Verwendung seriöser Tools, sodass auf den ersten Blick nur vertrauenswürdige URLs angezeigt werden. Der Quellcode enthält chinesischsprachige Kommentare, die die sicherheitsrelevanten Flags klar beschreiben; wir berichten darüber als beobachtbare Aussagen in der Datei, nicht als Behauptung über die Motive. allow_origin Wert und ein colab.bat Die Dateinamen spiegeln die informellen „Lokale Laufzeitumgebung teilen“-Workflows wider, die bei Google Colab üblich sind. Unabhängig vom Ursprung ist das Ergebnis immer dasselbe.
Auswirkungen und Leitlinien für Verteidiger
Wer ist FauxUV ausgesetzt? Windows-Entwickler und CI-Runner, die pip installieren eines dieser Pakete. Ein passwortloses JupyterLab auf 0.0.0.0 Die Remote-Codeausführung ist für jeden möglich, der den Port erreichen kann; der Tunnel hebt diese Zugriffsbeschränkung auf. Der Server läuft unter dem Benutzer, der die Installation durchgeführt hat, und übernimmt dessen Dateien, Tokens und Cloud-Zugangsdaten.
Warum man es leicht übersehen kann. Jeder Netzwerkstring verweist auf einen seriösen Host – Astral, JupyterLab, cloudflaredPinggy, Colab. Es gibt keine Malware-Binärdatei zum Hashen und keinen verschleierten Datenblock zum Entschlüsseln. Sowohl reputations- als auch signaturbasierte Scans gewichten dies zu gering, weshalb die Frage nach dem Verhalten relevant ist. Was bewirkt die Installation dieses Pakets auf dem Computer? — ist derjenige, der es fängt.
Beratung:
- Behandeln Sie jede Installationszeit powershell -ExecutionPolicy Bypass als ein Signal, das einen Build-Fehler auslöst, unabhängig davon, welche URL abgerufen wird.
- Alarm an Jupiter gestartet mit einem leeren Token und –ip=0.0.0.0Diese Kombination sollte niemals auf einer Workstation oder einem Runner erscheinen.
- Überwachung ausgehender SSH-Verbindungen zu Tunnelanbietern (*.pinggy.io, *.trycloudflare.com) aus Entwickler- und CI-Umgebungen.
- Installieren uv aus [seiner offiziellen Quelle](https://docs.astral.sh/uv/Seien Sie skeptisch gegenüber Drittanbieter-„Hilfspaketen“, die ein ohnehin trivial zu installierendes Tool umschließen.
- Abhängigkeiten beim Upgrade fixieren und erneut überprüfen – eine Paketlinie kann mit jeder neuen Version neue Funktionen erhalten.



