
Defesa contra o Ataque à Cadeia de Suprimentos Shai-Hulud
Uma ferramenta de segurança para detectar pacotes npm comprometidos nos ataques à cadeia de suprimentos Shai-Hulud (original de setembro de 2025 e Shai-Hulud 2.0 de novembro de 2025). Examina os arquivos package.json e package-lock.json para detectar versões exatas instaladas e Indicadores de Comprometimento (IoCs). Disponível em implementações Python e Node.js com configuração YAML centralizada para fácil manutenção.
Atualização mais recente: 24 de novembro de 2025 - mais de 738 pacotes comprometidos rastreados com 1.291 combinações exclusivas de pacote@versão. Agora detecta tanto as variantes originais do Shai-Hulud quanto as do Shai-Hulud 2.0.
Para varredura em múltiplos ecossistemas, consulte ore-mal-pkg-inspector.
Para varredura de pacotes maliciosos em múltiplos ecossistemas (npm, PyPI, Maven, RubyGems, Go, Cargo), consulte: ore-mal-pkg-inspector - Scanner abrangente de pacotes maliciosos com inteligência dinâmica de ameaças.
O OreNPMGuard concentra-se especificamente na defesa contra ataques Shai-Hulud para pacotes npm.
Shai-Hulud é um worm autorreplicante que começou a comprometer pacotes npm em 14 e 15 de setembro de 2025, representando o primeiro ataque autorreplicante bem-sucedido no ecossistema npm e um dos ataques à cadeia de suprimentos JavaScript mais graves já observados. Nomeado em homenagem aos vermes de areia gigantes da série Dune, de Frank Herbert, esse malware evoluiu para múltiplas variantes.
O ataque original infectou mais de 200 pacotes npm (conforme rastreado nesta ferramenta), com múltiplas versões afetadas por pacote.
Uma nova variante surgiu em novembro de 2025 com mudanças significativas:
preinstall (não apenas postinstall)setup_bun.js e bun_environment.js (além de bundle.js)Referência: Post do blog Wiz Research - Shai-Hulud 2.0
Paciente Zero: o ataque começou com o pacote rxnt-authentication publicado em 14 de setembro de 2025, às 17:58:50 UTC, pela conta npm "techsupportrxnt" comprometida.
Cadeia de Ataque (Shai-Hulud original):
postinstall que roda bundle.js (payload JavaScript de mais de 3 MB)data.json (duplamente codificado em base64).github/workflows/shai-hulud-workflow.yml) que exfiltra segredos do repositório para webhook[.]sitepostinstallCadeia de Ataque (Shai-Hulud 2.0 - novembro de 2025):
preinstall que roda setup_bun.js ou bun_environment.js (novos arquivos de payload)cloud.json, contents.json, environment.json e truffleSecrets.json.github/workflows/discussion.yaml com runner self-hosted para acesso de backdoor.github/workflows/formatter_*.yml para exfiltração de segredos (depois exclui o workflow para ocultar a atividade)docker run --rm --privileged -v /:/hostghp_*, gho_*), tokens de autenticação do npmShai-Hulud original (setembro de 2025):
@ctrl/tinycolor, ngx-bootstrap)Shai-Hulud 2.0 (novembro de 2025):
Roubo de credenciais verificado (de cerca de 20.000 repositórios analisados):
CRÍTICO: a Wiz Research confirmou que está ocorrendo exfiltração entre vítimas. Isso significa:
Implicação para investigação: ao revisar dados exfiltrados em seus repositórios, verifique se os dados realmente pertencem à sua organização ou a outra vítima.
Este ataque está diretamente ligado ao comprometimento s1ngularity/Nx de agosto de 2025, no qual o roubo inicial de tokens do GitHub possibilitou o ataque mais amplo à cadeia de suprimentos. Muitas vítimas iniciais do Shai-Hulud eram vítimas conhecidas do ataque s1ngularity. Pesquisadores de segurança também observam a integração de conteúdo gerado por IA na campanha, com confiança moderada de que um LLM foi usado para gerar o script bash malicioso.
Campanha Shai-Hulud original:
rxnt-authentication é publicado ("Paciente Zero")Campanha Shai-Hulud 2.0:
PyYAML (pip install pyyaml)js-yaml (npm install js-yaml)# Make executable
chmod +x shai_hulud_scanner.py
# Scan single package.json
python3 shai_hulud_scanner.py ./package.json
# Scan package-lock.json for exact versions
python3 shai_hulud_scanner.py ./package-lock.json
# Scan entire project directory
python3 shai_hulud_scanner.py ./my-project
# Scan current directory
python3 shai_hulud_scanner.py .
# Install dependencies first
npm install
# Make executable
chmod +x shai_hulud_scanner.js
# Scan single package.json
node shai_hulud_scanner.js ./package.json
# Scan package-lock.json for exact versions
node shai_hulud_scanner.js ./package-lock.json
# Scan entire project directory
node shai_hulud_scanner.js ./my-project
# Scan current directory
node shai_hulud_scanner.js .
✅ Detecção de Correspondência Exata: identifica pacotes com correspondência exata de versão em relação a versões comprometidas conhecidas
⚠️ Detecção de Risco Potencial: sinaliza pacotes com o mesmo nome, mas versões diferentes (podem ainda estar em risco)
🔍 Suporte a Dois Arquivos: examina tanto o package.json (dependências declaradas) quanto o package-lock.json (versões exatas instaladas)
📦 Cobertura Abrangente: a varredura do package-lock.json inclui dependências aninhadas e pacotes transitivos
🔄 Varredura Recursiva: examina automaticamente todos os subdiretórios, ignorando node_modules
📋 Relatórios Detalhados: mostra nomes de pacotes, versões, seções de dependências e versões afetadas
🔎 Detecção de IoCs: identifica Indicadores de Comprometimento tanto do Shai-Hulud original quanto do Shai-Hulud 2.0:
"postinstall": "node bundle.js", arquivos bundle.js, shai-hulud-workflow.yml"preinstall", setup_bun.js, bun_environment.js, workflows discussion.yaml, formatter_*.ymlwebhook.site, padrões de runner SHA1HULUD, escalonamento de privilégio em Docker🚨 Crítico (Pacotes Comprometidos Encontrados):
🚨 CRITICAL: Found 2 CONFIRMED compromised packages:
• @ctrl/deluge v7.2.2 in dependencies
Affected versions: 7.2.2, 7.2.1
• ngx-bootstrap v19.0.3 in devDependencies
Affected versions: 18.1.4, 19.0.3, 20.0.4, 20.0.5, 20.0.6, 19.0.4, 20.0.3
⚠️ Aviso (Divergência de Versão):
⚠️ WARNING: Found 1 packages with different versions:
• @ctrl/deluge v7.2.0 in dependencies
Known affected versions: 7.2.2, 7.2.1
✅ Limpo:
✅ No affected packages found
npm uninstall <package-name>npm cache clean --forcerm -rf node_modules"postinstall": "node bundle.js" em arquivos package.jsonbundle.js (mais de 3 MB, contêm payload malicioso).github/workflows/shai-hulud-workflow.yml"preinstall" em arquivos package.jsonsetup_bun.js e bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsonOs dados dos pacotes são centralizados em affected_packages.yaml. Para adicionar novos pacotes comprometidos:
affected_packages.yaml- name: "package-name"
versions: ["1.0.0", "1.0.1"]
Essa abordagem centralizada elimina a necessidade de atualizar vários arquivos quando novas ameaças são descobertas.
# Create central scanning script
curl -O https://your-domain.com/shai_hulud_scanner.py
chmod +x shai_hulud_scanner.py
# Mass scan multiple projects
for dir in /projects/*/; do
echo "Scanning $dir"
python3 shai_hulud_scanner.py "$dir"
done
# GitHub Actions example
- name: Scan for Shai-Hulud packages
run: |
curl -O https://your-domain.com/shai_hulud_scanner.js
npm install js-yaml
node shai_hulud_scanner.js .
if [ $? -ne 0 ]; then
echo "SECURITY ALERT: Compromised packages detected!"
exit 1
fi
# Add to security toolkit
cp shai_hulud_scanner.py /usr/local/bin/
cp shai_hulud_scanner.js /usr/local/bin/
cp affected_packages.yaml /usr/local/bin/
# Create alias for easy access
echo 'alias scan-shai="python3 /usr/local/bin/shai_hulud_scanner.py"' >> ~/.bashrc
postinstall; o Shai-Hulud 2.0 usa preinstall (aumenta a exposição em ambientes de build)Shai-Hulud original (setembro de 2025):
"postinstall": "node bundle.js" no package.jsonbundle.js (geralmente JavaScript minificado de mais de 3 MB)webhook.site.github/workflows/shai-hulud-workflow.yml para persistênciashai-hulud contendo commits maliciososShai-Hulud 2.0 (novembro de 2025):
"preinstall": "node setup_bun.js" ou "preinstall": "node bun_environment.js" no package.jsonsetup_bun.js, bun_environment.js (além de bundle.js)cloud.json, contents.json, environment.json, truffleSecrets.json.github/workflows/discussion.yaml (com runs-on: self-hosted e RUNNER_TRACKING_ID: 0).github/workflows/formatter_*.yml (correspondência de padrões, usado para exfiltração de segredos)Comum a ambas as variantes:
webhook.sitepreinstall (fase de execução do Shai-Hulud 2.0)setup_bun.js e bun_environment.jscloud.json, contents.json, environment.json, truffleSecrets.jsondiscussion.yaml e formatter_*.ymlprevention/block-shai-hulud.shPara problemas ou dúvidas:
.github/workflows/discussion.yaml (com runner self-hosted).github/workflows/formatter_*.ymldocker run --rm --privileged -v /:/host)webhook.site no código ou em logs de rededocker run --rm --privileged -v /:/hostwebhook.site (mesmo do original)