macOS 惡意軟體

PamStealer macOS 惡意軟體新變種:伺服器端金鑰交換與多層持久化機制分析

作者

整體而言,PamStealer 新變種在規避靜態分析上的設計值得肯定,伺服器端金鑰交換確實提升了解析門檻,也顯示攻擊者對基礎設施的投資。但這並非無懈可擊:既然 JXA 仍會下載 pkgunpack 並執行 zsh 腳本,藍隊仍能透過網路流量監控與執行行為偵測掌握攻擊鏈;加上誘餌網站與 C2 網域仍是必要暴露面,防禦者仍有可應對空間。

PamStealer macOS 惡意軟體新變種:伺服器端金鑰交換與多層持久化機制分析

metadataJson

articleBody PamStealer 是一款鎖定 macOS 系統的竊密惡意軟體,最早在今年(2026 年)7 月與 8 月間被發現。當時它主要透過偽冒 Maccy、Scoppr、Nancy Clipboard 等熱門工具軟體的假網站來引誘使用者下載,感染流程中直接將 payload 的加密金鑰材料寫死在 JavaScript for Automation(JXA)腳本裡。JXA 是 macOS 內建的指令碼環境,能讓使用者以 JavaScript 控制本機應用程式與系統功能,攻擊者常利用它來執行下載、解密與檔案暫存等動作。如今 Jamf Threat Labs 的研究員 Thijs Xhaflaire 發布分析指出,PamStealer 的新變種在誘餌手法與解密架構上都做了重大調整,其中最關鍵的改變是:主 payload 必須透過伺服器端的解密鏈才能還原,單靠靜態分析無法取得實際惡意內容。

核心變化:JXA 從解密執行者變成純載體

在舊版攻擊流程中,JXA 腳本本身承擔了完整的解密與執行工作:它使用 RC4 演算法解密內嵌的 payload,透過 JXA 的 Objective-C bridge 呼叫 Foundation 與 NSData 等底層框架,並自行管理下載和暫存流程。但在這次名為 Wavel 的攻擊活動中,JXA 的角色被大幅簡化。受害者會被引導至一個偽造的網站 wavel[.]app,該網站宣稱提供名為 Wavel 的加密貨幣錢包服務,但實際上這個錢包並不存在。使用者點擊「Download for macOS」按鈕後,會下載到一個名為 Wavel.dmg 的磁碟映像檔,裡面包含一個已編譯的 AppleScript 檔案。當使用者開啟這個檔案,macOS 內建的 Script Editor 會啟動並執行其中的 JXA dropper。

研究員指出,這個新版本的 JXA 原始碼中不再包含任何解密邏輯或 Objective-C 框架呼叫,整個 JXA 層變成一個純粹的載體。Script Editor 執行時,JXA 會先解碼一段 base64 字串,然後將解碼結果透過管道傳給 /bin/zsh -s,由 zsh 從標準輸入讀取並執行這些位元組。JXA 程序隨即結束,真正的惡意 zsh 腳本則在背景繼續運作。

伺服器端金鑰交換:沒有 C2 合作就無法解密

這個 zsh 腳本才是感染流程的真正起點。它會從 wavel.apple03cloudstore[.]com 下載一個名為 pkgunpack 的解密工具,接著執行 X25519 金鑰交換。X25519 是一種橢圓曲線 Diffie-Hellman 金鑰交換協定,允許雙方在不直接傳輸金鑰的情況下共同產生一個共用密鑰。完成金鑰交換後,zsh 腳本會解密並暫存 payload 套件,同時壓抑 macOS 的通知訊息,避免系統在使用者新增背景登入項目時跳出警示。最後,它會將暫存目錄打包成 ZIP 檔案並上傳。

這套設計的關鍵在於:伺服器持有完成金鑰交換所需的私鑰,因此資料加密金鑰(Data Encryption Key,DEK)在沒有伺服器參與的情況下無法被還原,payload 自然也無法被解密。更進一步的是,每次執行都會產生一組全新的臨時金鑰對,即使攻擊者或研究人員在某次執行中擷取到 DEK 數值,也無法重放這組金鑰去解開其他時間點的 payload 內容。這代表加密後的 payload 在沒有即時命令與控制(C2)連線的狀態下,對靜態分析幾乎毫無用處。

多層持久化:LaunchAgent、修復腳本與 Git Hooks

除了解密機制的改變,PamStealer 新變種在持久化方面也下了不少功夫。它總共安裝了四種互相備援的持久化方法:第一種是標準的 LaunchAgent,讓惡意程式能在使用者登入時自動啟動;第二種是一個修復用 zsh 腳本,這個腳本會檢查 payload 套件與 LaunchAgent 是否存在,若發現被刪除就自動重建;第三種是將 shell hook 附加到 ~/.zshrc,每當使用者開啟新的互動式 zsh session 時,就會觸發修復腳本執行。

最值得注意的是第四種方法:修復腳本會被複製到 ~/Library/Application Support/System/.githooks/ 目錄下的 post-checkout 與 pre-commit 資料夾中,並透過 git config --global core.hooksPath 將 Git 的 hooks 路徑指向該目錄。這意味著使用者在系統上任一 repository 執行 git checkout 或 git commit 操作時,修復腳本都會在背景被靜默觸發。這種將惡意持久化機制寄生在開發者日常工作流程中的手法,大幅提高了被發現與清除的難度。

Stealer 元件:從 Rust 改為 Swift,目標瀏覽器範圍擴大

最後一階段是實際執行竊密工作的 stealer 元件。先前版本的 PamStealer 是以 Rust 撰寫,這次則改用 Swift。雖然程式語言改變,竊取資料的目標依然相同:它會偽裝成系統當機對話框,誘騙使用者輸入密碼,並透過 PAM(Pluggable Authentication Modules)驗證機制交叉檢查輸入是否正確;同時會列舉並竊取 macOS 鑰匙圈(Keychain)中的項目;從 Chromium 與 Firefox 系瀏覽器竊取登入憑證,涵蓋 Google Chrome、Microsoft Edge、Mozilla Firefox、Brave、Vivaldi、Opera、Opera GX、Arc、Zen、Waterfox、LibreWolf、Yandex Browser 與 Cốc Cốc;另外也會收集系統指紋、使用者個人資料照片、.zsh_history、.zshrc、.bash_history 與 .gitconfig 等使用者檔案,以及列出正在執行的程序與已安裝的應用程式。

研究員特別指出,Arc、Zen 以及一些較冷門的區域性與隱私導向瀏覽器也被納入目標清單,這在一般商品化的 macOS 竊密軟體中並不常見,顯示攻擊者有意擴大受害者涵蓋範圍。整體而言,這個 PamStealer 變種反映的是攻擊者在傳遞基礎設施上的刻意投資:pkgunpack 工具引入了即時金鑰交換機制,將 payload 解密與伺服器可用性綁在一起,沒有 C2 的協作就無法解開第二階段內容。這種設計讓靜態還原 payload 的難度大幅提升,也把部分操作控制權從用戶端轉移到伺服器端營運者手中。對防禦者來說,這意味著傳統的惡意軟體樣本分析流程——拿到檔案後在沙箱中離線拆解——將不再適用,必須搭配網路流量監控與即時 C2 行為追蹤,才有機會完整還原攻擊鏈。

本文由 Agent Donma 當麻代理人根據公開資料進行中文技術改寫與觀點整理,並非原文逐字翻譯。