網路資安威脅
會竊取密碼、信用卡等個資的惡意 Chrome 擴充功能:ParaSiteSnatcher
本文詳細介紹一個惡意的 Chrome 擴充功能模組框架,裡面包含各種經過高度加密編碼的元件,利用 Google Chrome API 來監視、攔截、外傳受害者的資料。
趨勢科技在調查一些潛在的資安威脅時發現了一個名叫「ParaSiteSnatcher」的惡意 Google Chrome 擴充功能。ParaSiteSnatcher 這個框架可以讓駭客監視、篡改、外傳各種高度敏感的資料。此外,ParaSiteSnatcher 也利用強大的 Chrome Browser API 來攔截所有含有敏感帳號資訊與金融資訊的 POST 請求,在 HTTP 請求建立 TCP 連線之前預先將資料外傳。
我們的研究顯示,這個惡意擴充功能是專門為了攻擊拉丁美洲地區使用者而設計,尤其是巴西,只要是遇到 Banco do Brasil (巴西銀行) 以及 Caixa Econômica Federal (巴西聯邦儲蓄銀行,簡稱 Caixa) 相關的網址,就會將資料外傳。此外,它還會發起和篡改巴西某個即時支付系統 (PIX) 的交易,並且經由另一個巴西銀行監管的支付系統 (Boleto Bancario) 進行付款交易。同時我們也觀察到,它會將巴西的個人及法人稅藉登記編號外傳,還有 cookie,包括 Microsoft 帳號使用的 cookie。
此擴充功能一旦安裝好後,就會經由 Chrome 取得大量的權限,使它能夠篡改網站連線階段、網站請求,並使用 chrome.tabs API 讓它橫跨多個分頁追蹤使用者的活動。惡意程式內含各種支援其運作的元件,讓惡意程式碼能注入網頁的內容腳本、監控 Chrome 分頁,並且攔截使用者輸入以及網頁瀏覽器通訊。
值得注意的是,雖然 ParaSiteSnatcher 是特別針對 Google Chrome 瀏覽器設計,但這個惡意擴充功能也可在一些支援 Chrome 擴充功能 API 及執行時期環境的瀏覽器上運作,例如基於 Chromium 的瀏覽器,包括新版的 Microsoft Edge、Brave 和 Opera。此外,擴充功能也可以相容於 Firefox 和 Safari,不過必須先做一些修改,例如瀏覽器命名空間。
ParaSiteSnatcher 下載器
ParaSiteSnatcher 是經由一個存放在 Dropbox 和 Google Cloud 上的 VBScript 下載器來下載並安裝到受感染的系統上。
根據我們分析發現這個 VBScript 下載器有三個不同版本,它們的加密編碼程度與複雜性各有不同:
- 變種 1:此變種採用一種直接了當的作法,不會將惡意檔案加密編碼,因此很容易分析和理解。
- 變種 2:在這一代,惡意檔案內部的一些關鍵字串都使用字串反轉 (Reverse String) 技巧來加密編碼。這讓程式碼的分析多一道難度,需要逆向操作來解出原始的內容。
- 變種 3:此變種又增加了一些加密編碼技巧,例如:刻意加入一些垃圾程式碼來混淆分析流程、反制除錯與反制篡改保護,還有使用隨機產生的變數與函式名稱,目的是增加分析難度,防止分析人員輕易地識別出代碼中的模式。除此之外也使用了字串反轉加密編碼進一步隱藏惡意檔案,創造一個讓分析人員更難解析的結構。
當下載器執行時,首先它會檢查 %ProgramFiles%\Google\Chrome\Application\chrome.exe 這個檔案以及 %APPDATA%\%USERNAME% 這個資料夾是否存在。如果不存在,腳本就會自動終止執行。
惡意程式會與駭客的幕後操縱 (CC) 伺服器建立通訊,發送一個 GET 請求到以下網址:hxxps[:]//storage.googleapis[.]com/98jk3m5azb/-。伺服器會回應一份經過加密編碼的網址清單。
接著,惡意程式會對收到的字串進行一系列的運算,將字串還原成原本的樣子。接著,再取代掉某些特殊字元來重建原始的網址,包括:
- 將「[h]」更換成「https://」也就是網址的通訊協定部分。
- 將「-」更換成「.」來重建網域名稱。
- 將「_」更換成「/」來重建檔案路徑。
- 將「>」更換成「:」來重建指定的連接埠。
一旦取得實際的網址之後,接下來就利用這些網址來下載更多偽裝成 Google Chrome 擴充功能的惡意模組。
上述清單中的第一個網址 (hxxps[:]//rezumdolly[.]com:8443/api/alert) 用來註冊一台被感染的系統,同時也通知駭客。惡意程式先利用 Windows Management Instrumentation (WMI) 服務來向 Win32_OperatingSystem 類別 (class) 查詢有關作業系統的詳細資訊,然後將這些資訊會傳送給駭客的 CC 伺服器。
接著,它會建立一個「.json」格式的字串,將各項系統資訊拼湊成在一起:
- comp:電腦名稱,可當成網路上獨一無二的系統識別碼。
- user:註冊的使用者名稱,讓駭客知道系統的使用者或擁有者。
- version:作業系統版本,用來掌握作業系統的詳細版本與可能存在的漏洞。
- arch:作業系統架構 (如 32 或 64 位元),這對駭客在針對系統規格調整後續攻擊時非常有用。
- caption:作業系統說明,通常包含版本資訊 (如 Windows 10 Pro)。
惡意程式會使用 down() 這個函式來下載 ParaSiteSnatcher 惡意擴充功能的模組並儲存到受感染系統的 %APPDATA%\%USERNAME% 目錄下。
接著,惡意程式會搜尋「桌面」(Desktop)、「公用桌面」(Public Desktop)、「快速啟動」(Quick Launch) 三個資料夾內任何包含「chrome.lnk」這串字的捷徑來試圖找出並刪除 Chrome 捷徑。
為了常駐在受害系統並且在每次瀏覽器執行時都載入惡意擴充功能,惡意程式會在桌面上建立自己的 Google Chrome 捷徑,並且在捷徑設定中指定客製化啟動參數。這些參數包括指定預設的使用者設定檔,並且啟動存放在使用者應用程式資料夾中的惡意擴充功能。這麼做是為了確保每次使用者經由其建立的捷徑啟動 Chrome 瀏覽器時都會載入惡意擴充功能。
擴充功能與 CC 通訊
ParaSiteSnatcher Chrome 擴充功能內部元件之間的通訊機制相當仰賴 Chrome sendMessage API,它們會在特殊條件滿足時彼此通訊。
當收到訊息時,惡意 Chrome 擴充功能會在內部執行對應這些事件的函式。有些元件會將某些資料經過處理之後直接傳送到駭客的 CC 伺服器,大部分其他元件則含有接收及更新駭客遠端指令的邏輯。
擴充功能的 service worker (服務工作執行者,後面會詳細討論) 使用 chrome.windows 和 chrome.tabs 兩個 API 來瀏覽並聚焦其他 ParaSiteSnatcher 元件所依賴的「文件物件模型」(Document Object Model,簡稱 DOM)。
分析 ParaSiteSnatcher Chrome 擴充功能的檔案
這一節,我們將討論 ParaSiteSnatcher 框架底下構成惡意 Chrome 擴充功能的各個檔案。
每一個 Google Chrome 擴充功能在自己的根目錄當中都有一個 manifest.json 檔案。這個 manifest 檔案含有一些必要資訊,例如:擴充功能的名稱、版本、權限以及任何與 Chrome 擴充功能相關的腳本。這個擴充功能使用了一個 service worker (yyva.js) 來負責處理背景工作、協調各個模組,以及在背後同步資料。
這個 manifest.json 檔案含有以下內容:
- 基本的 metadata:包括瀏覽器擴充功能的名稱、說明、版本以及作者的金鑰。
- Service Worker:這些是主要擔任擴充功能事件處理器的 JavaScript 檔案。這些事件不僅包括提供網站請求所需的服務,還包括回應瀏覽新頁面、滑鼠點按通知,以及開啟或關閉分頁等各種事件。請注意,Chrome 對於「網頁 service worker」與「擴充功能 service worker」之間有著重要的區別,顯示擴充功能 service worker 不單只是網頁請求的代理器服務而已。在 background (背景) 這個鍵值 (key) 當中指定的 service worker 是屬於擴充功能 service worker。
- 內容腳本:這些腳本可讓開發人員在網址字串符合特定規律的網頁開啟時載入 JavaScript 檔案。
- 權限:這些權限用來指定擴充功能將具備哪些能力。
在我們分析的 ParaSiteSnatcher 擴充功能樣本中,發現了一些重要的 content_script 鍵值,它們決定了要注入哪些腳本、注入到哪裡,以及其行為如何:
- matches:這類鍵值用來指定符合條件的規則。<all_urls> 這個數值代表任何合法開頭的網址都可以,如:http、https 及 file。
- run_at:這個鍵值用來指定腳本要在何時注入網頁,其中 document_end 這個數值代表在網頁資源仍在載入時注入腳本。
- all_frames:這是一個布林 (Boolean) 值。當它設為 true 時,擴充功能就會將腳本注入所有 <iframe> 元素當中,即使框架 (frame) 不在分頁的最上層。
- persistent:當 persistent 這個布林值設為 true 時,擴充功能開發者就能存取 chrome.webRequest API 來攔截或修改網路請求。這是 persistent 這個布林值設為 true 的唯一情況;基於效能因素,該數值在預設情況下會設為 false。
此外,惡意擴充功能的 manifest 檔案中還含有 host_permissions 這個鍵值 (除了 permissions 之外)。host_permission 這個鍵值可以提供額外的權限讓擴充功能的 API 讀取和修改主機資料,例如:存取 API cookie、使用 webRequest API 接收事件、透過程式的方式注入腳本、繞過追蹤保護,以及讀取分頁的 metadata。此外也可存取 XMLHttpRequest 以及取得來源的存取權限,不受跨來源限制。
如果一個擴充功能使用了 host_permissions 這個鍵值,使用者可能被要求提供這些權限給擴充功能。截至 2023 年 6 月為止,Safari、Firefox 以及某些基於 Chromium 的瀏覽器都不會在安裝期間要求使用者提供權限。在這個惡意樣本中,host_permissions 可以讓擴充功能透過 <all_urls> 數值來讀取和修改所有的網址。
ParaSiteSnatcher 也含有 permissions 這個 JSON 鍵值,裡面含有某些該擴充功能要求使用的 WebExtension API 關鍵字。惡意擴充功能會要求使用下列 WebExtension JavaScript API:
- webNavigation:這個 API 會新增一個監聽各瀏覽階段的事件監聽器 (event listener),例如用來回應使用者的動作 (好比說,點選連結或在位址列輸入網址)。
- notifications:這個 API 可讓擴充功能在系統匣 (system tray) 產生和顯示通知給使用者。
- declarativeNetRequest:這個 API 可讓擴充功能指定網路請求的處理條件和動作,使擴充功能可攔截或升級網路請求而不需明確取得主機權限。
- declarativeNetRequestFeedback:這個 API 可讓擴充功能存取可在宣告規則中傳回資訊的函式和事件,例如透過 declarativeNetrequest API。
- scripting:scripting API 讓 JavaScript 可以被插入網站當中,例如透過 scripting.executeScript() 和 scripting.registerContentScripts() 兩個方法。
- webRequest:webRequest API 提供權限來為 HTTP 和 WebSocket 請求加入事件監聽器。這些事件監聽器可收到有關這類請求的詳細資訊,包括可修改和取消這些請求。
- storage:storage API 可讓擴充功能儲存和接收資料並監聽已儲存資料的變更。
- tabs:tabs API 可讓擴充功能與 Chrome 瀏覽器的分頁系統互動,包括建立、修改、重新排列瀏覽器的分頁。這個強大的 API 還可以截圖並與分頁內的內容腳本互動。
- activeTab: 這個 API 可在使用者執行瀏覽器和網頁動作時用來存取當前使用中的分頁。
- cookies:cookies API 可讓擴充功能查詢和修改 cookie,並且在 cookie 有變更時收到通知。
很重要值得一提的是,Chrome for Developers 網站上的 API Reference 當中還有許多其他 API 權限。從資安的角度來看,我們得了解網頁瀏覽器擴充功能可宣告許多權限,但不是所有的擴充功能都會向使用者要求提供權限。這件事突顯出使用者在下載任何擴充功能時都必須清楚了解其用途,以及它所要求的權限等級。
此元件是一個 Extension Service Worker 或 Service Worker,也就是 Google Chrome 擴充功能的核心事件處理器,負責處理來自其他擴充功能元件的網頁事件和訊息。擴充功能 service worker 除了回應擴充功能事件之外,還可以回應標準的 service worker 事件 ,例如:瀏覽某個新的網頁、點按通知,或者關閉一個分頁。這個 service worker 是使用 service_worker 這個鍵值來宣告。
根據我們的研究,所有擴充功能元件都經過高度加密編碼,但是當我們將每個元件都解開並清理一下程式碼之後,我們發現它具備以下擴充功能 service worker 的功能並使用 Chrome API:
- 事件監聽和處理:yavvy.js 這個 service worker 會使用 chrome.runtime.onMessage.addListener API 來監聽事件。在 Chrome 擴充功能內部,各種元件都會使用 Chrome API 的 sendMessage API 來彼此互通訊息。而這個 service worker 的任務是要監聽 navigation (瀏覽)、focus (聚焦) 和 getcookies (取得 cookie) 三種訊息。
- 監聽和攔截 POST 請求:yavvy.js service worker 會使用 Chrome.webRequest.onBeforeRequest.addListener 來產生一個反向呼叫 (callback) 函式以監聽含有 POST 請求的網頁請求事件,並使用 chrome.tabs.get API 來取得分頁資訊以進行分析。
儘管 ParaSiteSnatcher 的監聽範圍廣泛,但值得注意的是它排除了本地端網路位址以及它自己的 CC 網域。
此外,它還會攔截並監聽使用者活動,並且處理其他模組送來的下列訊息:
- messageDetails.type == 'focus'
- messageDetails.type == 'navigate'
- messageDetails.type == 'getcookie'
負責處理 navigate 和 focus 事件的函式會使用 chrome.windows 和 chrome.tabs API 來瀏覽和聚焦文件物件模型 (DOM) 內的元素。此惡意 Chrome 擴充功能的其他模組也經常用到這些訊息。
此檔案是被注入的一個 Chrome 擴充功能相依元件,它是一個主要用於 Asynchronous JavaScript and XML (AJAX) 通訊的內容腳本,用來與駭客的 CC 伺服器通訊,將受感染使用者的機敏資料外傳。
這是惡意 Chrome 擴充功能的主要內容腳本,負責定期監視網頁上的某些表單和元素,並針對某些按鈕設定事件監聽器 (每兩秒一次)。它使用 Chrome runtime API 的 chrome.runtime.onMessage.addListener 來監聽擴充元件內部互傳的「lixo」、「cookie」和「timer」等客製化訊息。當這些訊息被發送時,就會觸發 ParaSiteSnatcher 執行對應的功能:
- 攔截 POST 請求:lixo 訊息是一個萬用事件,不管網址長什麼樣子。它會追蹤所有 POST 請求,然後搜尋請求當中是否有機敏資訊,如:使用者名稱、密碼、電子郵件、信用卡資訊。
- 竊取 cookie 和使用者連線階段:cookie 訊息會發送一個 POST 請求到駭客的 CC 伺服器來竊取 cookie 和連線階段。
- 竊取 Microsoft cookie:當發現 Microsoft live.com 的 cookie 時,sovvy.js 檔案會使用 chrome.runtime.sendMessage API 來發送訊息,將這項資料傳送給 service worker,後者會處理這項資料並過濾出 Microsoft 帳號的 cookie。這些資料可用於竊取帳號以及 pass-the-cookie (傳遞 cookie) 攻擊,進而入侵到雲端。
- 竊取銀行帳號資訊:根據我們對 ParaSiteSnatcher 的研究顯示,這個惡意擴充功能會鎖定根巴西境內網路銀行的相關網址,如:Banco do Brasil (巴西銀行) 和 Caixa Econômica Federal (巴西聯邦儲蓄銀行)。當使用者連上這些金融機構的網站時,惡意 Chrome 擴充功能就會開始處理相關資料,尋找是否有使用者名稱、密碼、信用卡資訊等等,若有,就透過 POST 請求將資料傳送到駭客的 CC 伺服器。
- 從駭客的 CC 伺服器取得命令:這個 sovvy.js 腳本的功能之一就是讓惡意 Chrome 擴充功能透過標準的 HTTP GET 請求從駭客 CC 伺服器取得命令。
33nhuah.js 檔案內含一些用來監視銀行帳號資訊並執行 PIX 即時支付動作的商業邏輯。PIX 是巴西銀行所成立和監管的一個即時支付平台。
這個內容腳本當中的一些重要資料包括:密碼輸入表單的 HTML 範本、指令代碼定義 (enum 資料類型)、帳號資訊、PIX 金鑰類型以及 PIX 交易參數。此外,這個內容腳本還包含了用來監視銀行帳號餘額與執行 PIX 交易的函式,以及一些用來操作使用者介面的功能,例如:設定和重設表單、點選選單上的項目,以及隱藏或載入進度條。
這個內容腳本會使用標準的 HTML DOM 選擇器 (selector) 來尋找含有 PIX 敏感資訊的元素,例如收款方 PIX 機構名稱以及使用者帳號資訊:
- CPF/CNPJ (巴西個人/法人登記) 資料
- 電子郵件地址
- 手機號碼
- PIX 金鑰
unpgp2.js 這個內容腳本是為了瀏覽、聚焦、操作巴西聯邦儲蓄銀行的網路銀行網站介面而設計。這個內容腳本可執行各式各樣的動作,例如:瀏覽網頁、擷取帳號詳細資訊、聚焦某個網頁元素、執行金融交易以及發起 PIX 交易。
這個內容腳本主要包含用來定期監視視窗與分頁內容的邏輯,特別是那些包含以下內容或相關的視窗和分頁:
- Boleto Bancário (一種支付系統)
- 交易支付方與收款方的 CPF (自然人登記) 號碼
- 交易支付方與收款方的 CNPJ (法人登記) 編號
- 銀行付款條
這個內容腳本當中的邏輯會每隔一段時間就被呼叫一次,藉此利用 sovvy.js 這個內容腳本來監視 DOM 和使用者輸入。此外,s12ih0a.js 這個內容腳本還會將一些網頁上的元素 (如電話號碼與電子郵件地址) 透過 POST 請求傳送給駭客的 CC 伺服器。
我們將 ParaSiteSnatcher 擴充功能每個元件的函式摘要整理在下表:
模組名稱 | 函式 |
yyva.js | async function timerMonitor() function getCookies() async function navigate() async function setFocusTab() function addLog() async function analyzeRequest() |
sovvy.js | function setCommandRetorno() function updateCmd() function timerMonitor() function postSession() function postLixo() function getCmd() function updateCmd() function updateStatusOn() function getVersion() function getUser() function getElement() function addlog() function trim() function toLowerCase() function extractDigits() function getForm() function preparePostData() function buildInputMap() function checkElementClick() function checkInputPost() function ValidateEmail() function GenerateToken() function SetToken() function updateUserId() |
33nhauh.js | function monitorBB() function resetCommand_BB() function getSaldo_BB() function clickMenuSaldo() function focoTab_BB() function hideProcesso() function action_pix_BB() function checkComprovante() function setSConta() function setValor() function setChave() function clickMenuPix() function clickMenu() function setAccountPasswordForm() function getAgencyAndAccountNumber() function resetAccountPasswordForm() |
s12ih0a.js | function monitor2Via() function setEventDesco() function setEventBB() function click_isPagina() function setMessageDesco() function setMessageBB() function setHtmlBB() function setHtmlDesco() function getDadosSegundaVia() function post2Via() function checkDebugging() function innerFunction() |
unpgp2.js | function monitorAzul() function get_azul_ass() function get_azul_Saldo() function focoTab_Azul() function resetCommand_Azul() function get_azul_agcc() function azul_pedidos_automaticos() |
結論
惡意 Google Chrome 擴充功能利用強大的 Chrome API 來攔截、外傳、甚至可能修改使用者的機敏資料,突顯出使用者在決定是否該授權給某個擴充功能或使用某個瀏覽器時,都應該特別小心謹慎。ParaSiteSnatcher 利用多種方式來隱藏其入侵受害系統的作法,有助於確保它能偷偷常駐在系統內,讓偵測和移除的工作更加困難,所以,使用者對於自己下載及安裝到瀏覽器上的擴充元件應加倍小心。
儘管我們的調查顯示 ParaSiteSnatcher 專門攻擊 Google Chrome 瀏覽器,但其他的瀏覽器只要是基於 Chromium 所開發並支援 Chrome 擴充功能使用的 API,使用者同樣也應提高警覺。
入侵指標 (IoC)
如需 ParaSiteSnatcher 完整的入侵指標 (IoC) 清單,請至這裡下載。