Bitwarden CLI npmパッケージのハイジャック――開発者認証情報の大規模窃取攻撃が発覚
(research.jfrog.com)JFrogのセキュリティ研究チームは、npmの@bitwarden/cliバージョン2026.4.0がハイジャックされていたことを発見した。正規のBitwardenメタデータとブランディングをそのまま維持しつつ、preinstallスクリプトとbwバイナリのエントリポイントだけを悪性ローダー(bw_setup.js)に置き換えた形だ。
動作方式
インストール時、ローダーはまずBunランタイムをGitHubからダウンロードし、その後で難読化されたJavaScriptペイロード(bw1.js)を実行する。Node.jsではなくBunを使うこと自体が検知回避戦略となっている。
ペイロードは3種類のコレクターを通じて、開発者ワークステーションとCI環境の認証情報を広範囲に収集する。
- ファイルシステムコレクター: SSHキー(
~/.ssh/)、Git認証情報(.git-credentials)、npmトークン(~/.npmrc)、.env、AWS認証情報(~/.aws/credentials)、GCP認証情報(~/.config/gcloud/credentials.db)など - シェル/環境コレクター:
gh auth tokenコマンドの実行、process.envのスキャンによるGitHub・npmトークンのパターン照合 - GitHub Actionsコレクター: トークン権限のあるリポジトリにワークフローを注入し、Actionsシークレットまで抽出
特に注目すべき点は、~/.claude.json、~/.claude/mcp.json、~/.kiro/settings/mcp.jsonなど、AIツールおよびMCP設定ファイルまで収集対象に含まれていることだ。
二重の流出経路
窃取したデータはgzip圧縮後、AES-256-GCM + RSA-OAEPハイブリッド暗号化を経て送信される。
- 第1経路:
audit.checkmarx.cx/v1/telemetryへHTTPS POST(正規のセキュリティサービスを装う) - 第2経路(GitHub悪用): 第1経路が失敗した場合、GitHubのコミットメッセージから
LongLiveTheResistanceAgainstMachinesというマーカーで二重Base64エンコードされたPATを検索して抽出する。beautifulcastleというマーカーとRSA署名検証により、代替の流出ドメインも動的に復元する。最終的に被害者のGitHubアカウントに新しいリポジトリを作成し、暗号化されたJSONをresults/ディレクトリにアップロードする。
感染判定
内蔵された正規Bitwarden CLIメタデータは2026.3.0なのに対し、パッケージルートは2026.4.0となっており、正規のビルドパイプラインではなく外部から悪性レイヤーを被せたものと分析されている。
対応方法
当該バージョンのインストール履歴がある場合、そのホスト上のすべての認証情報が流出したものとみなすべきだ。
npm uninstall -g @bitwarden/cliおよびキャッシュの削除- GitHub PAT、npmトークン、AWSアクセスキーの全面ローテーション
- Azure Key Vault / GCP Secret Managerの監査ログ確認
- GitHub Actionsワークフローで不正な実行履歴がないか点検
audit.checkmarx.cxおよび94.154.172.43のネットワーク遮断- AIツール設定ファイル(Claude、Kiroなど)の機密情報露出有無を確認
一般的なnpm認証情報スティーラーを超え、サプライチェーン侵害 + 多段階シークレット窃取 + GitHubインフラの武器化を組み合わせた精巧な攻撃だ。
4件のコメント
> THE MOST TRUSTED PASSWORD MANAGER
> Defend against hackers and data breaches
会社のホームページのタグラインが空虚に見えたので退会しました
ゾッとしますね;; 毎日使っていたものですが、運よくHomebrew側は情報を抜き取られなかったんですね。
はあ…… すべての npm のグローバルライブラリは、ひとまず削除するか、pre/postinstall を無効にするかしないといけませんね
Homebrew は
postinstallをデフォルトで無効化し、例外的に許可する方式に変わりました。運が良かったと言うべきか、npm を見ずにリポジトリのタグで更新していたので、今回はこのバージョンを回避できました。最近は npm のクールダウンも入ったので、たとえ npm を見ていても配布はされなかった気がします。うわ、これはかなり衝撃的ですね