今週、偽のクライアントが私の受信トレイに悪意のあるGitHubリポジトリを送り込んできました。スタータースクリプトを実行しただけで、2日分の作業が消え、ブラウザに保存していたすべてのパスワードが流出してしまいました。
その「クライアント」は高給のシニアエンジニア職を募集しており、迅速にメッセージを送り、一見すると整ったリポジトリを送信してきました。依頼内容は単純なものでした。クローンして npm run dev を実行し、デモが動作していることを証明するためにスクリーンショットを送るというものです。契約もバックグラウンドチェックもありませんでした。開発サーバーが起動した瞬間、設定ファイル内に隠されていたコードがコマンド&コントロール(C2)サーバーに接続し、第2段階のペイロードを取得して、ローカルマシンから認証情報を抜き取り始めました。
攻撃の仕組み
悪意のあるペイロードは postcss.config.js に潜んでいました。このファイルは通常、いくつかの単純なCSS処理ルールが含まれているだけなので、ほとんどの開発者は見過ごしてしまいます。今回の場合、攻撃者は正当な記述のずっと右側に、スペースで埋めて目立たないように細工した難読化済みのJavaScriptの行を追記していました。npm run dev コマンドによってPostCSSのパイプラインが実行されると、その隠された行が気づかれずに実行されました。
マルウェアは以下の3つのステップを迅速に実行しました。
- C2への接続 – 攻撃者が制御するサーバーへのネットワーク接続を開き、侵害されたホストを通知しました。
- 第2段階のダウンロード – 本格的なデータ流出ロジックを含む追加のコードをプルしました。
- ブラウザの認証情報窃取 – macOSの場合、システムキーチェーンに保存されているChrome Safe Storageキーを照会しました。ユーザーがキーチェーンのプロンプトを承認してしまうと、攻撃者はChromeに保存されているすべてのパスワードを収集しました。
即座の窃取にとどまらず、ペイロードはVS Code、npm、Discordといった一般的な開発ツールに自身を書き込み、それらのアプリケーションを今後起動するたびに悪意のあるコードが再実行されるようにしました。単なる再起動では感染は解消されず、次に npm install を実行したりエディタを開いたりするたびに、バックドアが復活しました。
見落としがちなレッドフラグ(警告サイン)
- 契約締結前にコードの実行を要求される。 正当な採用プロセスでは、通常、独自の作業を共有する前に正式な合意が行われます。
- 「プロジェクト概要」を装った圧縮ファイル。 ZipやRARアーカイブには、実行可能なスクリプトや悪意のあるバイナリが隠されている可能性があります。
- 「プラットフォームのフィルターを回避するため」という理由での個人メールアドレスの要求。 この手口は、不正行為を報告できる保護されたプラットフォームの外へ会話を誘導するためのものです。
- 候補者に仮想通貨ウォレットへの入金やテスト用トークンの購入を求める職務記述書。 このような要求は、本物の開発業務では異例です。
安全を守るための実践的なステップ
- 中身を確認せずに他人のコードを実行しない。 リポジトリを読み取り専用ビュー(GitHubのrawファイル表示など)で開き、すべてのスクリプト、特に設定ファイルや
package.jsonのscriptsエントリをスキャンしてください。 - すべての添付ファイルをプレーンテキストとして扱う。 Zipファイルが送られてきた場合は、サンドボックス環境で展開し、何かを開く前に内容を調査してください。
- ブラウザの保存機能ではなく、専用のパスワードマネージャーを使用する。 ブラウザのキーチェーンが侵害されたとしても、マネージャーの保管庫は隔離されたままです。
- 信頼できないコードは、ネットワークアクセスを遮断した隔離された仮想マシンまたはコンテナで実行する。 これにより、攻撃者がC2サーバーに到達するのを防ぐことができます。
- すべてのカウントで二要素認証(2FA)を有効にする。 パスワードが盗まれたとしても、二要素目が不正なログインを阻止します。
- 開発ツールを最新の状態に保ち、利用可能な場合は自動整合性チェックを有効にする。 一部のエディタでは、コアファイルが予期せず変更されたときに警告が出るようになっています。
もし悪意のあるコードを実行してしまった疑いがある場合は、システムが侵害されたものと想定してください。重要なデータをバックアップし、ドライブを消去して、オペレーティングシステムを再インストールしてください。一般的なアプリ内のファイルを書き換える永続化メカニズムがある場合、単なる再起動では根絶できません。
結論: たった一行の隠されたJavaScriptが、日常的なデモを本格的な認証情報窃取作戦に変えてしまう可能性があります。検証が完了するまでは、すべてのリポジトリを信頼できないものとして扱い、隔離をワークフローのデフォルトとして組み込んでください。一瞬の焦りがもたらす代償は、ファイルを確認する手間よりもはるかに大きいのです。
