MALFEX npm 惡意套件攻擊:三條感染路徑,攻擊者還「署名」留記號

資安研究

2026-10-05 by 高田鑑識

本文整理自 Checkmarx Zero 研究團隊發表的〈MALFEX npm Malware Campaign: Three Payloads And An Adversary That Signs Their Work〉,內容涵蓋攻擊手法、受影響套件、入侵指標(IoC)與處置建議。

Checkmarx Zero 揭露一起名為 MALFEX 的 npm 供應鏈攻擊活動。研究人員判斷背後是同一名攻擊者,自 2023 年 8 月 6 日起持續在 npm 發佈套件,目前已知 12 個,其中 8 個含惡意程式碼,另外 4 個(function-ascii、malfapi、malfex-webhook-node、centralizemiddle)不含惡意程式碼,用途是掩護。惡意套件累計下載 40,767 次,僅 2026 年 10 月 1 日前一週就有 3,017 次,攻擊目標為 Windows 系統。

重點摘要

  • 三種惡意酬載:Overlord 遠端存取木馬(RAT,以 Go 撰寫的開源木馬)、movinlike 竊密程式(鎖定 Discord、瀏覽器、Telegram 與加密貨幣錢包),以及 function-flag 下載的尚未取得之 node.exe。
  • 執行方式:npm 的 preinstall/postinstall 腳本,以及套件被載入時就執行的程式碼。
  • 仍可安裝:截至 2026 年 10 月 1 日,function-flag、function-color、cdn-img-fetch 仍可從 npm 安裝。
  • 公告不完整:function-flag、function-color 完全沒有惡意套件公告;cdn-img-fetch 的公告只涵蓋 1.0.0 與 1.0.1,漏掉同樣惡意的 1.0.2 與 1.0.3。只依賴公告資料庫的工具會漏掉這些套件。
  • 立即行動:封鎖全部 8 個惡意套件;若曾在 Windows 上安裝,應隔離主機、移除持久化機制,並從乾淨的裝置更換外洩的帳密。

受影響套件與公告狀態

8 個惡意套件中,有 6 個在 2026 年 9 月 22 日至 30 日之間取得開源漏洞資料庫(OSV)的惡意套件公告。下表整理各套件的惡意版本、角色、公告與下載數(下載數為 npm 公開統計,截至 2026 年 10 月 1 日):

套件 惡意版本 角色 惡意套件公告 狀態(2026/9/29) 累計下載 近一週下載
function-flag 1.7.3、4.0.0、3.0.0、2.3.5–2.3.9 安裝後執行的下載器 無 仍可安裝 37,419 533
function-color 1.7.3、1.0.0 引入 function-flag 的外層套件 無 仍可安裝 300 2
cdn-img-fetch 1.0.0–1.0.3 竊密鏈:下載惡意圖片 MAL-2026-17320(僅涵蓋 1.0.0、1.0.1) 仍可安裝 643 643
img-to-native 1.0.0–1.0.3 竊密鏈:解密並落地執行檔 MAL-2026-17216 已被 npm 接管 967 967
native-runner 1.0.0–1.0.3 引入 img-to-native 的外層套件 MAL-2026-17218 已被 npm 接管 872 872
tlxbnhd 0.0.1 Overlord RAT 載入器 MAL-2026-16385 已下架 139 0
tldriver 0.0.1 Overlord RAT 載入器 MAL-2026-16384 已下架 138 0
mxdriver 0.0.1、0.0.2 Overlord RAT 載入器 MAL-2026-16383 已下架 289 0
合計 40,767 3,017

要注意的是,下載數代表套件在公開套件庫的觸及範圍,不等於受感染主機數。function-flag 的部分下載來自 function-color 的相依引入,而且下載也不代表套件一定裝在 Windows 上。目前沒有任何正常或廣泛使用的套件相依於這些套件,因此風險僅限於直接安裝這些套件名稱的系統;研究人員也未發現針對特定地區或組織的跡象。

攻擊者在作品上「簽名」

這起攻擊活動的名稱,直接取自攻擊者自己的品牌。MALFEX 字樣出現在:

  • 5 個 npm 發佈者帳號:malfexkkj、malfex_user、malfexteste2、malfexteste3、malfexteste4
  • 惡意程式碼儲存庫的 git 作者信箱:corpmalfex[@]gmail.com
  • [email protected] 的 README,其中將作品歸功於 MALFEX 團隊,並列出擁有者名稱 Murizada
  • 竊密鏈的 AES 解密金鑰:malfexteam2027

對鑑識人員而言,這類重複使用的識別特徵,是把不同套件串連起來、歸因到同一攻擊者的重要線索。

路徑一:Overlord RAT 載入器(tlxbnhd、tldriver、mxdriver)

這三個套件各自都能獨立運作。經混淆的 preinstall.js 與 postinstall.js 會在每次執行 npm install 時觸發,從 api.imghippo.com 下載惡意檔案,存成 gldriver_pre_core.exe 或 gldriver_pre_asset.exe 後執行,接著刪除自身。腳本雖然也寫了 macOS 與 Linux 的啟動指令,但酬載是 Windows 執行檔,因此只有 Windows 會受影響。

這個檔案雖然以 PNG 圖片的形式提供,實際上是 Microsoft IExpress 自解壓縮檔,內含一個具合法簽章的 AutoIt3 直譯器與加密的 AutoIt 腳本(Oxygen.a3x)。腳本經過多層解碼——XOR 編碼字串、RC4 加密與 LZNT1 壓縮——取出 Overlord RAT。根據研究人員對腳本的靜態分析,它接著會以程序挖空(process hollowing)手法,將 Overlord 注入 Windows 內建的已簽章程式 TapiUnattend.exe,並把父程序偽裝成 explorer.exe(這一步是從程式碼推斷,並未在實際執行時觀察到)。

路徑二:Discord 與瀏覽器竊密程式(native-runner → img-to-native → cdn-img-fetch)

這條鏈的套件都沒有安裝腳本,惡意程式碼在套件被 require 載入時才執行:

  1. native-runner 只是外層,用來引入 img-to-native。
  2. img-to-native 引入 cdn-img-fetch 的唯一目的就是觸發它;cdn-img-fetch 一被載入,就從 GitHub 儲存庫 cavecrew/proj 下載 banner.png。
  3. img-to-native 最多等待 120 秒讓圖片下載完成,找出附加在 PNG 結尾標記之後的資料,以 AES 搭配金鑰 malfexteam2027 解密,寫入 %APPDATA%\Microsoft\Windows\node_runtime_helper.exe。
  4. 這支 Go 撰寫的下載器再從 104[.]234.65.75:700 下載 setup.exe,也就是包裝成 Windows 執行檔、約 64 MB 的 Node.js 竊密程式 movinlike。

路徑三:function-flag 下載器(function-color → function-flag)

function-flag 是獨立運作的下載器,也是整起攻擊中存在最久的部分,自 2025 年 7 月起就帶有惡意程式碼。每個惡意版本的 index.js 都內含下載程序,且各自從不同網址下載酬載。

以目前最新的 1.7.3 為例:postinstall 腳本執行 example.js,以「Bloody」字型呼叫套件的 ASCII 藝術字函式;這個字型參數會觸發隱藏程序,從巴西應用程式託管服務上的 cdnzona.discloud.app 下載 node.exe,存到 %APPDATA%\node.exe 並以隱藏視窗執行。

function-flag 1.7.3 的 index.js,內含下載並執行遠端檔案的隱藏程式碼(圖片來源:Checkmarx Zero)

function-flag 1.7.3 的 index.js,內含下載並執行遠端檔案的隱藏程式碼(圖片來源:Checkmarx Zero)

各惡意版本的下載來源如下(2.3.4 不含惡意程式碼;3.0.0 的網址在現有資料中不完整):

版本 惡意檔案下載網址 檔名
1.7.3 hxxps[:]//cdnzona.discloud.app/node.exe node.exe
4.0.0 hxxps[:]//apicdn.squareweb.app/attachments/1392577835742265576/1395570372077682768/svchost.exe svchost.exe
3.0.0 hxxps[:]//bypasscdn.onrender.com/hxxps[:]//cdn[.]discordapp[.]com/attachments/1392577835742265576/1395570372077682768/svchost.exe svchost.exe
2.3.9 hxxp[:]//45.89.30.194/attachments/1242231519943069778/1270557692171128915/nocry.exe nocry.exe
2.3.8 hxxp[:]//45.89.30.194/attachments/1255944996503158885/1263421457598386237/malfex.exe malfex.exe
2.3.7 hxxp[:]//191.96.81.101/attachments/1255944996503158885/1259416184265244682/malfex.exe malfex.exe
2.3.6 hxxps[:]//apizona.onrender.com/attachments/1255944996503158885/1259416184265244682/malfex.exe malfex.exe
2.3.5 hxxp[:]//51.137.158.178/download (網址未顯示)

程式碼中還有幾個值得注意的細節:

  • 整段下載程序包在空的 catch 區塊裡,下載失敗(例如主機離線)時,安裝過程仍會正常完成、不會出現任何錯誤。
  • 非 Windows 環境沒有 process.env.APPDATA 變數,程序會無聲失敗,這也是只有 Windows 受影響的原因。
  • 惡意程式碼前方塞了大量空白,讓它落在一般程式碼編輯器的可視範圍之外。
  • 攻擊者在發佈惡意的 4.0.0 之後,又以較低的版本號 1.7.3 推出新的惡意版本。
  • function-color 本身不含酬載,只是把 function-flag 列為相依套件。

1.7.3 的下載主機目前沒有回應,因此研究人員尚未取得其酬載,也還沒有證據顯示 function-flag 與 movinlike 有關。不過 postinstall 腳本在每次安裝時仍會嘗試下載,主機隨時可能恢復提供惡意檔案。

持久化機制

Overlord RAT 載入器會把自己複製到一個假廠商目錄,並註冊排程工作:

  • 安裝目錄:%LOCALAPPDATA%\ScopeSmart Technologies Inc\,內含 AutoIt3.exe、h.a3x、SmartScope.vbs(ScopeSmart Technologies Inc 並非真實公司)
  • 排程名稱:\Maiden,執行 AutoIt3.exe h.a3x,每 5 分鐘重複一次、無結束時間
  • 開始日期回溯為 2020/1/1,作者欄位為「Welcome」,備註欄位為「Wichita」

回溯日期是為了避開「近期新增排程」的檢查;由於完全沒有使用登錄檔 Run 機碼,只掃描 Run 機碼也會漏掉這個感染。SmartScope.vbs 則以字串拼接的方式組出 Wscript.Shell,規避搜尋 CreateObject(“Wscript.Shell”) 的掃描規則。

命令與控制(C2)及資料竊取

Overlord RAT 從 Solana 區塊鏈讀取 C2 位址
Overlord 沒有寫死的 C2 位址,而是讀取攻擊者在 Solana 交易中發佈的加密備註,解密後作為伺服器清單。更換伺服器只需要發一筆新交易,因此單純關閉伺服器無法瓦解這套定址機制。研究人員分析的版本尚未設定 Solana 位址或伺服器清單,測試期間也未觀察到 C2 流量。

Overlord 著重於監控與控制,而非大量竊取帳密,功能包括螢幕擷取、鍵盤側錄、剪貼簿擷取、作用中視窗監控、檔案搜尋、遠端 Shell,以及透過虛擬顯示驅動程式建立的隱藏桌面,讓攻擊者在使用者看不見的情況下操作電腦。

movinlike 透過 Discord Webhook 外傳資料
movinlike 鎖定 8 種 Discord 用戶端:Discord、Discord Canary、Discord PTB、Discord Development、Lightcord、Vesktop、Nightcord 與 Bluecord。它會在用戶端的啟動腳本中注入程式碼竊取驗證權杖,再利用權杖收集個人資料、已儲存的付款方式、訂閱、伺服器、好友與連結帳號。

此外,它也會竊取 Chrome、Edge、Brave、Opera、Opera GX、Vivaldi 與 Yandex 瀏覽器的 Cookie 與已儲存登入資料,複製 %APPDATA%\Telegram Desktop\tdata 中的 Telegram 桌面版工作階段,以及 MetaMask、Phantom、Coinbase Wallet 等錢包擴充功能與桌面錢包的資料。所有資料壓縮後切成 25 MB 的分段,傳送到寫死的 Discord Webhook。研究人員確認該 Webhook 仍在運作,建立於 2026 年 9 月 26 日,位於一個新建立的 Discord 伺服器中。

function-flag 持續輪換酬載主機
每個惡意版本都指向不同網址,檔名包括 node.exe、svchost.exe、nocry.exe 與 malfex.exe,其中多個網址沿用 Discord 附件路徑格式,3.0.0 更透過代理轉送 Discord CDN 的附件連結。

研究人員確認的事實包括:8 個含惡意程式碼的套件曾發佈至 npm;截至 2026 年 9 月 29 日仍有 3 個可安裝,其中 2 個沒有公告;查證時酬載基礎設施仍在運作,包括 Overlord 酬載網址、GitHub 上的惡意圖片、setup.exe 伺服器與 Discord Webhook。

入侵指標(IoC)

網址與主機(網址已改為不可點擊的格式)

指標 用途
hxxps[:]//api.imghippo.com/files/hOG8244hc.png Overlord RAT 惡意檔案(以 image/png 提供)
www.image[.]com mxdriver 使用的第二個 Overlord RAT 投遞網域
hxxps[:]//raw.githubusercontent.com/cavecrew/proj/main/banner.png 竊密鏈惡意圖片(cdn-img-fetch 1.0.0–1.0.2)
hxxps[:]//raw.githubusercontent.com/cavecrew/proj/main/banner.jpg 竊密鏈惡意圖片(cdn-img-fetch 1.0.3)
hxxp[:]//104.234.65.75:700/setup.exe movinlike 下載點
hxxp[:]//104.234.65.75/setup.exe movinlike 備用下載點
discord.com/api/webhooks/1553545982975811594/… movinlike 資料外傳用 Webhook
function-flag 各版本網址 見上方 function-flag 表格

api.imghippo.com、raw.githubusercontent.com、discord.com、onrender.com 都是共用服務,請封鎖特定路徑,而非整個網域。

檔案雜湊值(SHA256)

檔案 SHA256
Overlord RAT 載入器(偽裝為 PNG) 9aba4685af072231aee049e1a5e294965580001b364d7d00152d84fcec1ce793
AutoIt3.exe(已簽章,取自壓縮檔) 5d69a932a077fee044b193c28e84564143f5c7e51079ab48e88fef74ab0b77b7
Oxygen.a3x/h.a3x(加密腳本) fd199d3977e1a2945b6031fc8696660a980e4f4617899baa045efe7ccbc8de67
Overlord RAT(解碼後) 2989244eac2a4bc7a13a09dec003e5c05ef7c80b2afe0958ce25042d5b804210
banner.png(目前版本) 4f4f7d64139bde6d458a061c7fb7dd247f70f60a1ab47d87fd3634656586c106
竊密鏈下載器(9/25) 889e13e227bc2b762178b88c35c691db3256e72be64d92ff1f381d29a2789849
竊密鏈下載器(9/25) e7f86f6cc4380db66d333eaf6f7dfc2c12d232c2bcd526434681245dea25efa4
竊密鏈下載器(9/25) ff826d2778ea1d40ce8ebfd9d66ecc86d4c811f5654b8a466a7e220ebbbc6807
竊密鏈下載器(9/26) 2f268ca76ab27971d8b16bd4ded26e1f9cd3d4460b894af2d4bdf89f0ab7ec4b
tlxbnhd/scripts/postinstall.js 7acf331117900179b483142f216fdcb22c671eb0b1971abd57f01bc036248a6e
movinlike c9c374afba4658dff15f71801e88c4d199c91dd2622d72c7b0c55577c8f73437
[email protected]/index.js c7cf2323e4923428984297db7715d75fec5b964fe65c325b53e3fa360f3b8d86
[email protected]、1.0.1/index.js 430300450f5acbd69c29f02d8c2e243f7d1d6202d1826f6e4d7715f95c47299b
[email protected]/index.js 4cba0c785e66d517eabd0164f34a9c2d04549da93b5ee3eebdce5558daa2f47c
[email protected]/index.js 5c933aa533721fa293b284170dd4611a4d88f88cc89f2d9c28ea4e22305b1f75
[email protected] banner.jpg 8f7ed69fb5505b57f06e673826779d459f7735739756de73a6d3347a9c8ea0cc
[email protected]/index.js d54853d6be467567d9f22d7f22ac48214df52c1f9c7a503930e901286423044a
[email protected]/example.js 886b84f83a0f760e664046ba40d8c800b7d0cf72190e13ca031ee5cf50f45bee

movinlike 很容易重新編譯而改變雜湊值,建議搭配下方的主機行為指標一併比對。

主機跡證

路徑或識別項 說明
%LOCALAPPDATA%\ScopeSmart Technologies Inc\\ Overlord RAT 載入器安裝目錄(內含 AutoIt3.exe、h.a3x、SmartScope.vbs)
排程工作 \Maiden Overlord RAT 持久化機制
<套件目錄>\gldriver_pre_core.exe、gldriver_pre_asset.exe Overlord RAT 落地檔案(執行後自刪)
%APPDATA%\Microsoft\Windows\node_runtime_helper.exe 竊密鏈解密後的下載器
%TEMP%\._cif_data 竊密鏈中繼檔案
%APPDATA%\node.exe function-flag 1.7.3 下載的惡意檔案

如何檢查是否受影響

1. 檢查完整相依樹(含間接相依)

npm ls function-flag function-color cdn-img-fetch img-to-native native-runner tlxbnhd tldriver mxdriver --all

2. 搜尋鎖定檔:套件即使已從 npm 下架,舊版本仍可能被鎖在專案的鎖定檔中。

grep -nE 'function-flag|function-color|cdn-img-fetch|img-to-native|native-runner|tlxbnhd|tldriver|mxdriver' \
  package-lock.json npm-shrinkwrap.json pnpm-lock.yaml yarn.lock 2>/dev/null

3. 在 Windows 主機上檢查跡證(PowerShell)

$paths = @(
  "$env:LOCALAPPDATA\ScopeSmart Technologies Inc",
  "$env:APPDATA\Microsoft\Windows\node_runtime_helper.exe",
  "$env:APPDATA\node.exe"
)
$paths | ForEach-Object 
Get-ScheduledTask -TaskName "Maiden" -ErrorAction SilentlyContinue | Format-List *

只要有任何一項為 True,或找到 Maiden 排程工作,都應視為可能已遭感染。另外也請檢視代理伺服器與 DNS 紀錄,確認是否曾連線到上方 IoC 表中的網址與主機。

處置與封鎖建議

若曾在 Windows 上安裝受影響套件

  1. 即使 node_modules 已刪除,仍應視為主機已遭入侵。
  2. 將主機隔離於網路之外,並保全日誌與檔案系統證據以供調查。
  3. 刪除 \Maiden 排程工作,移除 ScopeSmart Technologies Inc 目錄、node_runtime_helper.exe 與 %APPDATA%\node.exe(如存在),移除前先保留鑑識副本。
  4. 從已知乾淨的裝置,更換 Discord、瀏覽器中儲存的帳號,以及在該主機上使用過的所有帳號密碼;終止 Telegram 的作用中工作階段,並將加密貨幣資產移轉到新錢包。
  5. 檢查 Discord 帳號是否有異常付款,並檢查其他帳號是否有來自陌生地點的登入紀錄。
  6. 從私有套件庫、代理與快取中清除受影響套件。公開套件庫下架,不會移除已存在內部的副本。

封鎖這起攻擊活動

  • 在套件庫代理上封鎖全部 8 個惡意套件,包含外層套件。只封鎖 function-flag 擋不住 function-color,只封鎖 img-to-native 也擋不住 cdn-img-fetch。
  • 封鎖對 IoC 表中特定網址的對外連線,並將 104.234.65.75 設為黑洞路由;但不要整個封鎖 discord.com 或 raw.githubusercontent.com。
  • 不要只依賴 –ignore-scripts。它能擋下 Overlord RAT 載入器與 function-flag,但竊密鏈沒有安裝腳本,在套件被載入時就會執行。
  • 套件從套件庫下架時,也要一併檢視它宣告的相依套件。例如 img-to-native 被接管後,它所相依的 cdn-img-fetch 仍可安裝。

套件庫的狀態可能隨時變動,採取行動前請重新確認各套件的狀態與公告。

MALFEX 攻擊活動時間軸,2023 年 8 月至 2026 年 10 月(圖片來源:Checkmarx Zero)

MALFEX 攻擊活動時間軸,2023 年 8 月至 2026 年 10 月(圖片來源:Checkmarx Zero)

高田觀點

MALFEX 集結了近年供應鏈攻擊的典型特徵:用正常套件做掩護、以外層套件間接引入、把惡意內容藏在圖片中,以及回溯排程日期等反鑑識手法。對事件調查而言,這提醒我們不能只看 package.json 的直接相依,也不能只依賴公告資料庫或單一偵測規則;鎖定檔、排程工作的實際內容與對外連線紀錄,往往才是還原感染路徑的關鍵證據。