Xygeni近期觀察到,2025年軟體供應鏈攻擊情勢呈現令人擔憂的趨勢。這兩個流行的軟體包管理器都出現了這種情況: 的PyPI 以及 NPM作為我們持續進行威脅情報工作的一部分,Xygeni 的惡意軟體早期預警 (MEW) 該工具識別出一個與先前上傳到其他註冊表的惡意軟體實例截然不同但方法論上相似的案例。此案例凸顯了威脅行為者如何在不同生態系統中不斷演變和重複使用攻擊技術,尤其是在透過… 惡意Python套件 以及 惡意 npm 套件這增加了惡意軟體滲透開源供應鏈的風險。
Xygeni 的 MEW:發現相似之處
Xygeni 的 MEW 工具旨在偵測並標記惡意軟體包,特別是那些與 2025 年軟體供應鏈攻擊相關的惡意軟體包,一旦它們發佈到開源註冊表中,該工具就會立即發出警報。它的工作原理是分析新軟體包是否存在可疑行為。
在這種情況下,它識別出了兩個 惡意Python套件 (graphalgo 在 PyPI 上)和 惡意 npm 套件 (express-cookie-parser 在 npm 上)。
軟體供應鏈攻擊中的惡意 Python 和 npm 套件(2025 年)
讓我們來探討一下觸發警報的共同特徵:
註冊近似域名
他們都試圖模仿流行的現有軟體包。
- graphalgo(PyPI)“用於建立和操作圖和網路的 Python 套件。由名為「用戶」上傳 “larrytech” 2025 年 6 月 13 日,該軟體包作為 PyPi 上的替代方案出現,取代了最初的非惡意 graphalgo 項目,該項目後來更名為 graphdict。
- express-cookie-parser (npm)這個軟體包模仿了著名的 cookie-parser 軟體包,甚至完全複製了它的功能。 README.md。 這種冒充行為是利用現有信任的經典策略。
混淆視聽作為第一道防線
這兩個軟體包都將惡意程式碼混淆在了原始檔案中。 圖形演算法在內部發現了混淆程式碼 /utils/load_libraries.py. 在案件 express-cookie-parser, cookie-loader.min.js 包含混淆後的有效載荷。
這種初始混淆層通常用於阻礙常規檢查和靜態分析。混淆方式相當簡單:重複使用 ZLib 壓縮並加上 Base64 編碼。這種混淆方式清楚地表明軟體試圖隱藏其行為。結合其他證據,Xygeni MEW 將這些軟體包歸類為潛在惡意軟體。在確認階段,我們的審核人員迅速編寫了一個反混淆腳本,該腳本揭示了明顯帶有惡意的投放器階段。
多階段有效載荷交付和共享始發點
這兩個軟體包都起到了初始“滴管”,為真正的有效載荷奠定了基礎。它們共享一個共同的外部“種子文件 URL:https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
這個完全相同的外部種子檔案強烈表明攻擊者來自同一來源。有趣的是,該種子檔案的內容似乎只是簡單的環境變數(例如 JWT_SECRET、PORT),這可能會誤導人們對其實際功能的判斷。
採用DGA的動態C2分辨率
這些惡意軟體包中一種複雜的策略是使用網域產生演算法 (DGA) 動態解析命令與控制 (C2) 伺服器。這種技術常見於 2025 年的高級軟體供應鏈攻擊中,它依賴從種子檔案內容派生的 SHA256 雜湊值,並結合其他硬編碼值。透過這種方式,C2 基礎設施會頻繁變化,使得傳統的黑名單機制失效。在本例中,npm 變種使用了固定的網域值。 496AAC7E 作為其DGA邏輯的一部分。
建立持久性
兩名攻擊者都試圖在受影響的系統上建立持久的控制。他們的策略包括投放一個文件, startup.py (適用於 PyPi) startup.js (用於 npm),到各種作業系統(Windows、Linux、macOS)的通用 Google Chrome 使用者資料目錄中。
執行後清理
為了最大限度地減少痕跡,這兩個惡意腳本都執行了清理操作。這包括刪除它們最初的投放器檔案(load_libraries.py, cookie-loader.min.js)和修改合法的軟體包檔案(__init__.py, index.js)刪除已刪除組件的引用。
惡意 Python 和 npm 套件中的入侵指標
- PyPI 包: graphalgo(由 larrytech 於 2025 年 6 月 13 日發布)
- npm 包express-cookie-parser(具體版本為 1.4.12)
- 存取共享種子 URL:
https://raw.githubusercontent.com/johns92/blog_app/refs/heads/main/server/.env.example
- 持久檔名:
startup.py(Python)startup.js(JavaScript) - 常用持久路徑(作業系統相關):在 Google Chrome 使用者資料目錄中(例如,
AppData\Local\Google\Chrome\UserData\Scripts\在Windows上,~/.config/google-chrome/Scripts/在 Linux 等系統上)。
如何防禦軟體供應鏈攻擊中的惡意軟體套件(2025 年)
推薦給開發人員的方法
這次事件為研究2025年軟體供應鏈攻擊不斷演變的威脅情勢提供了一個寶貴的案例。它凸顯了惡意Python套件和惡意npm套件如何潛入受信任的生態系統,並且往往難以被偵測到,直到為時已晚。因此,早期偵測、智慧工具和主動系統維護如今已成為任何安全DevOps工作流程中不可或缺的一部分。建議開發人員考慮以下幾點:
依賴性審查
如果您的項目包含 圖形演算法 or express-cookie-parser因此,明智的做法是繼續推進他們的移除工作。
- 對於 PyPI:
pip uninstall graphalgo - 對於 npm:
npm uninstall express-cookie-parser
系統衛生
建議進行一次全面的系統掃描。此外,也建議手動檢查常見的 Chrome 使用者資料目錄路徑,以發現任何異常情況。 startup.py or startup.js 文件。
主動安全措施
- 評估新依賴項建立一套流程,在整合之前對新軟體包進行徹底評估,重點關注來自不熟悉的發行商的軟體包。
- 整合安全工具: 諸如 Xygeni 的 MEW 之類的工具,以及其他軟體成分分析工具(SCA)解決方案可以透過識別可疑行為和漏洞,提供關鍵的防禦層。
- 最低權限:遵循最小權限原則運行開發環境有助於限制安全漏洞可能造成的影響。
- 網路意識監控出站網路流量中的異常連接有時可以發現 DGA 產生的 C2 通訊。
的關鍵組成部分 load_libraries.py (來自 graphalgo)
download_remote_content(): 負責從指定URL取得文件。run_process():以分離的方式執行外部 Python 腳本,抑制輸出以保持隱藏。get_output_file_path()確定持久化 startup.py 檔案的理想系統位置。remove_self():負責執行後清理初始惡意檔案和軟體包修改。simple_shift_encrypt()/simple_shift_decrypt():用於混淆通訊頻道的自訂加密功能,對於 DGA 實作至關重要。load_libraries():協調整個多階段過程的中心功能,從初始下載到最終有效載荷執行和清理。
後果
與MEW識別出的其他潛在惡意軟體包一樣,依賴項防火牆立即保護了可能將這些惡意軟體包添加到其依賴項中的使用者。確認後,我們按照兩個註冊表的通知流程進行了操作,經審核後,註冊表移除了這兩個軟體包。




