FauxUV : Faux packages uv PyPI ouvrent Jupyter au Web

FauxUV : faux assistants UV PyPI qui ouvrent un serveur Jupyter non authentifié sur Internet

TL; DR

Un groupe de paquets PyPI a emprunté le nom de uv, le gestionnaire de paquets Python basé sur Rust, rapide et extrêmement populaire, se fait passer pour un outil d'aide à la gestion des UV. Il ne propose quasiment aucune fonctionnalité réelle. En réalité, il s'agit d'un programme d'installation Windows qui déploie un Serveur JupyterLab avec authentification désactivée et, dans les versions ultérieures, le publie sur Internet via un tunnel inversé.

Voilà toute l'histoire en une phrase : Le nom d'un outil de confiance comme appât, et JupyterLab comme moteur d'exécution de code à distance. Un serveur Jupyter exécute tout code que vous saisissez dans un environnement nonebook cellule ; une lancée avec un jeton vide et liée à chaque interface réseau est un interpréteur ouvert que toute personne pouvant accéder au port peut piloter.

Nous suivons le groupe comme FauxUVLes deux paquets examinés sont : moon-uv (0.0.1 – 0.0.16) et my-magic-uv-helper (0.0.1), publié par le même opérateur et en ligne sur PyPI au moment de l'analyse.

ÉcosystèmePyPI
Forfaitsmoon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1)
Plateforme cibléeFenêtres
Comportement fondamentalServeur JupyterLab non authentifié, publié sur Internet via un tunnel inverse
Des outils légitimes détournésuv, JupyterLab, cloudflared, Pinggy

L’attrait : un nom auquel vous faites déjà confiance.

uv est l'un des outils Python les plus installés de ces deux dernières années, donc « un assistant pour uv« » est un package qu'un développeur installe sans hésiter. FauxUV fonde toute sa crédibilité sur ce nom. Les packages encapsulent véritable uv Le programme d'installation d'Astral utilise des URL pointant vers des hébergeurs fiables et reconnus, garantissant ainsi des références dignes de confiance. Aucun des paquets n'ajoute de contenu supplémentaire. uv fonctionnalité ; le nom est tout le déguisement.

JupyterLab en tant que moteur RCE

L'élément central de la charge utile est un lanceur qui démarre JupyterLab sans aucune protection :

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

Chaque drapeau supprime une protection, et le script fourni les annote même (en chinois original) : le jeton vide « Désactive les vérifications de mot de passe et de jeton — n'importe qui peut se connecter. » laboratoire jupyter est un IDE légitime pour la science des données, mais pas unebook La cellule exécute du code arbitraire par conception. Configurée de cette manière et liée à 0.0.0.0Il cesse alors d'être un IDE et devient un shell distant non authentifié sur l'hôte — aucun binaire malveillant personnalisé n'est requis, juste un outil courant pointé dans la mauvaise direction.

Deux éléments de soutien rendent cela possible et reproductible :

  • Un déclencheur d'installation silencieuse. Les premières versions exécutent PowerShell avec -ExécutionPolicy Bypass directement à partir de configuration.py on installer pip, en arrière-plan avec les erreurs supprimées donc pépin semble normal. Les versions ultérieures déplacent le même élément primitif dans un pip-uv outil en ligne de commande — et supprimez complètement l'exécution automatique lors de l'installation.
  • Un tunnel inversé public. Un serveur sur 0.0.0.0 n'est toujours accessible que par les hôtes capables de router vers la machine. Un module intégré ouvre un [Pinggy](https://pinggy.io/Un tunnel SSH inversé redirige le port Jupyter local vers une adresse publique, supprimant ainsi cette limitation. Le script fourni inclut également — commenté — un chemin alternatif utilisant Cloudflare. nuage flamboyant , l’aspect économique netsh proxy de port vers une adresse IP Linode, documentant le même objectif via une infrastructure différente.

En résumé : installez le paquet, et un hôte Windows se retrouve à exécuter un JupyterLab sans mot de passe et à le publier sur Internet.

Comment FauxUV a évolué

Les versions de FauxUV ont été expédiées rapidement les unes après les autres, et le point de déclenchement de la charge utile a varié d'une version à l'autre — ce qui nous rappelle qu'une seule version signalée ne raconte que rarement toute l'histoire d'une gamme de packages.

Stage versions Gâchette Ce que cela ajoute
Crochet d'installation moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 setup.py sur pip install uv install + PATH préfixe
Exécution CLI moon-uv 0.0.5-0.0.13 pip-uv commander le lanceur JupyterLab sans mot de passe
Tunnel moon-uv 0.0.14-0.0.16 pip-uv commander un tunnel inverse Pinggy actif

À noter, l'exécution automatique lors de l'installation était enlevé dans les versions ultérieures, plus performantes — donc un scanner basé uniquement sur le cycle de vie hooks Les nouvelles sorties se verraient attribuer la note suivante : moins Risqué, exactement à l'envers.

Indicateurs de compromis

Confirmé par la lecture du code source du paquet ; points d'extrémité marqués commenté Ces éléments sont présents dans les fichiers mais ne sont pas exécutés par la version analysée. Les indicateurs réseau sont désactivés.

Type Indicateur
Commande d'installation powershell -ExecutionPolicy Bypass récupérer le véritable installateur UV, au moment de l'installation du PIP
drapeaux JupyterLab --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf
Tunnel inverse (actif) free[.]pinggy[.]io:443 expédition locale 127.0.0.1:8888
Hôte du tunnel (commenté) cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718
IP (commenté) 45[.]79[.]134[.]161 (Linode) via netsh port-proxy
Persistence préfixe %USERPROFILE%\.local\bin au chemin d'accès de l'utilisateur

Signaux comportementaux justifiant une alerte, indépendamment de ces chaînes de caractères précises : un installer pip qui engendre powershell -Contournement de la stratégie d'exécution; quelconque Jupyter lancement combinant jeton="" au –ip=0.0.0.0; et SSH sortant vers *.pinggy.io depuis une machine de développement ou d'intégration continue.

Comportement observé et provenance

Les deux paquets partagent un auteur et une méthode : le nom d’un outil de confiance, une restriction d’accès exclusive à Windows, une exécution en arrière-plan avec suppression des erreurs et le recours à des outils réputés, de sorte qu’un examen rapide ne révèle que des URL fiables. Le code source contient des commentaires en chinois décrivant clairement les indicateurs de sécurité ; nous les rapportons comme des affirmations observables dans le fichier, et non comme une allégation concernant les motivations. autoriser_origine valeur et un colab.bat Le nom du fichier fait écho aux flux de travail informels de type « partage de mon environnement d'exécution local » qui circulent pour Google Colab. Quelle que soit son origine, le résultat final est identique.

Impact et orientations pour les défenseurs

Qui est exposé aux faux UV ? Les développeurs Windows et les responsables d'intégration continue qui installer pip l'un de ces packages. Un JupyterLab sans mot de passe sur 0.0.0.0 L'exécution de code à distance est accessible à toute personne pouvant se connecter au port ; le tunnel supprime cette restriction. Le serveur s'exécute avec les privilèges de l'utilisateur ayant effectué l'installation, héritant ainsi de ses fichiers, jetons et identifiants cloud.

Pourquoi il est facile de passer à côté. Chaque chaîne de caractères du réseau pointe vers un hébergeur réputé — Astral, JupyterLab, nuage flamboyantPinggy, Colab. Il n'y a pas de fichier binaire malveillant à hacher ni de blob obfusqué à décoder. Les analyses basées sur la réputation et les signatures sous-estiment toutes deux ce point, d'où l'importance de la question comportementale. Que fait la machine après l'installation de ce paquet ? — est celui qui l'attrape.

Orientation:

  • Traiter tout temps d'installation powershell -Contournement de la stratégie d'exécution comme signal de rupture de compilation, quelle que soit l'URL qu'elle récupère.
  • Alerte sur Jupyter lancé avec un jeton vide et –ip=0.0.0.0; cette combinaison ne devrait jamais apparaître sur un poste de travail ou un exécuteur.
  • Surveiller les connexions SSH sortantes vers les fournisseurs de tunnels (*.pinggy.io, *.trycloudflare.com) à partir des environnements de développement et d'intégration continue.
  • Installer uv de [sa source officielle](https://docs.astral.sh/uv/) et méfiez-vous des packages « d’assistance » tiers qui encapsulent un outil déjà très facile à installer.
  • Épinglez et réexaminez les dépendances lors de la mise à niveau — une ligne de paquets peut s'enrichir de nouvelles fonctionnalités d'une version à l'autre.
sca-tools-logiciel-outils-d'analyse-de-composition
Priorisez, corrigez et sécurisez vos risques logiciels
Obtenez votre compte gratuit.
Aucune carte de crédit requise.

Sécurisez le développement et la livraison de vos logiciels

avec la suite de produits Xygeni