趨勢科技一直在持續追蹤 CopperStealer 駭客集團的最新發展,這次它利用一個惡意的 Chromium 瀏覽器擴充功能來竊取虛擬加密貨幣和使用者錢包的帳號資訊。
我們曾經發布一些有關 CopperStealer 駭客集團的分析,指出他們會透過瀏覽器資訊竊取器、瀏覽器廣告擴充功能或是遠端桌面來散播惡意程式。最近我們在追蹤他們的最新動態時發現,該集團正利用一個可產生和竊取 API 金鑰的惡意瀏覽器擴充功能,在被感染的電腦上趁著使用者登入一些主流虛擬加密貨幣交易所網站時,竊取 API 金鑰。有了 API 金鑰,擴充功能就可以使用者的名義執行虛擬加密貨幣交易,將虛擬加密貨幣從使用者的錢包發送到駭客的錢包。
如同先前的作法,這個新的惡意元件同樣也是經由假盜版軟體網站散播。此元件散播時通常會包含一個植入器和一個瀏覽器資訊竊取器,並與其他不相干的惡意程式打包在一起,接著再壓縮成一個密碼保護的壓縮檔,從今年 7 月開始在網路上散播。
植入器/擴充功能安裝程式
此元件在第一階段使用了我們先前一篇貼文中提到的同一個加密器,接著在第二階段中,解密後的 DLL 使用了 Ultimate Packer Executables (UPX) 來壓縮。在經過解密和解壓縮之後,我們發現一個名為「CRX」的資源目錄,裡面含有一個 7-Zip 壓縮檔。這是惡意的 Chrome 瀏覽器擴充功能經常使用的包裝方式。

圖 1:名為 CRX 的擴充功能安裝程式內含一個 7-Zip 壓縮檔。
壓縮檔內含一個 JSON 格式的設定檔,以及另一個 7-Zip 壓縮檔,裡面是擴充功能安裝程式本身的程式碼。

擴充功能安裝程式首先會修改 Chromium 瀏覽器的「User Data」目錄下的「 Preferences」和「 Secure Preferences」兩個檔案。 Preferences 是一個 JSON 格式檔案,內含個別使用者設定。擴充功能安裝程式會關閉瀏覽器通知。
另外,Secure Preferences 也是一個 JSON 格式檔案,內含新安裝擴充功能的設定。由於是新安裝的擴充功能,所以「 crx.json」檔案的內容會被插入這個 Secure Preferences 設定檔中。此外,新安裝的擴充功能也會被加入系統登錄中的擴充功能安裝允許清單。
接著,「crx.7z 」壓縮檔會解開到擴充功能目錄「<User Data\Default\Extension>」之下。最後,瀏覽器會重新啟動,好讓新安裝的擴充功能啟用。根據我們的分析,此惡意元件會攻擊下列以 Chromium 為基礎所開發出來的瀏覽器:
- Chrome
- Chromium
- Edge
- Brave
- Opera
- Cốc Cốc
- CentBrowser
- Iridium
- Vivaldi
- Epic
- Coowon
- Avast Secure Browser
- Orbitum
- Comodo Dragon
同時,我們也發現安裝在受害者瀏覽器的惡意擴充功能包含兩個不同的擴充功能識別碼 (ID),但這兩個都沒列在官方的 Chrome Web Store 上:
- cbnmkphohlaaeiknkhpacmmnlljnaedp
- jikoemlnjnpmecljncdgigogcnhlbfkc
擴充功能分析
擴充功能安裝好後,我們將在 「 chrome://extensions/」看到以下這個新安裝的惡意擴充功能。

擴充功能的 manifest 文件定義了兩個 JavaScript 腳本。其中,背景腳本的檔名為「 background.js」,它會在擴充功能本身內部執行,而且只執行一份。另一個是內容腳本,檔名為「 content.js」,它會在 coinbase.com 環境 (context) 內執行,這一點從擴充功能的 manifest 文件中可以看到。

腳本加密編碼
這兩個 JavaScript 腳本都經過多道加密編碼手續。第一道加密編碼會將所有的字串拆成較小的字串,並儲存成單一陣列,存取此陣列時要呼叫多個使用十六進位字元命名的函式,並輸入 5 個十六進位整數作為參數。

第二道加密編碼會將所有字串、邏輯運算子 (+, -, *, /)、函式呼叫等等,插入一個物件陣列當中。每個物件含有一個隨機字串作為名稱,以及一個字串或函式作為數值。在我們分析的樣本中,「 _0x1f27e3[‘PFPYr’]」對應到字串「set」,而「 _0x1f27e3[‘LYLfc’](0,1) 」則對應到邏輯運算敘述「0!=1」。

以上兩道加密編碼都能使用客製的自動化腳本來解開。
背景腳本分析
藉由分析這個腳本,我們就可以看出駭客如何竊取合法虛擬加密貨幣錢包使用者的帳戶資訊。當此擴充功能啟動時,背景腳本會發出兩個網路請求。第一個是 GET 請求,目標網址為「 http://<C&C server>/traffic/chrome」,這可能是作為統計用途。第二個是 POST 請求,目標網址為「 http:// <C&C server>/traffic/domain」,請求中的資料包含一份虛擬加密貨幣網站的網域清單 (根據受害電腦上的 cookie):
- blockchain.com
- coinbase.com
- binance.com
- ftx.com
- okex.com
- huobi.com
- kraken.com
- poloniex.com
- crypto.com
- bithumb.com
- bitfinex.com
- kucoin.com
- gate.io
- tokocrypto.com
- tabtrader.com
- mexc.com
- lbank.info
- hotbit.io
- bit2me.com
- etoro.com
- nicehash.com
- probit.com
接下來,擴充功能會定義一個陣列,裡面存放駭客的各種虛擬加密貨幣位址和 Token:
- Tether (USDT,確切來說是 Ethereum ERC20 和 TRON TRC20)
- Ethereum (ETH)
- Bitcoin (BTC)
- Litecoin (LTC)
- Binance coin (BNB)
- Ripple (XRP)
- Solana (SOL)
- Bitcoin Cash (BCH)
- Zcash (ZEC)
- Stellar Lumens (XLM)
- Dogecoin (DOGE)
- Tezos (XTZ)
- Algorand (ALGO)
- Dash (DASH)
- Cosmos (ATOM)
針對 ETH (乙太幣) 位址,該腳本當中寫死了大約 170 個額外的 ERC20 Token。隨後,擴充功能啟動 onMessage 監聽器 (listener) 來監聽擴充功能處理程序或內容腳本所發送的訊息。此訊息使用的是 JSON 格式,其中一個數值的名稱為「method」(方法)。背景腳本會監聽以下方法:
- 「homeStart」方法
這個方法會試圖從 Chrome 的本機儲存讀取 API 金鑰 (apiKey) 與 API 機密 (apiSecret),如果這些金鑰/機密之前曾經儲存在本機上的話。這些參數用於以下步驟:
- 使用 API 來取得有關錢包、位址及餘額的資訊 (發送「/api/v2/accounts」請求)。回傳的結果會傳送給 C&C 伺服器:http://<C&C server>/traffic/step。
- 如果請求成功,API 會傳送「okApi」訊息給內容腳本,並開始解讀錢包資訊。如果錢包內的餘額非零,就將其中 85% 的餘額發送至駭客的錢包。


交易請求回傳的結果也會傳送給 C&C 伺服器:http://<C&C server>/traffic/step。
- 如果交易不成功,API 會發送一個「errorApi」訊息給內容腳本。這個「errorApi」訊息內含一個來自 https://www.coinbase.com/settings/api 的 CSRF Token 作為其中一個參數以及一個給「產生新 API 金鑰」請求的回應。
- 「createApi」方法
這個訊息是從內容腳本所收到,內容含有一個雙重認證 (2FA) 碼作為其中一個參數。此認證碼用來開啟一個新的對話視窗以產生 API 金鑰。通常,當您在 Coinbase API 設定中點選「+New API Key」(新增 API 金鑰) 時,您會看到一個雙重認證要求,如果您輸入的認證碼正確,就會出現這個對話視窗。
在產生新 API 金鑰的第二個步驟中,您必須選擇錢包及權限。惡意擴充功能會要求您提供所有可用帳戶的所有權限。

接著,您必須再輸入一個認證碼,然後會出現一個表單顯示新產生的 API 金鑰。如果成功,背景腳本接著會從「API key details」表單擷取這兩個 API 金鑰 (API Key 和 API Secret),將它們儲存到 Chromium 瀏覽器的本機儲存以供後續使用,並傳送至幕後操縱伺服器: http://<C&C server>/traffic/step。如果 API 認證不成功,就會發送「retryApi」訊息給內容腳本。
內容腳本分析
我們進一步分析了內容腳本當中負責竊取受害者雙重認證密碼的程式碼。內容腳本當中含有一系列語言的訊息,包括下列語言:
- 英文 (en)
- 德文 (de)
- 西班牙文 (es)
- 法文 (fr)
- 日文 (jp)
- 印尼文 (id)
- 義大利文 (it)
- 波蘭文 (pl)
- 葡萄牙文 (pt)
- 俄羅斯文 (ru)
- 泰文 (th)
- 土耳其文 (tr)
每個訊息都包含標題、說明以及針對手機和認證器的錯誤訊息。
舉例來說,以下是針對手機的英文訊息:
- 標題:「Please enter the verification code from your phone.」(請輸入您手機收到的認證碼。)
- 說明:「Enter the two-step verification code provided by SMS to your phone.」(請輸入發到您手機簡訊的兩步驟認證碼。)
- 錯誤訊息:「That code was invalid.Please try again.」(認證碼無效,請再試一次。)
以下是針對認證器的英文訊息:
- 標題:「Please enter the verification code from your authenticator.」(請輸入您認證器上顯示的認證碼。」
- 說明:「Enter the 2-step verification code provided by your authentication app.」(請輸入您認證程式提供的兩步驟認證碼。)
- 錯誤訊息:「That code was invalid.Please try again.」(認證碼無效,請再試一次。)
內容腳本一開始會先發送請求至「 /api/v3/brokerage/user_configuration」來看看使用者是否已經登入。接著,內容腳本會發送一個「homeStart」訊息給背景腳本,並開始利用 onMessage 來監聽含有「method」屬性的訊息,如同背景腳本的作法一樣。如果收到的訊息「method」屬性等於「okApi」,就會隱藏認證碼載入器並移除對話視窗。如果收到的訊息「method」屬性等於「errorApi」,就會建立一個對話視窗。

這個對話視窗上含有幾個輸入方塊,並且會監聽 oninput 事件。當每個輸入方塊都填入數字時,這些數字會拼湊在一起並寫入「tfa」變數 (雙重認證碼) 並當成「createApi」訊息的參數,發送至背景腳本。然後也會顯示認證碼載入器。
對話視窗有 6 個輸入方塊可輸入 6 位數,這是在使用認證器的情況。如果受害者使用的是手機簡訊認證,那麼認證碼會是 7 位數,此時對話視窗會出現 7 個輸入方塊。這部分的邏輯是寫在對話視窗的程式碼內。如果收到的訊息「method」屬性等於「retryApi」,那程式碼會刪除所有已輸入的數字,並以紅色顯示錯誤訊息。

結論
CopperStealer 犯罪集團短期內似乎毫無收手的跡象,我們將持續監控他們的一舉一動,看看他們如何攻擊更多不知情的受害者。我們這次在分析惡意擴充功能的行為時,發現這個擴充功能與之前的 CopperStealer 惡意程式有許多相似之處,其中一個就是這個擴充功能與 CopperStealer 都是經由相同的植入器散播,同時也透過前面提到的相同管道。
另一個極為相似的地方是,這個惡意擴充功能的 C&C 伺服器網域與先前版本的 CopperStealer 所用的網域名稱擁有相同格式,應該都是由網域產生演算法 (DGA) 所產生,格式為 16 個十六進位字元組成的字串。不僅如此,兩者的 C&C 伺服器也都是使用一個名為「CodeIgniter」的 PHP 程式框架所建立。這些就是 CopperStealer 惡意程式與此擴充功能背後的開發及經營者可能有所關聯的線索。
企業和一般使用者應養成從官方平台下載軟體、應用程式及更新的習慣,就能防範 CopperStealer 這類惡意程式的威脅和風險。建議您的團隊最好讓資安解決方案隨時保持更新,以確保它們能妥善保護系統,偵測並防範各種可能的攻擊和感染。
入侵指標 (IoC)
如需完整的入侵指標 (IoC),請參閱 這份文件。
原文出處: CopperStealer Distributes Malicious Chromium-based Browser Extension to Steal Cryptocurrencies 作者:Jaromir Horejsi 與 Joseph C Chen