Bitwarden CLI が93分だけ汚染された — Shai-Hulud 第3波とnpmサプライチェーン攻撃の進化

はじめに

パスワードマネージャ業界トップ3、ユーザー数1,000万人超の Bitwarden。その CLI が npm 上でわずか 93 分だけ、マルウェアに汚染されていた——。2026年4月22日夜(米東部時間 17:57〜19:30)、@bitwarden/cli@2026.4.0 にクラウド認証情報を吸い上げる自己増殖型ワーム「Shai-Hulud: The Third Coming」が混入した。ダウンロードしたのは約334名と少数ながら、その全員が開発者——つまり GitHub トークンや AWS 認証情報を持つ人間ばかりだった。本記事では、この事件の技術的な仕組み、過去のサプライチェーン攻撃との決定的な違い、そしてエンジニアが今すぐ確認すべき対応をまとめる。

何が起きたのか — 93分間の汚染

汚染されていたのは npm 経由で配布された @bitwarden/cli@2026.4.0 のみ。Chrome 拡張機能、デスクトップアプリ、MCP サーバーなど他の配布経路は一切影響を受けていない。Bitwarden のセキュリティチームは検知から 93 分で修正版 2026.4.1 をリリースしており、これは昨今のサプライチェーン攻撃対応としては異例の速さだ。

攻撃ベクタは Bitwarden 本体のコードベースではなく、CI/CD パイプラインの侵害だった。具体的には publish-ci.yml の GitHub Actions ワークフローに悪意あるコードが注入され、正規の @bitwarden ネームスペースから悪質バージョンが配布される構造になっていた。週次78,000ダウンロードという信頼されたパッケージの流通経路が、そのまま武器化されたかたちだ。

Bitwarden は公式声明で「エンドユーザーのボルトデータへのアクセスは一切発生していない」と明言している。影響を受けるのは該当時間帯に npm install した開発者のみで、保存された Bitwarden 上のパスワードデータは安全だ。ただし、その開発者の手元にあった GitHub トークンや SSH 鍵は別の話になる。

Shai-Hulud ワームの技術的仕組み

このマルウェアは自らを「Shai-Hulud: The Third Coming」と名乗り、過去2波のキャンペーンを継承する意志を明示している。Frank Herbert の『DUNE』に登場する砂蟲の名を冠したこのワームは、2段階構造で動作する。

第1段階は bw_setup.js。OS を検出して、正規の Bun JavaScript ランタイム(v1.3.13)をダウンロードし実行する。Bun を使うのは検出回避のためだ——Node.js ではなくマイナーなランタイムを介在させることで、既存の EDR やセキュリティスキャナのシグネチャにヒットしにくくしている。preinstall フックで発火する仕様のため、npm install した時点で即座に発動する。

第2段階は約10MB の難読化された bw1.js ペイロード。0x3039 をシードとした __decodeScrambled 関数で実行時に復号される。このペイロードが以下を窃取する:

  • GitHub トークン / npm トークン
  • .ssh/ 配下の秘密鍵
  • .env ファイル内の環境変数
  • シェル履歴(~/.bash_history, ~/.zsh_history)
  • GitHub Actions シークレット
  • AWS / GCP / Azure のクラウド認証情報

さらに ~/.bashrc と ~/.zshrc にペイロードを追記して永続化し、/tmp/tmp.987654321.lock をロックファイルとして多重実行を防ぐ。通信先はタイポスクワット先の audit.checkmarx[.]cx/v1/telemetry(正規ドメインは .com)と、IP 94.154.172.43 直接。

なぜ「第3波」が危険なのか — 自己増殖の仕組み

過去の Shai-Hulud キャンペーンと本波の決定的な違いは、自己増殖機構だ。窃取した GitHub トークンを使い、被害者のアカウント上に公開リポジトリを作成し、そこに認証情報を public commit として投下する。

これが何を意味するか——感染した別のマシンがその公開コミットを読み取り、他人から盗まれた認証情報で自らの exfiltration に転用できる。攻撃者はもはや中央サーバを持たなくても、GitHub 自体がワームの増殖基盤になる。npm 汚染と GitHub 汚染を相互連鎖させ、分散型ボットネットに近い構造を作り出している。

この攻撃は、より広範な Checkmarx サプライチェーンキャンペーンの一環と見られており、Checkmarx の KICS Docker リポジトリなども同時期に同じ C2 インフラ経由で侵害されている。ただしペイロードには独自のイデオロギー的署名(“Butlerian Jihad” 等の『DUNE』用語)が含まれており、Socket は「別オペレータの可能性、もしくは同一グループの進化」と分析している。

エンジニアが今すぐ確認すべきこと

該当期間(2026年4月22日 ET 17:57〜19:30)に @bitwarden/cli を npm でインストール・更新した場合、以下を即座に実行してほしい。

  1. パッケージのアンインストールとキャッシュクリア:npm uninstall -g @bitwarden/cli && npm cache clean --force、そして 2026.4.1 以降に更新する。
  2. 認証情報の全ローテーション:GitHub の PAT、npm トークン、AWS/GCP/Azure のアクセスキー、SSH 鍵。特に CI/CD で使っているものを優先。
  3. IoC のチェック:/tmp/tmp.987654321.lock の存在、~/.bashrc・~/.zshrc の末尾に見覚えのない注入がないか、94.154.172.43 向けの通信ログ。
  4. GitHub アカウントの点検:身に覚えのない public リポジトリが新規作成されていないか。Shai-Hulud の増殖シグネチャはここに残る。
  5. シェル履歴の確認:~/.bash_history / ~/.zsh_history に流出した可能性のある機密コマンドを棚卸し。

中長期的には、npm の --ignore-scripts デフォルト運用、preinstall/postinstall フックのある依存の監査、短命なトークン(OIDC ベースのクラウド認証等)への移行が有効な防御策になる。

まとめ

  • @bitwarden/cli@2026.4.0 は npm 上でのみ 93 分間汚染され、約334名が影響を受けた。Bitwarden 本体・ボルトデータは無事。
  • 攻撃は CI/CD の GitHub Actions ワークフロー侵害による「正規ネームスペースからの悪質版配布」で、最も信頼される流通経路が武器化された。
  • Shai-Hulud 第3波は GitHub 公開リポジトリを介した自己増殖機構を持ち、従来型の「C2 サーバ停止で封じ込め」が通用しない新しい構造に進化している。
  • 該当時期にインストールした開発者は、認証情報を全ローテートし、GitHub アカウントに不審な public リポジトリがないか確認すべき。

サプライチェーン攻撃は「何を信頼するか」ではなく「信頼の撤回をどれだけ速く・広く実行できるか」の勝負になりつつある。93分という対応速度は希望的な事例だが、その間に走った npm install の痕跡が長く残ることを、今後の教訓として持ち帰りたい。

今日のその他のニュース

CLAUDE.md を3層構造で83%軽量化(ペパボ) — 肥大化した CLAUDE.md をルール・スキル・その他に分割することでコンテキストサイズを劇的に削減した実例。Claude Code を長期運用するチームにとって、コンテキスト設計は生産性に直結する課題となっている。記事

Claude Code 品質問題ポストモーテム(Anthropic) — ユーザーから報告されていた挙動劣化の原因と対応を公開。AI エージェント運用の透明性確保という観点でも注目される公開ポストモーテム。記事

Go 1.24 の TLS、気づかぬうちに PQC で動いている — Go 1.24 から TLS ハンドシェイクで量子耐性暗号 (PQC) がデフォルト有効化。サプライチェーン攻撃とは別軸だが、インフラレベルでの暗号移行が静かに進行中。記事

ソース