クラウド環境
GitHub Codespacesを悪用する情報窃取型マルウェア
本稿では、GitHub Codespaces(CS)を標的とした情報窃取型マルウェアの解析結果について解説します。
クラウドベースの開発環境では、開発者はどこにいてもコーディングすることが可能です。スマートフォンやタブレット等のブラウザとインターネットに接続できるデバイスがあればすぐに作業を開始することができます。GitHub Codespace (CS) もその一つで、Microsoft社が提供する多機能な開発プラットフォームです。GitHub Codespaceを利用することで、開発者はどこからでもソフトウェアを製作することができます。
2022年11月にGitHub CSが公開されると、GitHubユーザは、少なくとも二つのアクティブなCSインスタンスを作成し、これらを無料で利用することができるようになりました。なお、ストレージ、処理能力、使用期間には制限が設けられています。CSインスタンスは、Azureでホストされる独立した仮想マシン(VM)であり、ウェブブラウザ、GitHub CLI、またはVSCodeやJetBrains等の統合開発環境(IDE)を使用してアクセスすることが可能です。GitHubのユーザであれば誰でもCS環境を作成できるという点に攻撃者は着目し、これを悪用する手段を見出しました。
2023年1月、トレンドマイクロは、実証実験(Proof of Concept)を公開しました。これは、GitHub CSの機能を攻撃者が悪用することを想定しています。オープンディレクトリを自動構築するスクリプトを用いてパブリック共有ポートを持つコードスペースを作成し、マルウェアの拡散に利用するというものです。なお、オープンディレクトリを利用する手口は新しいものではなく、ランサムウェア、エクスプロイトキット、マルウェア検体等の不正なコンテンツを提供する手段として以前から攻撃者に使用されています。
上記例に関連して、トレンドマイクロでは、Windowsを標的としたRust言語ベースの情報窃取型マルウェアを発見しました。以前Twitterの投稿で記載したように、このマルウェアはアプリやプラットフォームに偽装していました。また、関連調査により、このような情報窃取型マルウェアがCSインスタンスのパブリック共有ポートを利用し、感染したマシンから認証情報を窃取している手口が判明しました。本稿では、人気のコンピュータゲームに偽装した事例について詳しく解説します。なお、続編では、この情報窃取型マルウェアが被害者のDiscordクライアントに変更を加え、感染したマシンにおいてパーシステンス(持続化)を獲得する手口につき分析しています。
攻撃の流れ
本情報窃取型マルウェアの検体をデコンパイラにより解析したところ、アンチデバッグ機能や、ウェブブラウザ、Discord、Steam、暗号資産ウォレット等からデータ窃取する機能等、興味深い関数名が複数存在することを確認しました。
アンチデバッグ関数及び解析対策用関数
まず、 malware::anti_debug::detect::hfc268b042e05af6a() 関数が、検体が制御された環境において実行されているか否かを確認します。この関数は、ユーザ名及び現在のホスト名をフェチし、Sandboxやデバッグ環境で使用されていた可能性のあるブロックリストのユーザ名及びホスト名と比較します。一致した場合、情報窃取プロセスは終了します。このメソッドに類似するものとして、アンチデバック及び解析対策を実装したPythonベースのアンチデバッガのレポジトリが確認できています。
窃取された情報の詳細
この章では、情報窃取型マルウェアの感染活動により窃取されたデータ及びプロセスの詳細について解説します。
ブラウザデータ
アンチデバッグチェックが開始され、Sandboxやアンチデバッグ環境が検出されない場合、マルウェアは被害者のマシンに保存されているパスワード、cookie、クレジットカード情報等の認証情報をウェブブラウザから収集します。以下に列挙された一般的なウェブブラウザが対象となります。
- 360Browser
- Amigo
- Brave
- Chromodo
- Chromunium (sic)
- CocCoc
- Comodo
- Epic Privacy Browser
- Google Chrome
- K-Melon
- Kometa
- Mail.Ru
- Maxthon3
- Nichrome
- Orbitum
- Slimjet
- Sputnik
- Torch
- Uran
- Vivaldi
- Yandex
上記「Chromunium」は、Chromiumのタイプミスであり、ブラウザとして作動しません。また、「Chromunium」がブラウザであるとの情報は、一般公開されている情報の範囲ではどこにも言及されていませんでした。なお、このリストには含まれていませんでしたが、現在Microsoft Edgeを含め、大半のブラウザのコードベースは無料のオープンソースプロジェクトであるChromiumをベースにしています。
なお、malware::browsers::steal_data::h8cac638d5caa2249() 関数の解析時に、get_chromunium_targets という関数についてメンションされていました。GitHubで関連する情報窃取型マルウェアのコードを検索したところ、Rust言語のソースコードを含むリポジトリが見つかりました。解析の結果、これは窃取した情報を攻撃者のWebhookに送信する情報窃取型マルウェアであることが判明しました。ファンクションコードの類似性、ブラウザの順序、標的となるアプリ等から、本稿で分析した情報窃取型マルウェアは、GitHubのリポジトリで発見された同型のマルウェアを元にしているか、または、そのマルウェアに影響を受けている可能性が高いと考えられます。
収集された各ブラウザの認証情報は、以下のファイルに保存されます。
%localappdata%\Microsoft\Security\Browsers\<browser_name>\Default\Passwords.tx
%localappdata%\Microsoft\Security\Browsers\<browser_name>\Default\Netscape Cookies.txt
%localappdata%\Microsoft\Security\Browsers\<browser_name>\Default\Credit Cards.txt
暗号資産ウォレットデータ
ブラウザの認証情報を収集した後は、複数の暗号資産ウォレットから情報を窃取します。そして、<%localappdata%>及び<%appdata%>フォルダ内のパスから、以下に列挙された既知のウォレットを標的にします。
- \Armory
- \atomic\Local Storage\leveldb
- \bytecoin
- \Coinomi\Coinomi\wallets
- \com.liberty.jaxx\IndexedDB\file__0.indexeddb.leveldb
- \Electrum\wallets
- \Ethereum\keystore
- \Exodus\exodus.wallet
- \Guarda\Local Storage\leveldb
- \Zcash
Discordデータ
また、このマルウェアは、メッセージングアプリDiscordを標的とし、Discordトークンを検索します。これらのトークンを取得すると、攻撃者はプラットフォーム上で被害者になりすますことが可能となります。トークンが見つかると、そのトークンは以下にあるファイルDiscord Tokens.txtに書き込まれます。
<%localappdata%Microsoft Appsecurity>
トークンは、以下のパスからスキャンされます。
- %appdata%\discord\
- %appdata%\discord\Local Storage\leveldb\
- %appdata%\discordcanary
- %appdata%\discordptb
- %appdata%\discorddevelopement
- %localappdata%\Discord
Steamデータ
以下ののSteam設定ファイルは、
%programfiles(x86)%Steamconfig
後に認証情報を送出するために以下のフォルダにコピーされます。
%localappdata%MicrosoftSecurity
窃取された認証情報及び設定ファイルは、以下のパスとファイルに保存されます。
- %localappdata%\Microsoft\Security\Browsers\
- %localappdata%\Microsoft\Security\Wallets\
- %localappdata%\Microsoft\Security\Steam\
- %localappdata%\Microsoft\Security\Discord Tokens.txt
情報送出
収集されたファイルは、diagnostics.zipという名のファイルに圧縮され、以下のパスに保存されます。
%localappdata%Microsoftdiagnostics.zip
送付には、ファイル共有型プラットフォームのgofile.ioを利用します。このプラットフォームでは、ユーザが匿名でファイルをアップロードして共有することが可能です。初めに、api.gofile.ioに検索要求を行い、利用可能なgofile.ioサーバをフェッチします。その応答により、ファイルの送受信先として最適なサーバがその後のリクエスト時に使用されます。なお、リクエスト形式はstoreX.gofile.ioとなり、ここにおけるXは数字を指します(図6の場合、store2)。
その後、マルウェアは、エンドポイント/uploadFileにPOSTリクエストを送り、圧縮ファイルをアップロードします。POSTリクエストのボディには、被害者から収集した認証情報が含まれています。
レスポンスとして、アップロードされたファイルが保存されているgofile.ioのURLを取得します。このURLは、認証なしで誰でもアクセスすることが可能です。また、guestTokenパラメータにはトークンが含まれており、アップローダーがparentFolder及びfileIdパラメータを削除する際に使用されます。gofile.ioのアップロードが完了すると、クエリifconfig.meが被害者のマシンのパブリックIPアドレスをフェッチします。
最後に、窃取した情報を攻撃者が管理するGithub webhookに送信します。この情報窃取型マルウェアが送出する情報をまとめると、以下のようになります。
- 検知したブラウザのリスト
- コンピューター名
- 収集したcookie数
- 収集したクレジットカードの総数
- Discordステータス(Discordのインストールの有無)
- 収集したパスワード数
- アップロードされたdiagnostics.zipのgofile.io URL
- Steamステータス(Steamデータ窃取の有無)
- 被害者アカウントのユーザ名
- 収集した暗号資産ウォレットのリスト
- Windowsオペレーティングシステムのバージョン
次に、被害者に関する全ての情報をJSONファイルに埋め込み、GitHub CSのURLへPOSTリクエストを通じて送信します。トレンドマイクロは、ポート8080を待ち受けているGithub CSエンドポイントに対して、窃取した情報を流出しようと試みるPOSTリクエストを確認しました。CSがアクティブであったならば、ポート8080が公開され、認証を必要としないため当該情報が送信され、攻撃者が受信することができたはずです。
検体の調査及び試験の結果、Webhookへのデータ流出は、ステータスエラー 「302 Moved Temporarily」 として失敗していました。gofile.ioのURLにアクセスすると、diagnostics.zipファイルがサーバにアップロードされており、また認証が不要なためURLのリンクを用いて誰もがダウンロード可能な状態であることが確認できるでしょう。
続編では、この情報窃取型マルウェアが、被害者のマシンにインストールされたDiscordを変更することにより、マシン内でパーシステンスを得る手口について詳しい解説を行っています。また、日々拡大する脅威からネットワークやエンドポイントを保護するために、ユーザやセキュリティチームがどのような対策を講じるべきか、セキュリティに関する推奨事項を列挙しています。
参考記事
Rust-Based Info Stealers Abuse GitHub Codespaces
By: Nitesh Surana, Jaromir Horejsi
翻訳:新井 智士(Core Technology Marketing, Trend Micro™ Research)