
はじめに
最近、ClickFixを利用したフィッシングが問題となっており、特にAIツールのインストールに関連する事例が目立っています。脅威アクターがAIツールのインストール手順を利用してユーザーを欺き、悪意のあるコマンドを実行させる事例が数多く確認されています。さらに、ユーザーがAIエージェントを信頼し、情報の提供に加えて、実行すべきコマンドの指示も受けるようになったことで、この問題はさらに深刻化しています。
ClickFixが攻撃手法として効果的なのは、組織が頼りにしているセキュリティ対策の多くを回避できるためです。悪意のある添付ファイルもドライブバイダウンロードもありません。被害者を誘導してコマンドをコピーさせ、自ら実行させるページがあるだけです。AIツールは、この手法でユーザーを誘導するための格好の材料となります。ユーザーはAIツールを信頼しているため警戒心が薄れやすく、ターミナルや「ファイル名を指定して実行」ダイアログに1行のコマンドを貼り付ける操作は、正規のセットアップガイドでも指示される一般的な操作だからです。
本記事では、エクサフォースで確認されたフィッシング攻撃の試みと、標的の端末で実行されるはずだったマルウェアの分析について解説します。
攻撃の流れ
攻撃者は、ユーザーがベンダーを信頼し、そのプラットフォーム上のコンテンツも信頼していることにつけ込み、フィッシングメールなどの連絡を直接送ることはせず、悪意のあるリンクを含むClaudeの会話を共有して、潜在的な被害者がアクセスするのを待っています。ZScalerも今月初めに、同じ事例について取り上げています。結局のところ、エージェントの回答をコピー&ペーストすることは、2020年代版の「StackOverflowからのコピー&ペースト」といえます。
攻撃の流れは次のとおりです。
- ユーザーがオンラインでClaude Codeのインストール手順やドキュメントを検索します。
- ユーザーは、1行のコマンドでツールをインストールする方法を案内する、共有されたClaudeの会話にたどり着きます。正規のドメイン上にあり、さらにエージェントの回答であるため、実際には不正な内容であるにもかかわらず、正規のコンテンツのように見えます。
- ユーザーがClickFixによるフィッシングの被害に遭い、コマンドが正常に実行されると、端末上でエンコードされたローダーが実行されます。
- ローダーはマルウェアをスクリプトとしてダウンロードし、そのスクリプトをosascriptに渡して実行させます。
悪意のあるコード
初期アクセス
前述のとおり、最初のステップでは、ユーザーがClaudeのインストール方法をオンラインで検索しました。検索結果の1つに、https://claude.ai/share/300f9c7b-f556-4a66-b92c-0c8c351ffe15が表示されました。これは共有されたClaudeの会話で、ユーザーが知りたいと思っていた内容と同じ質問が含まれていました。
その会話には、悪意のあるスクリプトをダウンロードして実行するcurlコマンドが含まれていました。ローダースクリプトのURLは、http://orangecountyfulfillment.com/curl/cb8aba940af2d1c05d800c73eefd598505b7377b288bc6cd39b0c97ece62b171 です。
一貫して確認された点として、すべてのスクリプトのダウンロード元ドメインは同じ(orangecountyfulfillment.com)ですが、各スクリプトは用途に応じた特定のディレクトリ(curl、ledgerなど)に格納されています。
また、クローリングを防ぐためにトークンやAPIキーも使用しているようですが、その値は固定されているとみられ、スクリプト内に含まれています。
マルウェアローダー
ローダー自体は、GZで圧縮した後、Base64でエンコードされたzshファイルです。その出力は、続いてevalコマンドに渡されます。
このスクリプトから、まず重要な情報が得られます。具体的には、他のファイルへアクセスするためのドメイン、トークン、APIキーです。これらが指定されていない場合、攻撃者のサーバーは520レスポンスコードを返します。
URLには、次の2つのURIが確認できます。
/dynamic/gate
各curlコマンドでは、User-AgentとAPIキーがHTTPヘッダーとして指定され、トークンはURLパラメーターとして渡されます。User-Agentは、フィルタリングに使用されるだけでなく、通信を正規のmacOSからのブラウジングに見せかけるために付与されている可能性もあります。
このドメインはIPアドレス104.21.30.162を指しており、CloudFlareのIPアドレスとみられます。
このコマンドでは、高い権限でコマンドを実行するために必要だとして、ユーザーのパスワードも入力するよう求めていました。パスワードが入力された場合、そのパスワードはマルウェアのダウンロードリクエストとともに攻撃者へ送信されます。パスワードが入力されなかった場合でも、マルウェア自体はダウンロードされ、実行されます。
いずれの場合も、ダウンロードされたスクリプトはosascriptに渡され、その出力はスクリプト内で指定されたパス/tmp/osalogging.zipに保存されます。その後、スクリプトはZIPファイルを10MBのチャンクに分割し、/gateへのPUTリクエストを通じて同ドメインにアップロードします。
AppleScriptで実装されたInfOsaStealer
osascriptに渡されるのは、大規模なAppleScriptです。このスクリプトには、ディレクトリの作成や一覧取得、ファイルの読み取り・書き込みといったユーティリティ処理から、認証情報の収集、スクリーンキャプチャ、パスワードの窃取を目的としたフィッシング、暗号資産ウォレットの窃取、永続化まで、さまざまな処理を行うコードが含まれています。
コードは、次の8つのセクションに分かれています。
- ユーティリティ/ヘルパー関数
- パスワードの収集
- ブラウザデータの持ち出し
- 暗号資産ウォレットの窃取
- システム全体からのデータ収集
- アプリのトロイの木馬化(ハードウェアウォレットに対するサプライチェーン攻撃)
- 永続化の仕組み
- データの持ち出しとクリーンアップ
スクリプトの実行フローは、FDA(フルディスクアクセス)の確認から始まります。
- 1. スクリプトは実行されるとすぐに、~/Library/Cookies/の一覧を取得してFDA(フルディスクアクセス)の有無を確認します。コマンドが正常に実行された場合は後続の処理を続行し、実行に失敗した場合は、FDAを有効にしてターミナルを再起動するようユーザーに促します。いずれの場合も、FDAによるアクセスに成功すると、スクリプトはシェルの起動ファイル(
~/.zshrc)を利用して永続化します。 - 2. 複数のターミナルからスクリプトが同時に実行されるのを防ぐため、スクリプトはロック用ディレクトリの作成を試み、その成否によって多重実行かどうかを判定します。ディレクトリがすでに存在し、作成に失敗した場合、スクリプトは終了します。一方、ディレクトリの作成に成功した場合は初回実行と判断し、後続の処理を継続します。
- 3. 続いてスクリプトは、プロンプトを表示してユーザーにパスワードの入力を求めます。入力されたパスワードは、
dsclを使用して検証されます。 - 4. パスワードを取得すると、スクリプトはブラウザ、キーチェーン、クラウド認証情報、チャットツールなどから情報の収集を開始します。
- 5. スクリプトは、LedgerおよびTrezorのアプリを攻撃者側のものに置き換えることで、トロイの木馬化しようとします。
- 6. 最後に、スクリプトはダウンロードしたエージェントを使用して永続化を確立するとともに、画面キャプチャも設定します。
すべての出力は最初のローダーに渡され、前のセクションで分析したPUTリクエストを介して外部へ持ち出されます。
ユーティリティ/ヘルパー関数
このセクションには、マルウェアの動作を支える基本的なスクリプトが含まれています。このスクリプトの作成者は、重複するファイル処理ロジックをスクリプト内の各所に記述するのではなく、ファイルの改ざん、ディレクトリの作成、パスの解析、ディレクトリの走査を行う複数の再利用可能なハンドラを実装しています。各関数はtryブロックで囲まれているため、個々の処理が失敗しても、スクリプトの後続処理には影響しません。これにより、一部のパスや権限を利用できない環境でも、マルウェアは処理を継続できるようになっています。
filesizer(paths):mdlsを使用してファイルサイズを取得mkdir(someItem): ディレクトリを再帰的に作成FileName(filePath): ファイル名のみを取得BeforeFileName(filePath): パスからファイル名を除いたディレクトリ部分を取得writeText(textToWrite, filePath)readwrite(path_to_file, path_as_save)readwriteSafe(path_to_file, path_as_save)isDirectory(someItem): パスがディレクトリかどうかを確認GrabFolderLimit(sourceFolder, destinationFolder)GrabFolder(sourceFolder, destinationFolder)grabPlugins(paths, savePath, pluginList, index)
FDA(フルディスクアクセス)の許可を求めるプロンプト
スクリプトの冒頭にあるFDAチェックは、プロセスにフルディスクアクセスが付与されているかどうかに応じて、後続のペイロードの実行経路を決定する分岐ポイントとして機能します。この確認は、ls -al ~/Library/Cookies/コマンドを実行することで行われます。コマンドが成功すると、フルディスクアクセスが利用可能であると判断され、ユーザーに目立った表示を行うことなく、スクリプトはそのまま主要なデータ収集処理へ進みます。
コマンドがエラーとなった場合(プロセスにFDAが付与されていないため)、スクリプトは.zshrcを利用した永続化を設定した後、正規のApple FileVaultの南京錠アイコンを使用し、正規のダイアログに見せかけた偽のシステムダイアログを表示します。ダイアログのタイトルには「Full Disk Access required!」と表示され、本文では、ユーザーに「allow access and reopen the Terminal」と指示します。このようなソーシャルエンジニアリングによって、マルウェアが完全に機能するために必要な権限をユーザー自身に付与させます。
ユーザーが「Continue」をクリックすると、すぐにシステム設定の「プライバシーとセキュリティ」画面が、「フルディスクアクセス」の項目が選択された状態で開きます。これにより、被害者はトグルをクリックするだけで、容易にフルディスクアクセスを許可できてしまいます。
ソーシャルエンジニアリングによるパスワード入力の誘導
Chromiumベースのブラウザでは、macOSのキーチェーンに基づくキーを使用して認証情報データベースを暗号化しており、キーチェーン自体もユーザーのログインパスワードで保護されています。このパスワードがなければ、窃取したLogin DataやCookieデータベースは暗号化されたデータのままであり、攻撃者はその内容を読み取ることができません。
ユーザーのパスワードを取得するため、攻撃者はgetpwd関数を使用します。この関数は、偽の南京錠アイコンを使用して「システム環境設定」を装ったダイアログを表示し、正しいパスワードが入力されるまで繰り返し入力を求めます。
その後、認証情報はcheckvalid関数によって検証されます。checkvalid関数は、入力されたユーザー名とパスワードを指定してdscl . authonlyを実行し、管理者権限を必要とせず、認証ダイアログを表示することなく、ローカルのmacOSディレクトリサービスに対して認証情報が正しいかを確認します。
キーチェーンパスワードの収集
grabAllStorageKeys関数を使用して、スクリプトはChromiumベースのブラウザがディスク上に保存されたパスワードの保護に使用する暗号化キーを抽出します。各ブラウザは、macOSキーチェーンに「Chrome Safe Storage」や「Brave Safe Storage」などのサービス名で固有のエントリを登録しており、そこに保存された値が、そのブラウザのLogin Data SQLiteデータベースのマスター暗号化キーとして使用されます。
ユーザーから正しいパスワードを取得すると、マルウェアはgrabAllStorageKeys関数を使用して、macOSキーチェーンからブラウザのSafe Storageキーを抽出しようとします。ブラウザからデータを収集するコードは、エンコードされたシェルスクリプト内に格納されています。
Base64でエンコードされたシェルコマンドは、端末にインストールされているブラウザのうち、パスワードを保存しているブラウザの認証情報をキーチェーン内で検索します。
ブラウザデータのダンプ
ブラウザデータの窃取では、13種類のChromiumベースのブラウザと4種類のFirefox系ブラウザを一度の処理で対象とします。マルウェアは各ブラウザについて、Default、Profile 1、Profile 2など、すべてのユーザープロファイルを列挙し、複数のブラウザプロファイルを設定しているユーザーのデータも漏れなく収集します。各プロファイル内で窃取対象となるファイルには、セクション2ですでに抽出したSafe Storageキーで暗号化された保存済み認証情報を格納するLogin Data SQLiteデータベースと、パスワードなしでWebサイト上のユーザーになりすますために利用できる有効なセッショントークンを格納するCookiesデータベースが含まれます。
Chromiumのシークレット情報のダンプ
Chromiumハンドラーは、13種類のブラウザ名と、それぞれに対応するデータディレクトリのパスを対応付けたマップを順に処理します。対象となるブラウザは、Chrome、Brave、Edge、Vivaldi、Opera、Opera GX、Yandex、Arc、Chromium、Chrome Beta、Chrome Canary、Chrome Dev、CocCocです。
各ブラウザについて、ユーザーデータディレクトリの内容を一覧取得し、名前が Default、または Profile で始まるフォルダを処理します。これにより、単一プロファイルと複数プロファイルの両方のブラウザ構成に対応します。各プロファイルでは、Network/Cookies、Cookies、Web Data、Login Data など、あらかじめ定義された対象ファイルのリストを順に処理し、それぞれをブラウザ名とプロファイル名を含むパスに配置して、ステージングディレクトリへコピーします。
リスト内の Local Extension Settings または IndexedDB のパスエントリを処理する際は、ディレクトリ全体をコピーする代わりに grabPlugins を実行し、ハードコードされた約40種類の拡張機能のホワイトリストに基づいて、対象の拡張機能IDのみを抽出します。この関数で使用されるホワイトリストは、暗号資産ウォレットではなく、パスワードマネージャー、二要素認証アプリ、ブラウザベースの認証情報管理ツールを対象としています。暗号資産ウォレットは、セクション4で別途処理されます。
Gecko系ブラウザ
Geckoハンドラーは、Chromiumハンドラーと同様のロジックを使用しますが、Chromiumとはファイル構造やプロファイル構造がまったく異なるFirefoxベースのブラウザを対象としています。Firefoxでは、認証情報やセッションデータがSQLiteデータベースに保存され、名前に「Profile」を含むか、末尾が「.default」のプロファイルフォルダ内に格納されています。ハンドラーは、マップに登録された各ブラウザのProfilesディレクトリを調べ、該当するプロファイルを特定します。対象となる4つのブラウザはFirefox、Zen Browser、LibreWolf、Waterfoxで、主流のブラウザからプライバシー重視のFirefox派生ブラウザまでをカバーしています。
該当する各プロファイルについて、Cookie、フォーム履歴、キーデータベース(key4.db)、閲覧履歴、保存済みログイン情報(logins.json および logins-backup.json)、証明書データベース(cert9.db)などのファイルをコピーします。各SQLiteデータベースについては、関連するWAL(write-ahead log)ファイルとSHM(shared memory)ファイルもコピーします。これらには窃取時点で進行中だったトランザクションに関する情報が含まれており、メインのデータベースファイルだけをコピーした場合に取りこぼす可能性のある情報も取得できます。
ただし、このハンドラーにはロシア語で記述されたコメントがいくつか含まれています。
広範なシステムデータの収集
ブラウザやウォレットに加え、このマルウェアはmacOSシステム上に保存されている可能性のあるその他の情報も収集します。Telegramのセッションファイル、macOSのキーチェーンデータベース、クラウドサービスや開発者の認証情報ファイル、実行中のプロセス情報を探索するほか、ユーザーのデスクトップ、書類、ダウンロードフォルダを幅広く検索し、機密性の高いさまざまな種類のファイルを収集します。
システム情報および被害者情報の収集
infoツールは、侵害されたシステムの情報を収集し、メタデータとしてまとめるために使用されます。収集される情報は以下のとおりです。
- マシンのユーザー名
1.1.2_release (x64_86 & ARM)というハードコードされた文字列で示されるマルウェアのバージョン。アーキテクチャ表記には誤記があり、x64_86ではなくx86_64が正しい表記ですBuild Tag: Build 5という固定文字列のビルドタグ- ハードコードされたIPアドレス(アフィリエイトまたはキャンペーンの個別インスタンスを識別するものと考えられます)
- ローダーで先に取得された平文のログインパスワード
続いて、ハードウェアおよびソフトウェアのインベントリ情報を収集するために、3つの system_profiler コマンドが実行されます。SPSoftwareDataType はmacOSのバージョンとインストール済みソフトウェアの情報を取得し、SPHardwareDataType はCPUモデル、シリアル番号、RAMなどのハードウェア情報を取得します。また、SPDisplaysDataType は、接続されているディスプレイとGPU構成の情報を取得します。
シェルのプロファイルファイルおよび履歴ファイル
攻撃者は、ユーザーのホームフォルダにあるシェルのプロファイルファイルやコマンド履歴ファイルも収集します。対象には、/.zshrc、/.zsh_history、/.bash_historyのほか、Git関連情報が保存されている可能性のあるGit設定ファイル/.gitconfigも含まれます。
Telegram
Telegramハンドラーは、GrabFolder関数を使用して、Telegram DesktopのApplication Supportディレクトリから tdata/フォルダー全体をコピーします。このフォルダーには、ログイン済みの認証状態を保持するTelegramのセッションファイルが含まれています。攻撃者は窃取したセッションを別のデバイスにインポートすることで、パスワードや二要素認証コードを入力することなく、被害者のアカウントになりすますことができます。
キーチェーン
Keychainsハンドラーは、ユーザーの~/Library/Keychains/ディレクトリ内にある、拡張子が.keychain-dbのキーチェーンデータベースファイルをすべてコピーします。主な標的は、ユーザーのデフォルトキーチェーンであるlogin.keychain-dbです。このファイルには、Wi-Fiパスワード、アプリケーションの認証情報、Safariに保存されたWebサイトのパスワード、証明書の秘密鍵、セキュアノートなどが保存されています。セクション2ですでに窃取した被害者のログインパスワードを利用することで、攻撃者はchainbreakerなどのツールやmacOS標準のsecurityコマンドを使い、このキーチェーンをオフラインでロック解除して復号できます。
クラウド認証情報の窃取
CloudKeysハンドラーは、ユーザーのホームディレクトリにある ~/.ssh/、~/.aws/、~/.kube/ の内容をコピーし、SSHの認証情報、AWSに保存された認証情報、Kubernetesクラスタの設定情報を収集しようとします。これらのディレクトリに保存されている可能性のある認証情報を取得することが目的です。
プロセス
Processesハンドラーは、2つのmacOSコマンドラインツールを使用して、感染時点で被害端末上で実行されているアプリケーションやプロセスの情報を取得します。lsappinfo listコマンドは、実行中のすべてのGUIアプリケーションについて、バンドルID、表示名、プロセスIDを一覧表示し、被害者が普段使用しているソフトウェアを攻撃者が把握できるようにします。ps axコマンドは、コマンドライン引数を含む実行中のすべてのプロセスを一覧表示し、lsappinfoでは取得できないバックグラウンドプロセス、デーモン、ターミナルセッションも対象とします。
ファイル収集
Filegrabber 関連の関数群は、機密情報が含まれている可能性のある特定の拡張子を持つファイルを検索します。対象となる拡張子は、pdf、docx、doc、wallet、key、keys、db、txt、seed、rtf、kdbx、pem、ovpnです。
基本となる Filegrabber 関数は、macOSのFinderオートメーションAPIを使用してファイルをコピーします。また、SafariのCookies.binarycookiesファイルとApple NotesのSQLiteデータベースを個別に取得し、データを漏れなく収集するため、関連するWALおよびSHMのジャーナルファイルも併せて取得します。
FilegrabberFDA は、フルディスクアクセス(FDA)に対応した Filegrabber の派生版で、Finder の代わりに -iname および -print0 オプションを指定したシェルの find コマンドを使用します。この方法はより高速で、プロセスに FDA が付与されている場合に適切に動作します。さらに、Cookie に加えて Safari のフォーム自動入力データと閲覧履歴データベースも収集し、保存済みの自動入力情報も窃取対象に含めます。
FilegrabberFDANotes は、Apple Notes のデータベースのみをコピーする簡略化された派生版で、FDA が利用可能で、かつファイルを一括収集する必要がない実行パスで使用されます。
暗号資産ウォレットの窃取
ウォレット窃取機能は、攻撃者にとって、ペイロード全体の中でも特に価値の高い機能の1つと考えられます。この機能は2つの異なる処理に分かれており、一方はブラウザ拡張機能として動作するウォレットを、もう一方はスタンドアロンのデスクトップウォレットアプリケーションを標的としています。これにより、ユーザーがmacOS上で暗号資産の保管に使用する主要なウォレットの大半が対象となります。
ブラウザ拡張機能型ウォレットについては、Ethereum、Solana、Cosmos、Cardano、Aptos、Sui、TRONを含む主要なブロックチェーンエコシステムのほぼすべてが標的となっています。また、デスクトップウォレットでは、Exodus、Electrum、Atomic Wallet、Ledger Liveなど、ファイルシステム上の既知の保存先に暗号化されたウォレットデータを保存するアプリケーションが対象となっています。
ChromiumWalletは拡張機能IDで90種類のブラウザ拡張機能型ウォレットを特定・標的化
ChromiumWalletsハンドラーは、Chromiumハンドラーと同じ方法でブラウザプロファイルを列挙します。ただし、パスワードマネージャーや2要素認証(2FA)ツールではなく、約90種類の暗号資産ウォレット拡張機能のIDを使用して対象を特定します。対象となるウォレットには、MetaMask、Phantom、Coinbase Wallet、Trust Wallet、Ronin、TronLink、Keplrなどがあります。
各ブラウザの各プロファイルでは、Local Extension Settings と IndexedDB の2つのパスのみが対象となります。ブラウザ拡張機能型ウォレットは、暗号化されたボールトデータやIndexedDB内のデータ、ローカルにキャッシュされた鍵情報をこれらの場所に保存します。grabPlugins はウォレットIDのリストを使用して該当する拡張機能フォルダだけをコピーするため、拡張機能ストレージ全体をコピーする場合と比べて、収集するデータ量を抑えることができます。
IndexedDBの処理では、index=true フラグが使用されます。このフラグが設定されると、grabPlugins は出力データを IndexedDB/ サブディレクトリ配下に保存し、オフライン解析ツールが想定するパス構造を維持します。grabPlugins にはこのための処理が実装されており、index が true の場合に、データの保存先を IndexedDB/ ディレクトリ配下に設定します。
これらの拡張機能の多くは、これらのディレクトリ内のLevelDBデータベースに、シードフレーズを含むAES暗号化されたボールトデータを保存しています。攻撃者は、この暗号化されたボールトデータとKeychainから取得したブラウザのSafe Storageキーの両方を入手することで、オフラインで復号するために必要なものをすべて揃えることができます。
DesktopWalletsによる20種類以上のデスクトップウォレットアプリのデータ収集
DesktopWalletsハンドラーの処理は、ChromiumWalletsよりもシンプルです。21種類のデスクトップウォレットアプリケーションと、それぞれの既知のディレクトリパスをまとめたリストを順に処理し、各エントリに対してGrabFolderを呼び出してディレクトリ全体をコピーします。
対象となるウォレットには、Exodus、Electrum、Atomic Wallet、Guarda、Coinomi、Sparrow、Wasabi、Bitcoin Core、Armory、Electron Cash、Monero、Litecoin Core、Dash Core、Dogecoin Core、Electrum-LTC、BlueWallet、Zengo、Trust Wallet desktop、Ledger Live、Ledger Wallet、Trezor Suiteが含まれます。
これらのディレクトリには通常、ウォレットのデータベースファイル、暗号化されたキーストア、アカウントのメタデータを含む設定ファイルが保存されています。また、ユーザーが以前にエクスポートしてそのまま残している、暗号化されていない秘密鍵が含まれている場合もあります。
ウォレットアプリのトロイの木馬化
LedgerやTrezorのようなハードウェアウォレットが標的として選ばれた背景には、シードが物理デバイス上にオフラインで保存されるため、ユーザーがシードフレーズはマルウェアからも保護されていると考えている可能性があります。
被害者のMac上のアプリケーションをバックドアが仕込まれたバージョンに置き換えることで、攻撃者は、ユーザーが次回そのアプリを開いて正規のトランザクションを実行する際に入力するシードフレーズやPINを窃取できます。攻撃者は、Electronアプリケーションを構成する app.asar ファイルと、メタデータを格納する Info.plist ファイルを標的とし、両方を攻撃者のサーバーからダウンロードしたファイルに置き換えます。
codesign -f -s - による再署名では、改変されたアプリがGatekeeperによって即座に拒否されるのを防ぐため、署名が付与されます。
Ledger Wallet
このコードはまず、シェルの test -d コマンドで /Applications/Ledger Wallet.app の存在を確認し、存在する場合にのみ後続の処理を実行します。これにより、Ledger Walletがインストールされていないシステムでの不要な処理を回避します。
Ledger Walletが見つかった場合、前述のAPIキーを使用して、悪意のある app.asar と Info.plist を含むZIPアーカイブをC2サーバーからダウンロードします。これらの悪意のあるファイルは、攻撃者のサーバー上の /ledger/ パスから取得されます。
正規のアプリは、まず /tmp/ 配下にコピーして一時的にバックアップされます。その後、元のアプリを削除してバックアップしたアプリを /Applications/ に復元し、アプリバンドル内の対応する2つのファイルを悪意のあるファイルに差し替えます。
その後、codesign -f -s - コマンドを使用して、アプリケーションバンドル全体をアドホック署名で強制的に再署名します。開発者IDが付与されていなくても、この署名によってmacOSはアプリを署名済みとして扱います。ユーザーから見ると、Ledger Walletアプリは通常どおり動作しているように見えますが、その裏ではシードフレーズやPINが密かに攻撃者へ送信されます。
Ledger Live
Ledger Liveのトロイの木馬化処理は、Ledger Walletと同じロジックを使用しますが、より古いLedger Live.appを標的とします。被害者の環境には、いずれか一方、または両方のアプリがインストールされている可能性があるため、両方が標的となっています。Ledger Live向けのペイロードは、/ledger/ではなくURIパス/ledger/live/から配信されます。
Trezor Suite
Trezor Suiteのトロイの木馬化では、Ledgerの場合と同じロジックで/Applications/Trezor Suite.appを標的としますが、悪意のあるapp.asarとInfo.plistを配置する際に、mvではなくcpを使用する点が異なります。さらに、このコードではxattr -crコマンドを使用して、改変されたアプリケーションバンドルから、Gatekeeperがインターネットからダウンロードされたファイルを判別する際に使用する隔離フラグなど、すべての拡張属性を削除します。これにより、トロイの木馬化されたアプリは「このアプリはインターネットからダウンロードされました」という警告ダイアログを表示することなく起動できます。
今回のURIパスは/trezor/です。
永続化メカニズム
シェルプロファイルへのインジェクションによる永続化
FAセクションで確認したように、このマルウェアは初期ローダーをダウンロードして実行するコマンドをユーザーの ~/.zshrc に追加することで、永続化を図ります。これにより、ターミナルを閉じた後もマルウェアを再実行できる状態が維持されます。
LaunchAgent
LaunchAgentを利用した永続化では、com.apple.1d9e9745.hcpiというコンパイル済みバイナリをC2サーバーからダウンロードし、ユーザーのホームディレクトリ内の隠しディレクトリ~/.local/に保存します。この名称は正規のAppleシステムコンポーネントの命名規則を模倣しており、不審に見えにくくすることを狙っています。このバイナリには実行権限が付与され、直ちにバックグラウンドで起動されます。また、事前に取得したパスワードが~/.local/.mpwdに保存されるため、ユーザーに再入力を求めることなく、以降のKeychainへのアクセスやブラウザデータの復号に利用できます。さらに、メインローダーとともにキャプチャエージェントもダウンロードされ、~/.local/com.apple.1d9e9745.capture.appにインストールされます。このアプリは、正規のAppleプロセスコンポーネントに見せかけるため、カスタム識別子com.apple.1d9e9745.captureを使用して再署名されます。LaunchAgentのplistは、PlistBuddyを使用して~/Library/LaunchAgents/に作成され、RunAtLoad=true(ユーザーのログイン時に直ちに起動)およびKeepAlive=true(プロセスが終了または強制終了された場合に自動的に再起動)が設定されます。これらの設定により、ローダーはユーザーがログインするたびに実行され、終了しても自動的に再起動します。そのため、plistも併せて削除しない限り、手動でプロセスを終了しても永続化を解除できません。
画面キャプチャ
/loader/capture-agent/ パスからダウンロードされるアーカイブには、標的端末のスクリーンショットを取得するための ScreenCap が含まれています。このアーカイブには、マルウェアのバイナリと plist ファイルが含まれています。
このツールは LaunchAgent としてインストールされ、RunAtLoad と KeepAlive が True に設定されます。これにより、ユーザーがログインするたびにツールが起動し、プロセスが終了されても自動的に再起動します。
エクサフォースの対応範囲
エンドポイント検出
エクサフォースは、HTTPリクエストの実行から、情報窃取や権限昇格の試行、その他エンドポイント上で行われる悪意のある活動まで、幅広く検出します。攻撃であることを確認した場合は、さらなる被害の拡大を防ぐため、対象ユーザーによる企業資産へのアクセスをブロックする対応も行います。
クラウドおよびSaaS脅威検出
攻撃者が、認証情報窃取機能によって盗み出した認証情報を使用して、クラウドやその他のSaaSアプリケーションへのアクセス権を取得した場合でも、エクサフォースは、クラウドプロバイダー、SaaSアプリケーション、エンドポイント、オンプレミス環境に対する攻撃に加え、それらの環境間の関連性も含め、幅広い検出に対応しています。
侵害の痕跡(IoC)
C2インフラストラクチャの概要
悪意のあるファイルのハッシュ
ブラウザ拡張機能
ブラウザウォレット
ブラウザ拡張機能
定数文字列
ロシア語のコメント
情報を含む文字列
- マルウェアのバージョンは、
1.1.2_release (x64_86 & ARM)という文字列としてハードコードされています。このアーキテクチャ表記には誤りがあり、x64_86ではなくx86_64が正しい表記です。 - ビルドタグは、
Build Tag: Build 5という文字列としてハードコードされています。 - IPアドレス:
IP: 100.53.137.34







