MacOS スティーラー観察: セキュリティ担当者が注意すべきこと
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
この記事では、偽のソフトウェア更新ページを通じて配信される、AMOSエコシステムに関連するmacOSの資格情報盗難プログラムを紹介しています。被害者は、rvdownloads.comからヘルパーバイナリを取得し、zshを通じて実行し、AppleScriptの難読化をトリガーしてパスワード、ブラウザのアーティファクト、暗号ウォレットの拡張機能、Apple Notes、ローカルファイルを収集するコマンドチェーンを実行するよう促されます。持続性は、正規のSpotlightコンポーネントを装っている悪意あるLaunchAgent plistを使用して確立されます。この記事では、観測されたIOCや感染フローを検証するために使用した分析手順も共有しています。
調査
研究者は、Base64でエンコードされたURLを取得しデコードするカール・ワンライナーを初めて取得し、その後、ヘルパーバイナリのダウンロードを観察しました。ヘルパーはVM検出用と収集およびデータ流出を処理するAppleScriptの2つを実行しました。盗難者はKeychainから資格情報を取得し、セキュリティツールを終了しようとし、ブラウザとウォレットのデータを収集し、Apple Notesをコピーして、結果をアーカイブにまとめ、laislivon.comにアップロードしました。持続性はLaunchAgentをインストールして、ユーザーのログイン時にフルスクリプトチェーンを再実行することで作成されました。
緩和
特定された悪意あるドメインのブロック、署名されていないスクリプトの実行の制限、新しいLaunchAgentsに関連する異常なlaunchctlロードアクティビティの監視を行い、露出を減少させます。特に、不慣れなホストからリモートのコンテンツを取得する際に、curlとosascriptの疑わしい組み合わせをフラグするエンドポイント制御を使用します。可能であれば特権実行を制限し、未検証のヘルパーバイナリの開始を防ぐためにアプリケーションの許可リストを適用します。
対応
指標が見つかった場合は、エンドポイントを隔離し、アクティブな悪意のあるプロセスを終了し、ヘルパーバイナリを削除し、不正なLaunchAgent plistを削除します。優先的にKeychainのシークレットとブラウザに保存されたデータを含む、露出の可能性のある資格情報およびトークンをリセットします。リストされたIOCの法医学的アーティファクトを収集し、curl/osascriptの実行に関するシステムログをレビューし、同じC2インフラに関連する繰り返しのコールバックやダウンロードの試行を監視します。
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef technique fill:#ffedcc classDef process fill:#e2e2ff %% Nodes – Actions action_initial_access["<b>アクション</b> – <b>T1219 リモートアクセスツール</b><br/>Base64 URLをデコードし、zshシェルを実行してrvdownloads.com/frozenfix/updateからセカンダリペイロードをダウンロードするカールコマンドを実行します。"] class action_initial_access action action_obfuscation["<b>アクション</b> – <b>T1027 難読化</b><br/>ヘルパースクリプトは、Base64、カスタム算術、バイナリパディング、ジャンクコードの挿入を使用して文字列を隠します。"] class action_obfuscation action action_sandbox_evasion["<b>アクション</b> – <b>T1497.002 仮想化サンドボックス 回避</b><br/>AppleScriptは、system_profilerの出力で、QEMU、VMware、KVMなどのVMインジケータをチェックします。"] class action_sandbox_evasion action action_credential_harvest["<b>アクション</b> – <b>T1056.002 GUI入力キャプチャ</b><br/>偽造されたosascriptダイアログが管理者パスワードを要求し、Keychainと照合して~/.pwdに保存します。"] class action_credential_harvest action action_defense_evasion["<b>アクション</b> – <b>T1027.005 ツールからの指標削除</b><br/>マルウェアはLittle SnitchとBlockBlockを終了し、ランチエージェントをアンロードします。"] class action_defense_evasion action action_browser_theft["<b>アクション</b> – <b>T1217 ブラウザ情報探索</b><br/>Chrome、Brave、Edge、Opera、Firefoxのプロファイルを列挙し、ログインデータ、クッキー、オートフィル、拡張データを抽出して暗号ウォレット拡張をターゲットとします。"] class action_browser_theft action action_notes_theft["<b>アクション</b> – Apple Notesデータ盗難<br/>NotesのSQLiteデータベースと関連メディアファイルをステージングフォルダにコピーします。"] class action_notes_theft action action_data_staging["<b>アクション</b> – <b>T1132 データエンコード</b><br/>収集したファイルを/tmp/stolen_dataにコピーし、archive.tar.gzに圧縮します。"] class action_data_staging action action_c2["<b>アクション</b> – <b>T1102 ウェブサービス</b><br/>圧縮されたアーカイブをcurl POSTでhttps://laislivon.com/uploadにアップロードします。"] class action_c2 action action_persistence["<b>アクション</b> – <b>T1543.001 ランチエージェントの持続性</b><br/>LaunchAgent plist (com.apple.mdworker.plist)を~/Library/LaunchAgentsに書き込み、launchctlで読み込みます。"] class action_persistence action action_execution["<b>アクション</b> – <b>T1127.003 信頼された開発者ユーティリティプロキシ実行</b><br/>信頼された開発者ユーティリティを活用して、各ログイン時にosascriptを使用して悪意あるAppleScriptを実行します。"] class action_execution action %% Nodes – Tools tool_curl["<b>ツール</b> – <b>名前</b>: curl<br/><b>説明</b>: URL構文を使用してリモートサーバーからデータを転送します。"] class tool_curl tool tool_osascript["<b>ツール</b> – <b>名前</b>: osascript<br/><b>説明</b>: macOSでのAppleScriptまたは自動化向けJavaScriptを実行します。"] class tool_osascript tool tool_launchctl["<b>ツール</b> – <b>名前</b>: launchctl<br/><b>説明</b>: macOSのランチエージェントやデーモンを管理します。"] class tool_launchctl tool %% Nodes – Techniques (additional detail) tech_T1027_008["<b>技術</b> – T1027.008 シンボル剥奪ペイロード<br/>ペイロードからシンボルやデバッグ情報を取り除き、解析を邪魔します。"] class tech_T1027_008 technique tech_T1027_001["<b>技術</b> – T1027.001 バイナリパディング<br/>バイナリに非機能バイトを追加し、サイズとハッシュを変更します。"] class tech_T1027_001 technique tech_T1027_007["<b>技術</b> – T1027.007 動的API解決<br/>実行時にAPIを解決し、静的検出を回避します。"] class tech_T1027_007 technique tech_T1027_016["<b>技術</b> – T1027.016 ジャンクコード挿入<br/>解析ツールを混乱させるために無関係な命令を挿入します。"] class tech_T1027_016 technique tech_T1140["<b>技術</b> – T1140 復号化/デコード ファイルまたは情報<br/>実行する前にデータをデコードまたは復号化します。"] class tech_T1140 technique tech_T1555_001["<b>技術</b> – T1555.001 パスワードストアからの資格情報: Keychain<br/>macOS Keychainから保存された資格情報を抽出します。"] class tech_T1555_001 technique tech_T1555_002["<b>技術</b> – T1555.002 パスワードストアからの資格情報: Securitydメモリ<br/>セキュリティデーモンメモリから資格情報を読み取ります。"] class tech_T1555_002 technique tech_T1555_003["<b>技術</b> – T1555.003 ウェブブラウザからの資格情報<br/>ブラウザから保存されたパスワードを盗み取ります。"] class tech_T1555_003 technique tech_T1606_001["<b>技術</b> – T1606.001 ウェブ資格情報の偽造: Web Cookies<br/>セッションハイジャックのためにブラウザのクッキーを収集します。"] class tech_T1606_001 technique tech_T1132_001["<b>技術</b> – T1132.001 標準エンコード<br/>データ圧縮に標準エンコード(例: gzip)を使用します。"] class tech_T1132_001 technique tech_T1546_009["<b>技術</b> – T1546.009 イベントトリガー実行: AppCert DLLs<br/>信頼されたシステムイベントを介して実行をトリガーします。"] class tech_T1546_009 technique %% Flow Connections action_initial_access –>|使用| tool_curl tool_curl –>|ダウンロード| action_obfuscation action_obfuscation –>|使用| tech_T1027_008 action_obfuscation –>|使用| tech_T1027_001 action_obfuscation –>|使用| tech_T1027_007 action_obfuscation –>|使用| tech_T1027_016 action_obfuscation –>|使用| tech_T1140 action_obfuscation –>|つながる| action_sandbox_evasion action_sandbox_evasion –>|検査| tech_T1497_002 action_sandbox_evasion –>|つながる| action_credential_harvest action_credential_harvest –>|使用| tool_osascript action_credential_harvest –>|キャプチャ| tech_T1056_002 action_credential_harvest –>|抽出| tech_T1555_001 action_credential_harvest –>|抽出| tech_T1555_002 action_credential_harvest –>|つながる| action_defense_evasion action_defense_evasion –>|削除| tech_T1027_005 action_defense_evasion –>|つながる| action_browser_theft action_browser_theft –>|発見| tech_T1217 action_browser_theft –>|盗む| tech_T1555_003 action_browser_theft –>|収集| tech_T1606_001 action_browser_theft –>|つながる| action_notes_theft action_notes_theft –>|保存| action_data_staging action_data_staging –>|圧縮| tech_T1132 action_data_staging –>|エンコードを使用| tech_T1132_001 action_data_staging –>|つながる| action_c2 action_c2 –>|アップロード| tool_curl action_c2 –>|使用| tech_T1102 action_c2 –>|つながる| action_persistence action_persistence –>|作成| tech_T1543_001 action_persistence –>|読み込み| tool_launchctl action_persistence –>|つながる| action_execution action_execution –>|実行| tool_osascript action_execution –>|活用| tech_T1127_003 action_execution –>|トリガー| tech_T1546_009 "
攻撃フロー
検出
system_profiler列挙試行の可能性(process_creation経由)
表示
macOSローカルの資格情報入力による収集の可能性(cmdline経由)
表示
MacOS一時フォルダでアーカイブが作成されました(file_event経由)
表示
macOSブラウザのパスワード発見試行の可能性(cmdline経由)
表示
疑わしいカール実行試行[MacOS](cmdline経由)
表示
Base64エンコード文字列操作の可能性[MacOS](cmdline経由)
表示
悪意のあるカールとBase64コマンド実行の検出[Linuxプロセス作成]
表示
macOSスティーラー持続性とデータ流出の検出[Linuxファイルイベント]
表示
シミュレーション実行
前提条件: テレメトリ & ベースラインプリフライトチェックが合格していること。
理由: このセクションは、検出ルールを引き起こすための敵の技術(TTP)の正確な実行を詳細に説明しています。 コマンドとストーリーは、特定されたTTPを直接反映し、検出論理によって期待される正確なテレメトリを生成することを目的としています。
-
攻撃の背景 & コマンド:
被害者マシン上でユーザーレベルのアクセスを取得した攻撃者は、持続性を確立して収集された資格情報を流出させたいと考えています。
- 持続性: 攻撃者は標準のmacOS LaunchAgentsディレクトリに悪意のあるLaunchAgent plistを書き込みます(Linux収集機でホームディレクトリパスを経由してシミュレーション)。
- データ収集: 機密ファイルをステージングフォルダにコピーします。
- 流出準備: ステージングされたデータをアーカイブにしています
/tmp/archive.tar.gzネイティブを使用してtarユーティリティ。 - アクティベーション: 攻撃者は
launchctlでLaunchAgentをロードし、各ユーザーログイン時に悪意のあるコードを実行します。
正確なコマンドラインはルールが監視する文字列と一致し、アラートが生成されることを保証します。
-
リグレッションテストスクリプト:
#!/usr/bin/env bash set -euo pipefail # 1. ダミーの「盗まれた」ファイルを作成 echo "password123" > /tmp/credentials.txt # 2. 悪意のあるLaunchAgent plistを作成(シミュレートされた場所) PLIST_PATH="$HOME/Library/LaunchAgents/com.apple.mdworker.plist" mkdir -p "$(dirname "$PLIST_PATH")" cat > "$PLIST_PATH" <<EOF <?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.mdworker</string> <key>ProgramArguments</key> <array> <string>/usr/bin/cat</string> <string>/tmp/credentials.txt</string> </array> <key>RunAtLoad</key><true/> </dict> </plist> EOF # 3. 「盗まれた」データをアーカイブ(ルールが監視する正確なパス) tar -czf /tmp/archive.tar.gz -C /tmp credentials.txt # 4. LaunchAgentをロード(これがルールが監視するコマンドラインを生成) launchctl load "$PLIST_PATH" echo "シミュレーション完了 – 検出が発火したはずです。" -
クリーンアップコマンド:
#!/usr/bin/env bash set -euo pipefail # LaunchAgentをアンロード launchctl unload "$HOME/Library/LaunchAgents/com.apple.mdworker.plist" || true # ファイルを削除 rm -f "$HOME/Library/LaunchAgents/com.apple.mdworker.plist" rm -f /tmp/archive.tar.gz rm -f /tmp/credentials.txt echo "クリーンアップが完了しました。"