GhostActionの攻撃者がGitHubの認証情報窃取キャンペーンを拡大し、第2段階の攻撃を開始しました。悪意あるJavaScriptをフォントファイルに偽装し、Visual Studio Codeのタスク機能を通じて開発者のワークステーションを狙っています。
Jenn Gile氏は、66のオーナーに属する94のリポジトリが侵害されていることを特定しました。分析可能だった79のリポジトリすべてでペイロードを確認しており、残る15のリポジトリにはアクセスできませんでした。
OpenSourceMalwareが調査に乗り出したきっかけは、Jamf Threat Labsの研究者Thijs Xhaflaire氏がPolinRiderの感染を調べる中でこのクラスターを発見したことです。今回の活動は、リポジトリのシークレットやGit履歴に残された認証情報を盗む悪意あるGitHub Actionsワークフローを軸にしていた、従来の攻撃を拡張したものです。
認証情報窃取マルウェアを偽フォントに隠すGhostActionの攻撃者
この攻撃では、ランチャーを.vscode/tasks.jsonに配置し、ペイロードをpublic/fonts/fa-solid-400.woff2に格納します。Font Awesomeのリソースに見えますが、実際には難読化されていない38行のNode.jsコードが入っています。eslint-checkというラベルのタスクが、この偽装スクリプトに対してNode.jsを呼び出します。
タスクはrunOn: folderOpenを使い、開発者がプロジェクトを開いた時点で実行されるよう要求します。さらに、表示設定によってターミナルが見えないようにしています。
実行には、信頼されたワークスペースであることと、自動タスクの許可が必要です。そのため、該当リポジトリをクローンしたり開いたりしただけでは、マルウェアが実行されたとは限りません。
ProtectDevices
実行されると、このスティーラーはユーザー名、ホスト名、一部の環境変数のほか、AWS、npm、PyPI、Git、Kubernetes、Claude、Geminiに関連する認証情報ファイルを収集します。
RSAおよびEd25519のSSH秘密鍵は全体を読み取ります。一方、ほかの8種類の認証情報ファイルについては、先頭の3,000文字までしか読み取りません。
さらに、ホームディレクトリを再帰的に検索し、AWS、Anthropic、GitHub、npm、PyPIのトークンなど、認証情報のパターンを探します。収集した情報は、ポート8080へのHTTP POSTで外部に送信されます。Jenn Gile氏は、このインフラを193[.]32[.]204[.]199に関連付けています。
cronに対応するシステムでは、ペイロードが5分ごとに実行されるスケジュールコマンドをインストールします。このコマンドは、ホスト名ごとに決まるサーバー上のパスからスクリプトを取得し、その応答をBashに渡して実行します。これにより、マシンごとに合わせた追加コマンドを実行できます。
このエントリには#ghc2というマーカーが付いており、インストール時に同じマーカーを持つ既存のエントリを削除してから新しいエントリを追加します。そのため、悪意あるリポジトリのファイルを削除しても、この足がかりは残ります。
Jenn Gile氏は、サーバーから配信される後続のペイロードを入手できておらず、その機能は不明のままです。Windowsには攻撃対象のcrontabの仕組みがありませんが、認証情報の収集は実行される可能性があります。
第2段階の追加の大半は10月15日に行われました。以前の悪意あるワークフローを削除した2人のオーナーが再感染しており、ファイルを削除するだけでは攻撃者のアクセスを排除できないことがわかります。
PolinRiderの偽フォントランチャーと似ていますが、Jenn Gile氏の調査では、両者に共通の攻撃者がいることを示す共有の痕跡は見つかっていません。
対応にあたる担当者は、まず侵害されたGitHubへのアクセスを無効化してから、クリーンアップに着手する必要があります。そのうえで、書き込み可能なすべてのリポジトリを調べ、悪意あるタスクとワークフローを削除し、エンドポイントに残された永続化の仕組みも調査してください。
ファイル、環境変数、Git履歴を通じて漏えいした認証情報は、封じ込めの完了後に、クリーンな端末からローテーションする必要があります。
IOC(侵害指標)
| カテゴリ | ファイル/指標 | SHA-256/役割 |
|---|---|---|
| ファイル | public/fonts/fa-solid-400.woff2(バッチタグ reinject) |
cb3842832267421b9563c7bd32d3582a8fff624860e57c2c9058966735d4da60 |
| ファイル | public/fonts/fa-solid-400.woff2(バッチタグ auto_20261015) |
61eca87b4b4c3e6248dc0fde25ff9cf28637798a8c4be172eaef9843252d12f6 |
| ファイル | public/fonts/fa-solid-400.woff2(バッチタグ auto_20261014) |
92dec8f50d934c338ff3c1bcbf1c9b028aa9561128d0077a101a1ef4dac0f0db |
| ファイル | .vscode/tasks.json |
a043f03e89ef55779f4f630138cf5efe1dd37632e176c7a0d9bbfa989ba84eeb |
| ファイル | .github/workflows/security-audit.yml(初期バージョン) |
6d258db70677c99c08c9db37e002751eb0f0fb7c0cab2a4effd7c8fa8d115d19 |
| ファイル | .github/workflows/security-audit.yml(第2バージョン) |
d301438d713006a7a63889969fb5a30389c88bba5fbd89ef22becac611823a4f |
| ファイル | .github/workflows/lint.yml(第2段階ワークフローの参考例) |
40a007874722c46e0d194c4453f6cee26ee9c64513597784cc9c0e8b85471e7c |
| ネットワーク | 193[.]32[.]204[.]199 |
GhostActionのサーバー |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/?c=reinject |
インフォスティーラーと第2ワークフローによる情報送信先 |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/?c=auto_20261013 |
日付入りバッチタグでの情報送信先 |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/?c=auto_20261014 |
日付入りバッチタグでの情報送信先 |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/?c=auto_20261015 |
日付入りバッチタグでの情報送信先 |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/?c=security |
1つのリポジトリで確認された初期のStage 1亜種 |
| ネットワーク | hxxp://193[.]32[.]204[.]199/?c=new |
最初のStage 1バージョン |
| ネットワーク | hxxp://193[.]32[.]204[.]199:8080/c2/<hostname> |
cronジョブが取得するスクリプト |
注記: IPアドレスとドメインは、誤って名前解決されたりハイパーリンクになったりするのを防ぐため、意図的に無害化(例:[.])しています。無害化を元に戻すのは、MISP、VirusTotal、SIEMなど、管理された脅威インテリジェンスプラットフォーム内に限ってください。
16,000以上のSOCチームがANY.RUNを導入し、脅威調査の効率化と手作業の削減を実現しています。 チームでの導入を検討する
翻訳元: https://gbhackers.com/ghostaction-hackers-hide-credential-stealing-malware/