觀點 · 資訊分享
本機跑大模型的 ktransformers 爆漏洞:排程埠對所有網卡開放,惡意封包就能在主機上執行指令
ktransformers 0.6.3 以前的 balance_serve 排程服務,把 ZeroMQ 埠綁在所有網卡上,又直接用 pickle 解開收到的資料,取得 CVE-2026-63767。修補只是改成只綁 127.0.0.1,pickle 本身還在。
- 發布
- 2026-07-20
- 篇幅
- 約 4 分鐘 · 1,959 字
- 結構
- 7 節 + 3 題常見問題
- 標籤

一句話看懂:ktransformers 0.6.3 以前的排程服務,把網路埠開在「所有網卡」上,又直接解開收到的 pickle 資料,取得 CVE-2026-63767(CVSS 9.3);官方的修補是改成只開在本機 127.0.0.1。

先用白話講:這是什麼問題?
ktransformers 是在自己的主機上跑大型模型的推論框架,適合自架模型的人。它的預設高效能後端 balance_serve 裡有個「排程服務」,負責把工作分給不同的處理程序。
這個排程服務有兩個毛病,合在一起就出事:
- 大門沒鎖:它的網路埠開在
tcp://*,意思是監聽所有網卡,不只是本機,連區網、甚至網際網路上的人都連得到 - 收到包裹不檢查就拆:每收到一則訊息,就直接用 Python 的
pickle.loads()還原。pickle 像是把物件「冷凍打包」,解凍時會照包裡附的說明書重建物件,而說明書可以寫「順便幫我執行這個指令」
發生什麼事
- 回報者在 2026-07-13 於 GitHub 開了 Issue #2087,指出排程服務可被未驗證的遠端攻擊者利用
- 修補的 PR #2091 在 2026-07-19 合併
- VulnCheck 在 2026-07-20 公布 CVE-2026-63767,影響 ktransformers 0.6.3 以前,官方以 commit
def0f93修正;我沒有查到對應的正式發行版本號 - 評分是 CVSS v4 的 9.3(v3.1 為 9.8),攻擊者不需要登入,只要連得到那個埠,就能用惡意的 pickle 資料,以「伺服器程序的身分」執行任意指令
官方怎麼修?
PR 的做法很單純:把排程服務的埠從 tcp://* 改成 tcp://127.0.0.1,每處只改一行。原因是排程的通訊本來就只發生在同一台機器內,客戶端本來就是連 localhost,改成只聽本機並不影響正常使用。
PR 說明也很誠實地指出一件事:pickle.loads() 本身還在。現在只是把大門關到只有本機能進,網路上的攻擊面被擋住了;若要徹底解決,要改用有格式檢查的資料格式(例如 JSON、msgpack),或加上 ZeroMQ 的 CURVE 認證,這屬於更大的設計變更,留待之後處理。
給管理者的技術細節
1. 先確認有沒有暴露:在主機上看有哪些服務聽在所有網卡:
ss -ltnp
找輸出裡本地位址是 0.0.0.0 或 * 的行,而且程序是 Python 或 ktransformers 的,就是暴露中。
2. 處理方式(任選或搭配):
- 更新到包含 commit
def0f93的版本 - 用防火牆限制那個埠只有本機或可信網段能連
- 用容器跑的話,不要把這個埠對外發佈(port publish)
3. 寫程式時的教訓:對不信任的來源資料,不要用 pickle.loads();行程之間溝通,優先用 JSON 這類只描述資料、不會執行程式的格式;內部服務預設綁 127.0.0.1,真的需要對外再明確開放。
我的看法
最近自架 AI 的人很多,各種推論框架大多「一行指令就跑起來」,但預設值不一定適合暴露在網路上,這次就是一例:內部用的溝通埠,被不小心開給了所有網卡。如果家裡或公司的主機上同時放了模型、檔案和備份,一個暴露的埠就足以讓人一路摸進來。
我的建議是:新服務裝好的第一件事,先看它聽在哪個位址。沒有需要對外的,一律改成本機;需要給同事用的,前面加一層有驗證的反向代理,不要直接把推論服務的埠暴露出去。
名詞小辭典
- ZeroMQ:一個輕量的訊息傳遞函式庫,程式之間常用它互相傳資料。
- pickle:Python 內建的物件打包格式,還原時可能執行包裡夾帶的程式碼,所以不能用在不可信的資料上。
- ROUTER 埠:ZeroMQ 的一種通訊模式,用來接收多個客戶端的訊息。
- loopback(127.0.0.1):只指向本機自己的網路位址,外面的機器連不到。