Atacante usou 4.837 contas comprometidas do GitHub para roubar secrets de CI em mais de 1.806 repositórios
12 de Novembro de 2026

Desde terça-feira, um invasor usou credenciais roubadas de 4.837 contas do GitHub para inserir um infostealer em repositórios nos quais essas contas tinham permissão de escrita, segundo a Aikido Security, empresa de segurança de software.

O infostealer foi desenvolvido para coletar segredos e credenciais de nuvem acessíveis pelos fluxos de trabalho de integração contínua (CI) dos repositórios. Ele foi executado em pelo menos 1.806 repositórios, nos quais o invasor provavelmente coletou essas credenciais, afirma a empresa.

Cada ataque começava com um pull request intitulado `docs: dependency audit notes`, aberto a partir de um branch chamado `wfx-docs`. O objetivo era testar se a conta podia gravar no repositório. Esses pull requests de teste foram abertos em 61.764 repositórios e, em alguns deles, o infostealer foi instalado em seguida.

Em uma análise separada, pesquisadores da SafeDep, que vende ferramentas de segurança para a cadeia de suprimentos de software, identificaram 8.093 repositórios que receberam alterações maliciosas entre 12h46 UTC de terça-feira e 4h36 UTC de hoje. A contagem inclui todos os repositórios que receberam essas alterações, não apenas aqueles em que o infostealer foi executado. A busca se limitou aos branches padrão de repositórios públicos, portanto o total real é maior, afirmam os pesquisadores.

Em 7.309 desses repositórios, o infostealer foi acrescentado a um fluxo de trabalho existente. Em outros 771, foi incluído como um gancho `postinstall` do npm, que também é executado na máquina de um desenvolvedor durante a instalação de pacotes com `npm install`.

Depois de inserir o infostealer, o invasor geralmente revertia a alteração em poucos minutos. Nos casos em que o programa era executado, os logs eram apagados, normalmente junto com a própria execução. Nesses repositórios, todos os segredos e todas as funções de nuvem acessíveis pelos fluxos de trabalho devem ser considerados comprometidos.

Uma verificação do The Hacker News encontrou hoje cedo novos pull requests com o mesmo título, embora a busca da Aikido no GitHub tenha terminado na quarta-feira. Três pull requests analisados, abertos entre 5h04 e 5h38 UTC, partiram de branches `wfx-docs`. Não está claro se o infostealer foi instalado nesses casos.

Qualquer conta que tenha aberto um dos pull requests de teste do invasor está comprometida, mesmo que o infostealer nunca tenha sido executado, afirmou a Aikido em sua análise técnica. O documento não explica como o invasor obteve as credenciais.

Os pesquisadores da SafeDep recomendam que os responsáveis pelos repositórios afetados revoguem os tokens do autor das alterações, as permissões concedidas a aplicativos OAuth, as chaves SSH e as sessões, além de ativarem a 2FA. Também devem substituir todos os segredos e todas as variáveis que o repositório pode acessar. Quem executou `npm install` em uma alteração afetada deve considerar a máquina comprometida e substituir suas chaves.

Na maioria dos outros repositórios que receberam um pull request de teste, nenhuma alteração foi enviada depois, ou o infostealer não foi executado por causa das configurações do repositório ou das permissões da conta. Os números incluem apenas os repositórios públicos que a empresa conseguiu observar.

Os testes também atingiram repositórios que não pertenciam às contas comprometidas. Dos pull requests de teste, 10.431 foram enviados por meio de acesso de colaborador ou de organização. No momento da verificação da empresa, 92% deles ainda estavam abertos.

Como identificar um repositório afetado

Verifique se há os sinais abaixo, a partir de terça-feira, em qualquer repositório no qual você tenha permissão de escrita:

- Branch: `wfx-docs`
- Branch de curta duração: `chore/[a-z0-9]{8}`
- Branch: `ci-check-[0-9]{4}`
- Título do pull request: `docs: dependency audit notes`
- Mensagem de commit: `ci: refresh build cache`, que acrescenta cerca de 1.500 linhas a um fluxo de trabalho existente
- Mensagem de commit: `chore: add ci helper`, que acrescenta um script `.ci-xxxxxx.sh` e um gancho `postinstall` em `package.json`, executado a cada instalação com `npm install`
- Mensagem de commit: `chore: add dependency audit workflow`, que acrescenta `.github/workflows/build-audit-xxxxxx.yml` em um branch `chore/`
- Mensagem de commit: `chore: initial commit`, enviada antes de um novo arquivo de fluxo de trabalho em um repositório vazio
- Mensagem de commit: `ci: restore`
- Mensagem de commit: `ci: cleanup`
- SHA-256 do script do infostealer: `89695abb392d5cfd4972672961e644bb46baa98aa1ed7173c2a2816c762735cf`
- Endereço IP: `194.150.166[.]244:8080/exfil`
- Endereço IP: `18.143.168[.]96:8080/exfil`
- Endereço IP: `153.75.82[.]159:8080`

Um repositório pode não apresentar artefatos `wfx-loot`, entradas de cache `wfx-` ou resumos de etapas `WFX-BEGIN` e, ainda assim, ter perdido dados. A ausência do número da execução na alteração do invasor é um indício mais confiável de que o infostealer foi executado.

Segundo os pesquisadores da SafeDep, o infostealer envia dados por HTTP POST aos endereços acima ou a uma conversa no Telegram. Em uma amostra de 200 alterações que continham o programa, cerca de um quinto usou apenas o Telegram.

De acordo com a Aikido, o infostealer foi desenvolvido para coletar credenciais de todas as fontes disponíveis no executor. Entre elas estão segredos e variáveis do GitHub Actions, o `GITHUB_TOKEN` do fluxo de trabalho, tokens OIDC e de execução do Actions, chaves de serviços de IA e segredos armazenados na memória dos processos do próprio executor. O programa também lê arquivos de credenciais de AWS, Azure, GCP, Kubernetes, npm, PyPI, SSH e outras ferramentas, em seus locais habituais.

O infostealer também copia o repositório, seus 100 commits mais recentes e artefatos recentes dos fluxos de trabalho. Em executores próprios, coleta credenciais de nuvem dos metadados da instância, além do estado de containers Docker e de unidades do systemd.

O programa também contém configurações para repositórios privados, o que, segundo a empresa, sugere que pode estar sendo executado neles.

O infostealer foi projetado para usar as credenciais coletadas e avançar pelas contas de nuvem. Ele troca tokens OIDC do GitHub por sessões na AWS, no GCP e no Azure. Na AWS, também pode criar chaves de acesso de longa duração para usuários do IAM.

Algumas etapas do ataque foram criadas para continuar funcionando mesmo depois da troca das credenciais. O programa pode alterar a política de confiança de uma função da AWS para permitir acesso a qualquer conta da AWS.

Ele também pode adicionar credenciais de identidade federada com o prefixo `wfx-ci-` a aplicativos do Azure AD. Assim, os fluxos de trabalho do repositório comprometido podem entrar no Azure sem uma credencial armazenada, mesmo depois que todos os tokens forem substituídos.

Para localizar essas portas dos fundos, os pesquisadores recomendam verificar:

- Entra ID: credenciais federadas chamadas `wfx-ci-*` que você não criou
- AWS CloudTrail: sessões `AssumeRoleWithWebIdentity` ou `AssumeRole` chamadas `wfx-*`, seguidas por chamadas `CreateAccessKey` ou `UpdateAssumeRolePolicy`
- GCP: chamadas `GenerateAccessToken` e `SignJwt` originadas do seu conjunto de identidades de carga de trabalho do GitHub
- Vault: logins JWT provenientes do emissor OIDC do GitHub

O infostealer chegou a pelo menos um pacote do Packagist e a um módulo Go por meio de acionadores de publicação automatizados. Pelo menos 50 dos usuários comprometidos parecem publicar pacotes para npm, Go, Packagist, PyPI ou crates.

A Aikido afirma que o invasor parece estar atrás de segredos de CI, e não tentando se espalhar por meio de pacotes.

A versão 3.14.3 do pacote `digitalelvis/neuronai-studio`, do Packagist, é maliciosa. A empresa recomenda considerar comprometida qualquer máquina que tenha instalado o pacote ou executado seu código. A página do pacote informa que a versão foi publicada na quarta-feira. Hoje cedo, ela ainda estava disponível, acompanhada de um aviso de que versões do pacote haviam sido identificadas como malware.

Uma instalação normal com `composer install` não executa o infostealer, mas, segundo os pesquisadores, executar `npm install` dentro do diretório `vendor` do pacote aciona o programa. Os usuários devem bloquear a versão 3.14.3 e fixar a versão 3.14.2 ou anterior.

Duas versões do módulo Go `github.com/onuragtas/docker-env`, v1.0.278 e v1.0.280, contêm o infostealer apenas em um arquivo de fluxo de trabalho do GitHub Actions. O código Go e os binários de lançamento não foram alterados, e compilações de Go nunca executam arquivos de fluxo de trabalho. Por isso, é possível que usuários do módulo não tenham sido afetados. Ainda assim, a empresa recomenda remover essas versões.

Os pesquisadores também encontraram o infostealer em outro módulo Go, `github.com/vkuznet/gocurl`, na pseudoversão `v0.0.0-20261111095532-8d5aad0cb0da`, dentro de um fluxo de trabalho que nunca foi executado. Os usuários devem bloquear essa pseudoversão.

O infostealer também chegou a 28 repositórios do WebdriverIO por meio de alterações atribuídas à conta de bot `wdio-bot`. Nenhum lançamento de pacote foi afetado, mas o token do bot deve ser considerado roubado.

A Aikido constatou que as contas usadas nesta semana se sobrepõem às atingidas pela onda de outubro do GhostAction, quando contas do GitHub roubadas foram usadas para inserir fluxos de trabalho que furtavam segredos em repositórios.

As contas atingidas em outubro tinham cerca de 1.000 vezes mais probabilidade de serem usadas nesta semana do que outras contas ativas. Em mais de 100 repositórios, o novo infostealer foi acrescentado aos arquivos de fluxo de trabalho usados em outubro, sem remover a etapa anterior que enviava dados para fora.

A Aikido afirmou que “neste momento, não atribuímos a operação de novembro ao mesmo invasor”, pois a infraestrutura, as ferramentas e os métodos são diferentes, e credenciais roubadas muitas vezes acabam nas mãos de vários invasores.

**Correção (12 de novembro de 2026):** Uma versão anterior deste artigo afirmava que o infostealer enviava dados apenas por HTTP POST para dois endereços e que o invasor revertia cada alteração em menos de um minuto. Uma segunda análise identificou um terceiro servidor, um canal do Telegram e alterações que permaneceram por mais tempo.

Publicidade

Anuncie no CaveiraTech e coloque sua marca na frente de milhares de profissionais de cybersecurity

Nossa audiência é formada por analistas, pentesters, decisores e entusiastas que consomem nossas notícias todo dia pelo Site, Newsletter e Instagram. Fale com quem realmente importa para o seu negócio. Anuncie aqui. Saiba mais...