那個爬出瀏覽器的擴充功能
Zscaler 發現了一個名為 Edgecution 的後門,它在一個受害者從未開啟過的 Microsoft Edge 視窗裡執行,接著利用 Native Messaging——擴充功能用來與桌面應用程式對話的那條合法管道——在主機上執行指令。值得追問的是:當瀏覽器活在一個用完即丟的 VM 裡時,這條通往主機的橋接究竟能碰到什麼。
一個瀏覽器擴充功能,理應被困在瀏覽器之內。一個名為 Edgecution 的後門,正是一份活生生的證明:原來「理應如此」默默扛起了多少工作。它在一個受害者從未開啟、也看不見的 Microsoft Edge 視窗裡執行,並利用每一款 Chromium 瀏覽器都內建的一項功能,在底下那台機器上執行指令。
想像一下會計部門那位剛報到三週的新人,對任何要求都還習慣說好。一則訊息透過 Microsoft Teams 傳了進來,寄件者的名字列在 IT 支援底下。Outlook 有一個垃圾郵件過濾器的更新;郵件團隊這週正在推送;連結就在這裡。她打開了它。頁面掛著「Outlook 更新管理主控台」的招牌,看起來夠像內部工具,還給了她一段簡短的指令,要她執行以完成安裝。她照做了。看起來什麼也沒發生。她關掉分頁,繼續工作。
六月下旬,Zscaler 的 ThreatLabz 團隊記錄了她關掉那個分頁之後發生的事。這個惡意程式家族叫做 Edgecution,BleepingComputer 也在同一週報導了它。這個惡意程式生來就安靜;真正值得細看的,是攻擊者選擇把它藏在哪裡。
一則來自 IT、其實不是 IT 的訊息。
開場的招式,是透過 Microsoft Teams 進行的社交工程:攻擊者冒充公司自家的 IT 人員,把員工引導到那個假的 Outlook 更新頁面。頁面提供三種方式來「完成安裝」,而根據 Zscaler 的拆解,這三種都送上同一樣東西:一段經過混淆的 AutoHotKey 指令稿,搭配一個真正的 AutoHotKey 執行檔;一段被複製到剪貼簿的 Windows 批次指令稿;或一段被複製到剪貼簿的 PowerShell 指令稿。這三者裡有兩種,正是你或許聽過、名為 ClickFix 的剪貼簿貼上招數——頁面替你把指令寫好,剩下要人親手做的,只有貼上、按下 Enter。
那一次貼上,就是整場戲的全部。酬載裝在一個加密的 ZIP 裡,而它的 PK 魔術位元組被剝掉了,於是任何掃描它的東西都看不出這是個 ZIP。一旦指令稿執行起來,主機就淪陷了——不是靠什麼巧妙的漏洞利用,而是因為有個人被說服在自己的電腦上跑了一支程式。從這一刻起的一切,都是攻擊者在決定要怎麼留下來。
把瀏覽器當成後門。
它撐過重開機的方式,是值得放慢腳步細看的部分。多數想要持久存在的惡意程式,會丟下一個執行檔、寫一個登錄檔的 run 鍵,或安裝一個服務——這些全是資安工具生來就在盯著的東西。Edgecution 做的事更安靜。安裝指令稿排定了一個 Windows 工作排程,用一把命令列旗標啟動 Microsoft Edge,其中包括用 --load-extension 來側載攻擊者自己的擴充功能,以及用 --headless=new 讓瀏覽器視窗從不被畫到螢幕上。現在這台機器上跑著一個 Microsoft Edge 程序——一個有簽章、受信任、再尋常不過的程式——而使用者既看不見它,也不曾啟動它。
在那個看不見的瀏覽器裡,這個擴充功能做兩件事。它透過一個架在 Amazon CloudFront 上的 WebSocket,向命令與控制伺服器(攻擊者用來下達指令的那個位址)發出信標,於是流量看起來就像一個正常的瀏覽器在跟一個正常的內容網路對話。接著,它再用 Native Messaging,把收到的指令往下轉送到主機。
Native Messaging 是 Chromium 一項真實、有文件記載的功能,正按設計運作。它是那條讓瀏覽器擴充功能能與安裝在同一台機器上的桌面程式對話的管道——舉例來說,就是擴充功能把工作交給它的搭檔桌面應用程式所用的機制。擴充功能呼叫 chrome.runtime.sendNativeMessage,瀏覽器便會啟動一個在 manifest 檔案裡指名的小型「原生主機」程式,並把 JSON 透過管道餵給它。Edgecution 註冊了它自己的原生主機:一個 native_host.bat,由它啟動一個 Python 後門。從那裡開始,這個後門就能執行 shell 指令、執行 PowerShell、執行任意 Python、讀寫檔案、列出執行中的程序,並把系統資訊回報到上層——你要成為那個把乾淨立足點交給勒索軟體團夥的初始存取掮客,所需的一切都在這裡了。Zscaler 把這名操作者的手法,連結到 Payouts King 勒索軟體行動。
留意一下這幅圖裡沒有的東西:沒有新服務,也沒有躺在磁碟上、等著被標記的 .exe。真正在執行攻擊者指令的,是由一個批次檔啟動、而那個批次檔又是由 Microsoft Edge 啟動的 python.exe——而載運這些指令的流量,是一個瀏覽器在跟一個 CDN 對話。它之所以能融入背景,正是因為它幾乎每一個環節都是一件合法的東西,在做一件看起來合法的事。
新聞標題把這稱為沙箱逃逸。更精確的說法是:早在那位員工執行指令稿的那一刻,主機就已經淪陷了。Native Messaging 不是攻擊者打穿的一個破洞;它是一道瀏覽器隨附出廠的門,而攻擊者大大方方地走了過去。這個區別,正指向真正的修補必須落在哪裡。你沒辦法靠打補丁,逃出一項按設計運作的功能。你能改變的,是這道門通往何處。
在 Bromure 裡,「通往主機的那條橋」能碰到什麼。
Bromure 是一款資安優先的瀏覽器。每一個分頁都在你 Mac 上一個用完即丟的 Linux VM(虛擬機器——它自己一台獨立的電腦)裡執行,而當你關掉視窗時,這個 VM 就會被抹除。光是這一個架構選擇,就改變了 Edgecution 故事的其餘部分在你機器上代表的意義。
從 Native Messaging 講起,它是整場攻擊的關鍵所在。在一款普通的瀏覽器裡,擴充功能對話的那個「原生主機」,是你作業系統上的一支程式——就是那個裝著你的檔案、你的鑰匙圈、以及你的網路共享的同一個作業系統。這條橋是開放式的:任何擴充功能都能註冊一個原生主機,而那個主機可以是任何東西。Edgecution 的整套把戲,全靠瀏覽器和你的檔案座落在同一台機器上。
在 Bromure 裡,瀏覽器不在那台機器上。它在那個用完即丟的 VM 裡執行,所以瀏覽器底下的作業系統,是那個拋棄式的 Linux guest,而不是 macOS。一個由 VM 內某個東西所註冊的流氓原生主機,會是一支在 VM 內的程式——對話的對象,是一台不裝載你人生任何東西、而且在你關掉視窗時就不復存在的電腦。真正能跨越過去、抵達 macOS 的那組狹窄橋接,都是第一方的,且被烤進唯讀的磁碟映像裡:舉例來說,憑證橋接會從你 Mac 的 Keychain 填入 passkey 與密碼。一個執行中的工作階段沒有任何辦法去新增一條橋接,因為——而這正是答案的後半段——你根本就裝不了擴充功能。
這個封鎖,不是某個釣魚頁面能把你說服繞過的設定。在 Bromure 的瀏覽器政策裡,chrome://extensions 與 Web Store 都在一份硬性封鎖清單上,而且沒有 developer mode、沒有「load unpacked」、也沒有任何進階開關能繞過它。同樣地,你也沒有辦法在主機那一側做 Edgecution 做的事——啟動第二個 Chromium,用 --load-extension 指向你真正的設定檔——因為你真正的設定檔並不是你 Mac 上某個資料夾、能讓一個漂泊的程序把瀏覽器瞄準它。它被密封在 VM 裡。
還有一條值得拉一拉的線索,因為它是整個故事裡最廉價的一場勝利。誘餌是從 Microsoft Teams 進來的。如今很多人把 Teams、Outlook 和 Slack 當成網頁應用程式來用。如果這個習慣活在一個用完即丟的 Bromure 分頁裡,那麼那則冒名訊息、那個連結、以及那個假的「Outlook 更新」頁面,打從第一秒起就全都落在一個隔離的工作階段裡——而我們剛剛走過的那條攻擊鏈,根本走不到第三步,因為那個想要你執行指令稿的頁面,正坐在一個碰不到你 shell 的 VM 裡。那場需要主機的攻擊,永遠遇不到主機。
這件事沒能解決什麼。
隔離不是什麼咒語,它的極限值得開門見山地講清楚。
一個你親手執行的指令
這裡的進入點,是一個人在執行一段指令稿——一段被複製到剪貼簿的批次或 PowerShell 指令,或一個 AutoHotKey 執行檔。如果你把一段指令貼進你自己的 shell 並按下 Enter,那個迴圈裡沒有任何瀏覽器隔離的份。VM 與你 Mac 之間的剪貼簿共享預設是開啟的,因為複製貼上是正常瀏覽的一部分;你可以把某個設定檔切換成完全隔離,而釣魚那一層的存在,就是為了在你動手之前先把這個頁面標記出來。但那條歷久彌新的規則,比這一切都更古老:絕對不要執行一個網頁交給你的指令。
Windows 二進位檔,一種可移植的技術
Edgecution 鎖定的是 Windows 上的 Microsoft Edge,而那些確切的檔案在 Mac 上跑不起來。那是一種冷冰冰的安慰,而不是一道防禦。Native Messaging 在 macOS 上同樣是 Chromium 的一項功能,而同一週還帶來了一場macOS 行動,它說服使用者貼上一段 Terminal 指令,藉此投放 Atomic 資訊竊取程式。這項技術是可移植的;只有二進位檔才是綁定作業系統的。
Bromure 改變的,比「保證任何壞東西都絕對碰不到你」要更狹窄,而我們認為,也更有用。它移除的,是那些讓 Edgecution 得以安靜又持久的條件。瀏覽器不再是一個座落在你檔案旁邊、永久存在又受信任的程序。Native Messaging 不再是任何擴充功能都能註冊的開放式橋接——擴充功能根本無法被加入,而且瀏覽器自己的作業系統是個拋棄品。至於持久存在——這整套架構費盡心思想達成的那件事——也無處可持久:關掉視窗,那台後門曾經棲身的機器就消失了。
危險的瀏覽器,是那個你看不見的。
二十年來,關於瀏覽器的資安建議,都圍繞著你眼前的那扇視窗打轉——檢查網址列、找那個鎖頭、別點奇怪的連結。Edgecution 是一個小小的提醒:真正在造成傷害的那個瀏覽器,越來越是那個你從來沒看見的——一個無頭程序,由一個工作排程啟動,跟一個 CDN 對話,跑著一個你不曾安裝的擴充功能。你沒辦法去檢查一扇從不曾被畫出來的視窗的網址列。
問題已經不再是你眼前那扇視窗是否安全。問題是:這台機器上的任何一個瀏覽器,一旦被轉而對付你,能碰到什麼。在一台普通的電腦上,答案是你的檔案,透過一條它隨附出廠的橋。在一台跑著 Bromure 的機器上,答案是:一台用完即丟的 Linux 盒子,在你和它打完交道的那一刻,就把一切都忘得乾淨。那才是值得擁有的差別。把它裝起來,把它設成你那一半不信任的瀏覽行為的預設瀏覽器,讓那些藏起來的視窗,去通往一個你本來就打算丟掉的東西。