一場假視訊會議,193 天的潛伏:macOS 後門、假 Google 文件擴充功能與 Telegram 帳號被盜
先講結論:
- 一次會議邀約,四分鐘內就讓 Mac 被植入 root 後門。 沒有用到任何零時差漏洞,靠的是一個假的 Teams 等候頁和一個假的系統密碼視窗。
- 後門在電腦上安靜運作了 193 天,第 31 天還在 Chrome 裡裝了一個偽裝成「Google 文件離線版」的間諜擴充功能,每 30 秒把所有網站的 Cookie 傳出去。
- Telegram 開了兩步驟驗證(2FA)還是被盜,因為攻擊者拿的是「已經登入的 Session」,不是密碼。
- 如果你懷疑中招:先用另一台乾淨的裝置登出所有 Session,再改密碼,最後重灌。 順序很重要。
本文整理自一起真實事件的鑑識調查,受害者的主機名稱、使用者名稱、個人軟體清單等識別資訊都已移除,時間一律為 UTC。這篇是寫給一般讀者看的版本,想看完整鑑識細節的人,可以讀文末「延伸閱讀」列出的事件報告與研究論文。
去年我寫過一篇 Telegram Session 劫持攻擊分析,講的是假 Zoom 安裝程式偷走 Telegram 桌面版的 Session。這次的個案是同一類攻擊的「加強版」:攻擊者不只偷一次,而是在電腦裡長住下來。
事情是怎麼開始的
2026 年 4 月 24 日,受害者在 Telegram 上收到一個以商務名義發出的視訊會議邀約。點開連結後,出現的是一個偽造的 Microsoft Teams 等候頁,上面寫著「有人會在會議開始時讓您加入」。受害者事後一直記得那是 Zoom,直到鑑識時找到當下的截圖,才發現其實是 Teams。這也說明了:假會議頁面做得夠像時,使用者連品牌都分不清楚。
接著頁面提示「音訊/SDK 需要更新」,受害者執行了下載的內容,畫面跳出一個看起來像 macOS 系統的密碼視窗。輸入密碼後,攻擊者就拿到了管理員權限。
從檔案建立時間可以還原這四分鐘:
| 時間(UTC) | 發生什麼事 |
|---|---|
| 08:03:01 | 假密碼視窗元件 ammad.Mac-Password-Popup 出現 |
| 08:04:47 | 受害者截下假 Teams 等候頁 |
| 08:06:28 | root 擁有的後門程式 cloudsync 寫入硬碟 |
| 08:07:18 | 建立 LaunchDaemon com.safari.sync.service,開機自動以 root 執行後門 |
密碼視窗出現在 root 檔案寫入之前,符合「拿使用者輸入的密碼去跑 sudo」的模式。換句話說,這整個攻擊鏈唯一需要的,就是你願意輸入一次密碼。
sequenceDiagram
autonumber
actor A as 攻擊者
actor U as 受害者
participant W as 假會議網頁
participant OS as macOS
participant BD as cloudsync 後門
participant C2 as C2 check02id.com
A->>U: Telegram 上邀約視訊會議
U->>W: 開啟連結,進入假 Teams 等候頁
W->>U: 「音訊/SDK 需要更新」
U->>OS: 執行下載內容
OS->>U: 假的系統密碼視窗
U->>OS: 輸入登入密碼
OS->>BD: 以 root 寫入後門與開機啟動項
loop 每 60 秒
BD->>C2: 回報(TCP 5202)
end
193 天裡,攻擊者做了什麼
後門裝好之後,攻擊者沒有急著動手,而是分批擴張:
| 日期 | 動作 |
|---|---|
| 2026-04-24 | root 後門 cloudsync 與 LaunchDaemon 就位 |
| 2026-05-05 | 下載第二階段加密資料 /Users/Shared/.apple.auth |
| 2026-05-25 | 在全部 4 個 Chrome 設定檔植入假「Google 文件離線版」擴充功能,以及一個未簽章的 Native Messaging Host |
| 2026-06-03 | 下載第二個 root 執行檔 /Users/Shared/.authds |
| 2026-06-23 | 更新 LaunchAgent com.apple.google.auth |
| 2026-11-03 | 調查當天,後門與擴充功能仍在跟 C2 連線 |
注意命名:com.safari.sync.service、com.apple.google.auth、.apple.auth。全部都在冒用 Apple、Safari、Google 的名字,一般人在「登入項目」或資料夾裡看到,很容易以為是系統元件。
兩層控制:系統層後門 + 瀏覽器層間諜
這次最值得注意的設計,是攻擊者同時握有兩條獨立的控制通道:
- 系統層(
cloudsync):有 root 權限、開機就啟動,可以讀寫整台電腦。但瀏覽器裡的登入狀態是加密的,它不容易直接用。 - 瀏覽器層(假擴充功能):直接在 Chrome 裡面,拿得到 Cookie、網頁內容和你打的每一個字。
兩層各自連 C2,所以清掉其中一層,另一層還活著。實際調查也是這樣:第一輪清除了 cloudsync 之後,擴充功能仍持續跟 C2 連線,到第二輪全機掃描未簽章執行檔時才被找到。
假「Google 文件離線版」擴充功能能做什麼
這個擴充功能顯示的名稱是 Google Doc Sheets Offline(v1.97.1),ID 是 ppconlkbhfnachephglhgbhdgeapgjoj。真正的 Google 文件離線版 ID 是 ghbmnnjooekpmoecnnnilnnbdlolhkhi,而且只會從 Chrome 線上應用程式商店安裝。
它要求了 <all_urls> 加上 cookies、history、tabs、scripting、desktopCapture、nativeMessaging 等權限。從原始碼可以看到這些功能:
| 能力 | 頻率/方式 |
|---|---|
| 上傳全部網站的 Cookie(包含 HttpOnly) | 每 30 秒 |
| 鍵盤側錄、剪貼簿側錄 | 每 60 秒上傳一次 |
| 螢幕截圖 | 每 6 秒 |
| 上傳每個網站的 localStorage | 每次切換分頁 |
| 上傳最多 10,000 筆瀏覽紀錄 | 依指令 |
| 對指定網址注入任意 JavaScript | 依指令 |
| 清除指定網站的 Cookie,逼你重新登入 | 依指令 |
| 透過 Native Host 在電腦上執行任意指令 | 依指令(WebSocket 即時下達) |
有兩個組合特別陰險:
- 「清 Cookie + 鍵盤側錄」:攻擊者先把你在某個網站的登入狀態清掉,你重新登入時輸入的新密碼就被側錄走。
- 「注入 JavaScript」:可以對交易所、錢包網站注入腳本,例如偷偷把收款地址換掉。
另外,它還會攔截 Google Meet 的「立即加入」按鈕,趁你要進會議的那一刻要求螢幕錄製權限。這個時機點讓權限請求看起來非常合理。
為什麼瀏覽器沙箱擋不住
Chrome 的 Native Messaging 本來是讓密碼管理器這類軟體跟本機程式溝通用的1。但如果攻擊者同時控制了擴充功能和本機程式,擴充功能就等於可以在電腦上執行任何指令,沙箱形同被打穿。本案的 Native Host 叫 google.chrome.diagnostics,又是一個冒用 Google 名義、但沒有任何簽章的執行檔。
攻擊者還偽造了時間
擴充功能資料夾裡的部分檔案,建立時間顯示是 2025-10-16,Chrome 設定裡記錄的安裝時間是 2025-08-13,都早於真正的入侵日。如果只看這些時間,會以為擴充功能早就在了,跟這次事件無關。
真正的植入時間是靠一個檔案判斷出來的:擴充功能裡的 data.js 寫著受害者的使用者名稱和主機名稱,這種檔案只能在受害者電腦上產生,而它的建立時間是 2026-05-25。後來的全機掃描也在 Chrome 的 Service Worker 快取裡找到這個擴充功能 background.js 的副本,建立時間比 data.js 晚 5 秒,正好是擴充功能第一次被載入執行的時候。只靠時間線做鑑識,很可能會漏掉關鍵元件。
為什麼開了 2FA,Telegram 還是被盜
這是很多人最想問的。答案是:2FA 保護的是「登入」這個動作,不保護「已經登入」的狀態。
你登入一個網站之後,網站會把一把「登入憑證」存在瀏覽器的 Cookie 或 localStorage 裡。之後每次開網頁,瀏覽器出示這把憑證,網站就知道是你,不會再問密碼或 2FA。
Telegram Web 這類網頁版應用,就是把登入權杖存在 localStorage。這個擴充功能每次切換分頁都會把 localStorage 傳出去,攻擊者拿到之後,就可以在自己的瀏覽器裡「變成你」,完全不需要密碼,也不會觸發 2FA。在 MITRE ATT&CK 裡,這叫 T1539(竊取網頁 Session Cookie)加上 T1550.004(使用網頁 Session Cookie)2。
這也是為什麼被盜之後只改密碼沒有用:攻擊者手上的 Session 不會因為你改密碼就失效。你必須主動「終止所有其他工作階段」。
本案的 Telegram 帳號是在擴充功能運作期間被接管的。透過 localStorage/Session 竊取是證據最支持的推論,但因為日誌已超過保存期限,無法百分之百確定是哪一次外傳造成的。
這跟 BlueNoroff 有什麼關係
公開資料中,北韓背景的 BlueNoroff(一般認為是 Lazarus 旗下以金融與加密資產為目標的子團體)長期使用假視訊會議攻擊 macOS 使用者:
- Kaspersky 在 2025 年 10 月發表的 GhostCall/GhostHire 研究指出,GhostCall 主要鎖定 macOS,透過 Telegram 接觸目標,用假 Zoom/Teams 用戶端部署竊密工具34。
- 2025 年 6 月 Huntress 處理的一起事件中,攻擊者在會議裡使用深偽影像,再以「麥克風故障」為由,誘導受害者執行一個名為
zoom_sdk_support.scpt的 AppleScript56。
本案在「Telegram 邀約、假 Zoom/Teams 頁面、假系統密碼視窗、冒用 Apple/Google 命名、鎖定加密貨幣持有者」這幾點都與公開報告吻合。不過調查沒有對樣本做逆向工程,也沒有比對威脅情資平台,所以這只是「手法吻合」,信心等級中等,不是正式歸因。
至於「系統層後門 + 擴充功能 + Native Host」這種組合,在我們檢閱的公開資料中還沒有看到詳細描述。
怎麼自我檢查
以下指令都只讀取、不修改任何東西,可以在「終端機」裡貼上執行。
1. 檢查本案已知的檔案
ls -la /Library/LaunchDaemons/com.safari.sync.service.plist \
~/Library/LaunchAgents/com.apple.google.auth.plist \
~/Library/CloudSync \
~/Library/Identification \
~/Library/Staging \
"$HOME/Library/Application Scripts/ammad.Mac-Password-Popup" \
/Users/Shared/.authds /Users/Shared/.apple.auth /Users/Shared/.com.apple.better.env \
/Users/root \
2>/dev/null
沒有任何輸出代表這些檔案不存在,這是好消息。
其中 /Users/root 特別說明一下:macOS 的 root 家目錄在 /var/root,正常的 Mac 不會有 /Users/root。本案的後門以 root 身分執行時,在這裡多建了一份跟使用者家目錄一模一樣的狀態檔(Identification/ 與 Authorization/auth.db)。
2. 檢查 Chrome 擴充功能與 Native Host
# 本案的假擴充功能 ID
find "$HOME/Library/Application Support/Google/Chrome" -maxdepth 3 -type d \
-name ppconlkbhfnachephglhgbhdgeapgjoj 2>/dev/null
# 列出所有已註冊的 Native Messaging Host
ls -la "$HOME/Library/Application Support/Google/Chrome/NativeMessagingHosts/" 2>/dev/null
另外打開 chrome://extensions,每個 Chrome 設定檔都要看,留意:
- 名稱像 Google 官方,但 ID 不是官方 ID 的擴充功能。
- 不是從線上應用程式商店安裝的擴充功能(詳細資料頁會寫來源)。
- 要求「讀取和變更所有網站資料」的擴充功能,問自己是否真的需要。
NativeMessagingHosts 底下每個 .json 都會指向一個執行檔,可以用 codesign -dv <路徑> 看它有沒有正式簽章。一個叫 google.chrome.diagnostics、卻沒有 Google 簽章的東西,就是紅旗。
3. 檢查有沒有跟 C2 連線
lsof -nP -i | grep -E ':(5202|5078|8443)\b'
grep check02id /etc/hosts
4. 通用的可疑特徵
本案歸納出幾條通用規則,就算攻擊者換了檔名也適用:
| 編號 | 可疑特徵 |
|---|---|
| H1 | LaunchDaemon/Agent 用 /bin/sh -c 去執行 ~/Library 或 /Users/Shared 底下的程式 |
| H2 | ~/Library 或 /Users/Shared 底下有 root 擁有、沒有簽章的執行檔 |
| H3 | 名稱混搭不同廠商(例如 com.apple.google.*、com.safari.*),但簽章者不是該廠商 |
| H4 | NativeMessagingHosts 底下有沒簽章的執行檔 |
| H5 | 擴充功能不是商店安裝,卻放在 Chrome 的 Extensions/ 目錄 |
| H6 | 擴充功能名稱冒用 Google 官方,但 ID 不同 |
另外,/Users/ 底下如果有對應不到任何帳號的資料夾(例如 /Users/root),也值得注意。
要列出所有開機啟動項,可以執行 sudo sfltool dumpbtm,或到「系統設定 → 一般 → 登入項目與延伸功能」逐一確認。
如果真的中招了,怎麼處理
順序很重要:先切斷攻擊者手上的 Session,再清電腦。 因為只要電腦還沒清乾淨,你在上面改的新密碼也會被側錄走。
立即(24 小時內,用另一台乾淨的裝置)
- Telegram:設定 → 裝置 → 「終止所有其他工作階段」;設定或更換兩步驟驗證密碼,檢查登入 Email 是否被改掉。
- Google 帳號:安全性 → 登出所有其他裝置,更換密碼,改用通行金鑰或實體安全金鑰。
- 加密貨幣:在乾淨裝置上建立全新助記詞的錢包,把資產全部轉過去;撤銷舊地址的代幣授權(approve)。
- 交易所、網銀、Email、雲端服務:先登出所有工作階段,再換密碼,並檢查 API 金鑰和提領白名單地址有沒有被加料。
- 更換 macOS 登入密碼與 Apple 帳號密碼。
清除受感染的 Mac
本案的處理步驟是:
- 停用開機啟動項:
sudo launchctl bootout system/com.safari.sync.service,以及launchctl bootout gui/$(id -u)/com.apple.google.auth。 - 終止
cloudsync、.authds程序。 - 刪除前先記錄每個檔案的 SHA-256,並把樣本加密封存,留給執法單位或研究人員。
- 刪除上面「自我檢查」第 1 點列出的所有檔案與目錄。
- 完全關閉 Chrome,再刪除 4 個設定檔裡的假擴充功能和 Native Host,然後到
chrome://extensions確認已移除。 - 在
/etc/hosts加入0.0.0.0 check02id.com封鎖 C2。
刪除 /Users/root 之前,先確認裡面只有本案那幾個檔案,不要誤刪其他東西。
但要老實說:手動清除只能清掉「已知」的部分。 本案就是一個例子,第一輪清除漏掉了整個瀏覽器層;前兩輪人工檢查也都沒發現 /Users/root,是最後用 IoC 特徵字串掃描全機 61 萬個檔案才找到。所以:
一週內
- 只備份文件(不要備份應用程式和
~/Library),然後清除磁碟、重新安裝 macOS。 - 重裝後的 Chrome 不要同步舊的擴充功能,需要的話從線上應用程式商店重新安裝。
- 向警方報案(台灣可撥 165 反詐騙專線),並通報 TWCERT/CC,附上 IoC 與樣本。
以後怎麼避免
- 會議邀約一律用官方 App 加入。 任何會議頁面要你「更新 SDK」「安裝音訊外掛」「修正麥克風」,都當作攻擊。Zoom、Teams、Google Meet 都不需要你額外裝東西才能開會。
- 不是你自己觸發的系統密碼視窗,一律不輸入。 先按取消,再想清楚是誰要的。
- 加密資產放硬體錢包,助記詞永遠不要輸入電腦。
- 定期到
chrome://extensions看一眼,特別是那些名字很像官方、你卻不記得自己裝過的。 - 懷疑出事時,先「登出所有裝置」,再改密碼。
入侵指標(IoC)
給資安人員與 EDR 規則使用。
網路
| 類型 | 指標 | 說明 |
|---|---|---|
| 網域 | check02id.com | 後門與擴充功能共用的 C2 |
| IP | 83.136.210.180 | 上述網域的解析結果(調查當時) |
| 連接埠 | TCP 5202 | cloudsync 每 60 秒回報 |
| 連接埠 | TCP 5078 | 擴充功能 HTTPS /update(Cookie、側錄資料) |
| 連接埠 | TCP 8443 | 擴充功能 HTTPS /update(截圖)與 wss://…/realtime 指令通道 |
檔案雜湊(SHA-256)
| 檔案 | SHA-256 |
|---|---|
cloudsync | 4a8059ae03301e8b0397c0c26f8b5d01fb1cb05c2563e1c2f538e11c74d37c3b |
.authds | 7f2e8e4432d80194aadca7f051e0f243ecf727af4a95bb4fd7af34490e27ea0b |
google.chrome.diagnostics | 7a0ee74dcdb2d30ef63884e2505799d7f95e670b628a5504f0f292424da37c3d |
com.google.chrome.diagnostics.json | 2e76e387b1f6a4412ce6840bf1221a1d7de4df619c78b35a4106b9e36dc2fcf4 |
擴充功能 background.js | 764b5681720001dc9af9da4d7aa948abf2bd458336e0bd8ccb1b2d6fcb1d66f0 |
擴充功能 content-script1.js | cac1539fe2e8aa9d2db9928a384554839ae6d597ec61ef01b1089e976035a586 |
擴充功能 content-script2.js | 530e7a28e79c8fc8d1fd651066de29c6926ec187da3d5d132c87539daa32e879 |
.apple.auth | 1b5dc3dda3c4f3b26bb9d19f731b646a794feb095af5fb382f8896c473a8fd7d |
.com.apple.better.env | d62e7d144cfb2ad761661ec2befcd2aa09ed335faafc279cd51db3a0f4af8551 |
com.safari.sync.service.plist | c189e4a9c69b7f07ce9533646f5bcaac58876da05f11795572a53fabbcb6e758 |
com.apple.google.auth.plist | 5d97e4a0e8da6cff7d85b986d1de71e992bb977119580757d45650ddba527758 |
/Users/root/.../Authorization/auth.db | fc2c4fce5446a04d33d6dfe24014ec088033d4a984bd4d095ee901e633a77c99 |
主機路徑與識別碼
/Library/LaunchDaemons/com.safari.sync.service.plist
~/Library/LaunchAgents/com.apple.google.auth.plist
~/Library/CloudSync/cloudsync
~/Library/Identification/.verify
~/Library/Staging/
~/Library/Application Scripts/ammad.Mac-Password-Popup/
~/Library/Application Support/Authorization/auth.db
/Users/root/Library/Identification/
/Users/root/Library/Application Support/Authorization/auth.db
/Users/Shared/.authds
/Users/Shared/.apple.auth
/Users/Shared/.com.apple.better.env
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/google.chrome.diagnostics
~/Library/Application Support/Google/Chrome/NativeMessagingHosts/com.google.chrome.diagnostics.json
Chrome 擴充功能 ID:ppconlkbhfnachephglhgbhdgeapgjoj("Google Doc Sheets Offline" v1.97.1)
擴充功能硬編碼 token 前綴:jfweibd234HFIDhfiwef…
MITRE ATT&CK 重點對應
| 戰術 | 技術 |
|---|---|
| 初始存取 | T1566.003 Spearphishing via Service(Telegram 邀約) |
| 憑證存取 | T1056.002 GUI Input Capture(假密碼視窗) |
| 權限提升 | T1548.003 Sudo and Sudo Caching |
| 持久化 | T1543.004 Launch Daemon、T1543.001 Launch Agent、T1176 Browser Extensions |
| 防禦規避 | T1036.005 Masquerading、T1564.001 Hidden Files、T1070.006 Timestomp |
| 憑證存取 | T1539 Steal Web Session Cookie |
| 收集 | T1056.001 Keylogging、T1115 Clipboard Data、T1113 Screen Capture |
| 執行 | T1059.004 Unix Shell(經 Native Host) |
| 指揮控制 | T1071.001 Web Protocols、T1571 Non-Standard Port |
| 帳號接管 | T1550.004 Web Session Cookie |
延伸閱讀:完整報告
本次事件的完整鑑識數據、時間軸、UML 圖與複查範圍,整理在兩份去識別化文件裡(頁尾可切換英文版):
惡意樣本為活體惡意程式,不公開提供。資安研究人員或執法單位如有需要,請私下聯繫。
參考資料
-
Google, “Native messaging,” Chrome for Developers. https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging ↩
-
MITRE, “ATT&CK Enterprise Matrix.” https://attack.mitre.org/ ↩
-
Kaspersky GReAT, “BlueNoroff APT campaigns GhostCall and GhostHire,” Securelist, Oct. 2025. https://securelist.com/bluenoroff-apt-campaigns-ghostcall-and-ghosthire/ ↩
-
Kaspersky, “GhostCall and GhostHire: hunting for crypto assets,” Kaspersky Daily, Oct. 2025. https://www.kaspersky.com/blog/bluenoroff-ghostcall-ghosthire-lazarus/54681/ ↩
-
The Hacker News, “BlueNoroff Deepfake Zoom Scam,” Jun. 2025. https://thehackernews.com/2025/06/bluenoroff-deepfake-zoom-scam-hits.html ↩
-
BleepingComputer, “North Korean hackers deepfake execs in Zoom call to spread Mac malware,” Jun. 2025. https://www.bleepingcomputer.com/news/security/north-korean-hackers-deepfake-execs-in-zoom-call-to-spread-mac-malware/ ↩