Pacotes npm maliciosos encontrados em vários serviços de nuvem da Red Hat
(github.com/RedHatInsights)- O problema está aberto e, até o momento do texto, não há responsável, milestone, branch vinculada ou PR
- Foi registrado como um incidente de segurança indicando que versões maliciosas foram encontradas em vários lançamentos npm no escopo
@redhat-cloud-services/ - Como referência, são apresentados a análise da StepSecurity e os resultados de busca do OSS Security Feed
- A lista de impacto atualizada inclui 32 pacotes, como
@redhat-cloud-services/chrome,frontend-components,rbac-client,typesevulnerabilities-client - As versões comprometidas mostradas na tabela são, em sua maioria, 3 por pacote, enquanto
@redhat-cloud-services/vulnerabilities-clientinclui apenas as versões2.1.9e2.1.11 - Considerando a tabela completa, é possível contar 95 versões comprometidas, e o título de um PR externo mencionado separadamente também aponta para
95 versions - A família
@redhat-cloud-services/frontend-components-*e vários pacotes*-clientaparecem juntos, indicando que o problema não se limita a um único pacote, mas afeta lançamentos em todo o mesmo escopo - Nos comentários, à pergunta “What are these?”, houve a resposta “all that module is pwned”, mostrando o entendimento de que toda a lista foi comprometida
- DanielRuf informou que adicionou este caso ao supply-chain-incidents
- Na atividade do GitHub, aparecem um resumo de conteúdo que referencia esta issue e um PR relacionado à detecção, mas o texto ainda não apresenta diagnóstico da Red Hat, medidas de mitigação, remoção ou versões corrigidas
1 comentários
Opiniões no Hacker News
Espero que não haja problema em retomar a discussão sobre a configuração de cooldown. O caso do axios, tanstack, @redhat-cloud-services e vários ataques recentes à cadeia de suprimentos do npm poderiam ter sido evitados se houvesse cooldown
Se você usa Artifactory/Nexus, provavelmente isso já existe, e mesmo que não exista, é fácil configurar. Como a maioria dos comprometimentos no npm ou no PyPI foi removida em poucas horas, basta ignorar pacotes com menos de N dias desde o lançamento. Até 1 dia já ajuda, 3 dias é razoável e 7 dias é um pouco exagerado, mas funciona
As versões mais recentes do pnpm já trazem cooldown de 1 dia por padrão: https://pnpm.io/supply-chain-security
Se você quiser resolver isso com um clique, pode usar https://depsguard.com. É uma CLI que adiciona cooldown e configurações recomendadas para npm, pnpm, yarn, bun, uv e dependabot, e eu sou o mantenedor
Também existe https://cooldowns.dev, mais focado em cooldown, e há scripts para ajudar com configurações locais. Tudo é open source/gratuito
Se você já sabe editar diretamente
~/.npmrce arquivos do tipo, provavelmente não precisa disso, mas se conhece pessoas ao seu redor que só precisam de uma correção com um clique, isso pode ajudar a evitar o próximo ataqueSó que, quando for preciso corrigir um novo CVE crítico, será necessário contornar o cooldown, e cada ferramenta tem sua própria forma de fazer isso. Não tenho números exatos para os últimos meses, mas mesmo nesta era de descoberta de vulnerabilidades ao estilo Mythos, o risco de ataques à cadeia de suprimentos de software, como a distribuição de versões maliciosas, ainda parece maior do que o de novos CVEs zero-day
~/.npmrce adicionar uma linha, ainda assim parece que o grupo que realmente precisa de uma correção com um clique é bem pequenoÉ perfeitamente possível dizer que “uma correção de segurança deve conter apenas correções de segurança e não incluir outros recursos”. Isso facilitaria a auditoria tanto para pesquisadores de segurança quanto para as ferramentas
Releases comuns poderiam passar por cooldown, enquanto correções de segurança poderiam ficar sem cooldown ou com um período muito menor
Vale olhar para sistemas como o Debian, que têm servidores extremamente estáveis e permitem configurar unattended upgrades para aplicar apenas correções de segurança. Novos releases de pacotes assim também ficam mais fáceis de auditar para pesquisadores de segurança
Em todo tópico desses aparecem muitos comentários agindo como se esse tipo de ataque existisse só no npm, ou zombando como se nada tivesse sido feito, mas acho isso injusto
Também há muitos comentários mencionando bons recursos introduzidos para proteger os consumidores de pacotes, como delay line e pnpm
A parte menos comentada são as ferramentas do lado dos mantenedores de pacotes. MFA para publicação: https://docs.npmjs.com/requiring-2fa-for-package-publishing-..., e os trusted publishers, disponíveis há cerca de um ano: https://docs.npmjs.com/trusted-publishers
Mais recentemente, surgiu também o staged publishing, que combina as vantagens dos dois recursos: https://docs.npmjs.com/staged-publishing
Agora dá para publicar a partir do CI sem credenciais estáticas e exigir que um mantenedor aprove com MFA antes de a publicação realmente ficar visível no registro. Se quiser, também é possível exigir múltiplas aprovações ou atraso de tempo no lado do CI com a proteção de GitHub Actions Environments
A comunidade deveria ser incentivada a adotar esses mecanismos de proteção de publicação; caso contrário, esse problema vai continuar
Então os pacotes maliciosos também teriam recebido a estrelinha verde e passado ao usuário a sensação de segurança de que foram “compilados e assinados com comprovação de origem”
[1] https://lwn.net/Articles/1075742/
É ótimo que haja trabalho em andamento para impedir isso, mas continua acontecendo mesmo assim. É engraçado no sentido de “lá vamos nós de novo”
Visto de fora, o desenvolvimento web tem uma energia de velho oeste caótico. Há mutabilidade, tipagem dinâmica, padrões e frameworks mudando o tempo todo, deploy contínuo, CDN, campanhas A/B em tempo real, muitas dependências e dados sensíveis de usuários espalhados por várias infraestruturas
Não estou dizendo que essa visão esteja correta, nem acho certa a atitude de “eu avisei”, mas entendo de onde ela vem
Em especial, nenhuma das duas teria impedido a entrada do backdoor do xz-utils na publicação do pacote. O xz-utils continua sendo a referência de comprometimento upstream sofisticado
O bug aqui não é que precisamos autenticar melhor um upstream em que já confiamos, mas que não dá para confiar no upstream como única fonte de segurança. Upstream é um grupo de hackers que tende a ter pouco interesse e pouca habilidade em engenharia de release robusta
Mas existem pessoas que fazem isso bem. A solução no mundo Linux, e a forma como fomos salvos no caso do xz-utils, é que existe uma segunda camada humana que revisa, audita, empacota e customiza o upstream feito por hackers para os usuários
Essas pessoas têm outros olhos, outras exigências de consumo e outros padrões de qualidade, e detectam bugs e intenções maliciosas que o upstream não está preparado para perceber
NPM, cargo, PyPI etc. continuam achando que dá para contornar a necessidade desse trabalho humano, mas não dá. No ecossistema NPM isso aparece com ainda mais frequência, especialmente porque há muitos desenvolvedores web acostumados a releases muito rápidos, exigências frouxas de compatibilidade e reutilização extrema, o que faz isso surgir mais em pacotes node do que em Python ou Rust
Na nossa empresa usamos yarn 4, e há uma opção para bloquear a instalação de pacotes npm nos primeiros dias após o lançamento. Parece que a maioria desses ataques é detectada dentro desse período (1 a 3 dias)
https://gist.github.com/mcollina/b294a6c39ee700d24073c0e5a4e...
O pacote axios foi comprometido, e as credenciais do autor também foram roubadas, então cada tentativa de correção era neutralizada novamente: https://www.trendmicro.com/en_us/research/26/c/axios-npm-pac...
O utilitário xz ficou com um backdoor por 2 meses: https://gigazine.net/gsc_news/en/20240403-timeline-of-xz-ope...
Um pesquisador estudante recebeu a manutenção dos pacotes Python ctx e PHPass, distribuiu mudanças maliciosas, e a detecção e correção levaram mais de 7 dias: https://infosecwriteups.com/how-i-hacked-ctx-and-phpass-modu...
A Kaspersky descobriu vários pacotes PyPI explorados por mais de 1 ano: https://www.kaspersky.com/about/press-releases/kaspersky-unc...
O pacote “LoftyLife” foi explorado durante alguns meses: https://securelist.com/lofylife-malicious-npm-packages/10701...
Se a janela de ataque mudar para 7 dias, todos esses novos ataques vão apenas incluir uma bomba-relógio que só dispara no 8º dia
pnpmtambém tem o mesmo recurso, e ele vem ativado por padrão a partir dav11: https://pnpm.io/settings#minimumreleaseageTenho algumas sugestões. Um cooldown de dependências de 1 a 2 dias parece ser muito eficaz sem prejudicar a capacidade de aplicar patches de CVE
Todo lugar onde código é executado, como
npm installenpm test, deve rodar em um ambiente sem privilégios. No GitHub Actions, é relativamente simples separar os jobs que fazem build/teste dos artefatos dos jobs que fazem deploy/assinatura etc. Se estiver usando IA, basta adicionar skills/guias que imponham esse padrãoSe você usa GitHub Actions, instalar a versão mais recente do zizmor melhora bastante a postura de segurança
A segunda medida faz com que isso deixe de ser “propagável como um worm”, reduzindo grande parte do problema atual. A primeira dá às empresas tempo para reagir ao ataque. Também vale avaliar alguns vendors dessa área
Foi engraçado como piada, logo depois de dizer que pacotes novos deveriam ser atrasados
Rodamos um proxy Maven localmente, e todos os builds são feitos dentro de contêineres. Python, npm e Go usam apenas repositórios públicos, então esses builds também podem ser feitos em contêineres sem necessidade de um proxy de repositório
É no mesmo dia em que Red Hat e IBM anunciaram o Project Lightwell para ajudar a detectar e corrigir vulnerabilidades na cadeia de suprimentos
https://www.redhat.com/en/lightwell
Há alguns dias vi este rant interessante: https://github.com/uNetworking/uWebSockets.js/blob/master/mi...
Faz sentido dizer que a maneira correta é fazer fork de todas as dependências que você usa e instalar a partir do seu próprio repositório, revisando e mesclando o upstream quando necessário. Só que isso parece extremamente trabalhoso
É bom para reduzir ou eliminar a dependência de provedores de hospedagem de dependências de terceiros, trazer as dependências para dentro da sua própria ferramenta de revisão de código e garantir builds reproduzíveis no longo prazo
Packj(https://github.com/ossillate-inc/packj) detecta dependências maliciosas de PyPI/NPM/Ruby/PHP etc. por análise comportamental. Ele faz varredura de indicadores de comprometimento, como execução de shell, uso de chaves SSH, comunicação de rede e uso de decode+eval, com análise estática + dinâmica de código. Também verifica vários atributos de metadados para encontrar agentes maliciosos, como typosquatting
Há cerca de uma semana removi o Node do meu notebook e me senti bem com isso
Mesmo se eu der azar e sofrer um exploit, estou tentando fazer todo o trabalho em contêineres de desenvolvimento ou outros sandboxes para reduzir o raio de impacto. O invasor até pode conseguir pegar tokens do Claude, mas não vai conseguir escapar facilmente do contêiner e vasculhar meu diretório home
Cooldown e allowlist de scripts de instalação são camadas extras especialmente boas para defesa em profundidade, principalmente em CI. Mas, no fundo, acho que o que precisa mudar é o modelo de permissões do sistema operacional. O padrão de confiar software de terceiros com permissões completas de usuário não funciona mais
Acho que vale colocar o link do anúncio original
https://www.stepsecurity.io/blog/multiple-redhat-cloud-servi...
Agora peguei o hábito de usar a flag
--before=2026-05-30ao instalar pacotes. Ela força a escolha de uma versão lançada antes da data especificada, e normalmente escolho algo como 5 dias anteshttps://docs.npmjs.com/cli/v11/using-npm/config#min-release-...
pnpme defino umminimumReleaseAgebem generosohttps://pnpm.io/settings#minimumreleaseage
Felizmente, isso vem ativado por padrão desde a v11
min-release-age=5ao.npmrcna raiz do projetoO NPM é quebrado desde o design, e a síndrome de NIH disseminada na comunidade impede até medidas simples
Como absorvem muitos pacotes externos em vez de desenvolver internamente, projetos npm tendem a ter árvores de dependências grandes e complexas. Já existe há muito tempo a reclamação de que pacotes como https://www.npmjs.com/package/is-windows criam vulnerabilidades potenciais e dores de cabeça de manutenção, mesmo quando seria fácil demais escrever esse mesmo código diretamente
Mas, obviamente, não é preciso recriar tudo; basta implementar o que você precisa
Além disso, quando você codifica só uma funcionalidade, não precisa criar abstrações nem interfaces extras de função. Então sai mais barato e provavelmente integra melhor
Outro erro é achar que isso vai criar bugs e vulnerabilidades. Se você for um programador ruim, talvez aconteça, mas pelo menos dá para evitar a categoria de vulnerabilidades que surge nas fronteiras de integração entre duas bibliotecas que não foram projetadas para se encaixar exatamente. E isso acontece bastante