// 威脅簡報
SGLang 分散式擴散模式 pickle 反序列化:連得到 ZeroMQ 埠就能執行任意程式碼
- CVSS
- 9.8 CRITICAL
- CISA KEV
- 未列入
- 弱點類型
- CWE-502
- 主題
- AI 安全
AI 審稿 2026-09-28(未經人工)指令測試:未提供漏洞重現:未進行驗證紀錄 ↓
SGLang 分散式擴散模式的 DiffusionServer 未經認證就用 pickle 還原收到的網路訊息,連得到該埠的人都能執行任意程式碼;目前沒有修補版本。
| 誰會中 | 以分散式擴散模式(head node 以 --disagg-role server 啟動)執行 SGLang 的部署,版本 0.5.11 以上。CVE 紀錄目前列 0.5.11 至 0.5.14;研究者提出後續版本仍受影響的證據;PlainCVE 於 2026-09-24 查原始碼,確認 v0.5.20 與當天的 main 仍直接呼叫 pickle.loads()。只有 ZeroMQ 埠可從網路連到時才會被遠端利用。 |
|---|---|
| 後果 | 能連到 head node ZeroMQ 前端埠的任何主機,不需帳號就能在 DiffusionServer 程序裡執行任意程式碼。 |
| 現在該做什麼 | 目前沒有修補版本。PlainCVE 的判斷(依閱讀原始碼,未實測):限制誰連得到 head node 的 ZeroMQ 埠。單機部署可考慮不設 --host,讓它綁 127.0.0.1;跨主機部署這樣做會讓遠端 worker 連不回來,應改用隔離的私有網路加防火牆,只允許已知節點。encoder worker 也要一併限制。 |
| 受影響版本 | CVE 紀錄(CERT/CC)目前列 0.5.11 至 0.5.14(OSV、Strix 相同;NVD 尚未分析,沒有列出範圍);研究者提出後續版本仍受影響的證據(在 0.5.17 驗證,並說 0.5.11 至 0.5.20 與 main 都有);PlainCVE 於 2026-09-24 查原始碼,v0.5.20 仍直接呼叫 pickle.loads() |
| 修好的版本 | 尚無修補版本 |
| CVSS 向量 | 顯示完整向量CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 時間點 |
|
藍隊應對手冊
確認、修補 / 緩解、應變、強化。版本符合受影響條件不等於已被入侵;檢查沒有結果也不等於安全,每一項都有能證明與不能證明的範圍。標記的步驟對應下方攻擊流程裡可以擋下攻擊的那一步。
- 01確認版本與是否使用分散式擴散模式
版本 0.5.11 以上,且 head node 以 --disagg-role server 啟動才受影響。CVE 紀錄目前只列到 0.5.14,但研究者提出後續版本仍受影響的證據,PlainCVE 在 2026-09-24 也查到 v0.5.20 仍有同一個呼叫。在確認的修補版本出現之前,PlainCVE 建議盤點時把 0.5.11 以上都當成受影響;這是保守的盤點原則,不涵蓋日後的修補版本。pip show 要在實際執行服務的環境(同一個 venv 或容器)裡跑,看到的才是服務真正使用的版本。
唯讀查詢pip show sglang | grep -i '^version'; pgrep -af -- '--disagg-role' - 02確認 head node 綁定的位址
啟動參數有 --host 0.0.0.0 或其他非本機位址時,ZeroMQ 前端埠會對網路開放;沒設 --host 則只綁 127.0.0.1。ZeroMQ 位址沒有獨立的設定參數,前端埠與接收 worker 結果的埠都跟著 HTTP 的 --host 走。ss 只列出本機正在監聽的位址,不能單獨證明外部連得到;實際能否從外面連到,還要看防火牆與網路設定。
唯讀查詢ss -ltnp | grep -v '127.0.0.1' - 03別忘了 encoder worker
研究者另外發現(不屬於此 CVE):encoder worker 不管 --host 怎麼設都綁 0.0.0.0,也會呼叫 pickle.loads()。只檢查 head node 不夠。
- 04檢查可疑連線
來源沒有公布入侵跡象。PlainCVE 建議:檢查是否有非叢集節點連到 ZeroMQ 前端埠,以及 DiffusionServer 程序是否產生不明的子程序或對外連線。
- 01限制網路可達性(尚無修補版本)
官方沒有記載暫時緩解方式。PlainCVE 的判斷(依閱讀 v0.5.20 原始碼,未實測):--host 同時決定 HTTP、ZeroMQ 前端埠,以及 worker 回傳結果用的 ZeroMQ 埠。單機或同一個網路命名空間內的部署,可考慮不設 --host,讓它綁 127.0.0.1。跨主機部署若綁 127.0.0.1,遠端 worker 會無法回傳結果;應把節點放在隔離的私有網路,用防火牆只允許已知節點連到必要的埠,並確認 worker 流量仍正常。HTTP 前面的反向代理保護不到 ZeroMQ 埠。注意官方部署指南示範的是 --host 0.0.0.0。
- 02用防火牆保護 encoder worker
PlainCVE 的判斷(未經驗證):因為 encoder worker 無視 --host 綁在 0.0.0.0,建議用主機或網路防火牆限制來源。
- 03追蹤上游修補
社群修補 PR #30804 未合併就被機器人關閉。維護者合併的 PR #40259 只修改 python/sglang/srt/utils/common.py 的 SafeUnpickler 白名單,沒有動到 multimodal_gen 的 orchestrator.py;PlainCVE 於 2026-09-24 查原始碼,v0.5.20 與當天的 main 仍直接呼叫 pickle.loads()。
- 01發現可疑活動:當成可能遭入侵來調查
PlainCVE 建議:陌生連線本身不能證明已遭入侵,可能只是掃描或雜訊流量。先查 DiffusionServer 程序是否有不明子程序、異常對外連線或其他程式碼執行跡象;若有這類證據,因為攻擊者可在程序內執行任意程式碼,應隔離主機、從乾淨映像重建,並輪替該程序可存取的憑證與金鑰。這是預防性建議,來源沒有提供事件回應指引。
完整修復步驟與說明
目前沒有修補版本可升級。PlainCVE 建議(未經驗證)先以網路限制作為暫時防護。以下是 PlainCVE 的補充說明:
--host同時決定 HTTP 與 ZeroMQ 的綁定位址(依閱讀 v0.5.20 原始碼,未實測)。 在launch_disagg_server()裡,ZeroMQ 前端埠(--scheduler-port)與接收 worker 結果的埠(--scheduler-port加 1 至 3)都用--host的值,沒有獨立參數。所以要分情況處理:- 單機或同一個網路命名空間: 可考慮不設
--host,讓它綁 127.0.0.1。這時 HTTP API 也只剩本機連得到,對外服務要另外用反向代理之類的方式提供;反向代理只保護 HTTP,保護不到 ZeroMQ 埠。 - 跨主機: 綁 127.0.0.1 會讓遠端 worker 無法把結果送回 head node。應把節點放在隔離的私有網路,用防火牆只允許已知節點連到必要的埠(前端埠與結果埠),調整後確認 worker 流量仍正常。
- 單機或同一個網路命名空間: 可考慮不設
- 官方文件的範例本身就會曝險。 如果你照 SGLang 分散式部署指南用了
--host 0.0.0.0,請優先處理。 - 盤點版本時從寬。 CVE 紀錄目前列 0.5.11 至 0.5.14;研究者提出後續版本仍受影響的證據;我們查原始碼,v0.5.20 仍有這個呼叫。在確認的修補版本出現之前,把 0.5.11 以上都當成受影響;這是 2026-09-24 的保守盤點原則,不涵蓋日後的修補版本。
- 修補進度。 社群 PR #30804 曾明列要修這個問題,但未合併就被機器人以閒置為由關閉。維護者合併的 PR #40259 只修改
python/sglang/srt/utils/common.py,收緊 SafeUnpickler 允許的類別,沒有動到multimodal_gen的orchestrator.py。PlainCVE 於 2026-09-24 查原始碼,v0.5.20 與當天 main 的_handle_client_request()仍直接呼叫pickle.loads()。GitHub Advisory Database 的條目仍是未審核狀態,沒有列出修補版本。
攻擊流程
從左到右是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
由上到下是攻擊發生的順序。藍色盾牌代表這一步可以被擋下,越早擋下越好。點圖示可看細節。
- 攻擊者
找到可連線的 DiffusionServer ZeroMQ 前端埠
只有 head node 以 --host 綁到非本機位址時,這個埠才會從網路連得到。SGLang 自己的分散式部署指南用的是 --host 0.0.0.0(所有網路介面)。
防禦: PlainCVE 的判斷(依閱讀原始碼,未實測):單機部署可考慮不設 --host(預設綁 127.0.0.1);跨主機部署改用隔離網路與防火牆,只允許已知節點。
- 攻擊者
直接連上 ROUTER socket,不需任何憑證
這個 ZeroMQ socket 沒有認證機制,接受任何用戶端連線。
防禦: 網路層只允許信任的叢集節點連線。
- 攻擊者
送出最後一段夾帶惡意序列化資料的多段訊息
伺服器會把每則多段訊息的最後一段當成 pickle 資料處理。
- 你的系統
伺服器在任何檢查之前就呼叫 pickle.loads()
pickle 還原資料時可能執行資料裡指定的動作,所以還原不受信任的資料就等於讓對方下指令。
防禦: 目前沒有修補版本;根本解法是網路訊息不用 pickle,或先驗證來源。
- 你的系統
攻擊者的程式碼在 DiffusionServer 程序中執行
能做到什麼取決於這個程序的權限與它能存取的資源。
防禦: 以最小權限帳號執行服務,並與其他系統做網路隔離。
影響範圍
必須同時符合:使用分散式擴散模式(head node 以 --disagg-role server 啟動)、版本在受影響範圍內,而且 ZeroMQ 前端埠能從網路連到,才會被遠端利用。
| 條件 | 是否受影響 |
|---|---|
| 0.5.11 至 0.5.14 + 分散式擴散模式 | 受影響(CVE 紀錄、OSV、Strix 與研究者都同意) |
| 0.5.15 至 0.5.20、目前 main | CVE 紀錄未列入,不代表安全:研究者提出證據並在 0.5.17 驗證成功;PlainCVE 於 2026-09-24 查原始碼,v0.5.20 與當天的 main 仍直接呼叫 pickle.loads() |
head node 設了 --host 0.0.0.0 或其他非本機位址 | 可從網路攻擊;SGLang 官方部署指南就是這樣示範 |
沒設 --host(綁 127.0.0.1) | 只有同一台機器上的程序連得到;跨主機部署的遠端 worker 也會連不回來(依閱讀原始碼,未實測) |
| 沒有使用分散式擴散模式 | 不符合這個 CVE 的前提;但另一個漏洞 CVE-2026-7301(2026-05-18 公開)的 CVE 紀錄指出,multimodal generation runtime 的 scheduler ROUTER socket 預設綁 0.0.0.0,也會對收到的訊息呼叫 pickle.loads(),要另外評估 |
| 截至 2026-09-24 的所有版本 | 尚無修補版本 |
另外,研究者還發現一個不屬於此 CVE 的相關問題:encoder worker 不管 --host 怎麼設都綁在 0.0.0.0,也會呼叫 pickle.loads()。所以只把 head node 綁到 127.0.0.1,整個部署仍不安全。
原理
SGLang 的多模態生成功能可以把擴散模型(用來生成圖像等內容的模型)的工作拆到多台機器上,由 head node 上的 DiffusionServer 協調。各節點之間用 ZeroMQ(一個讓程式透過網路互傳訊息的函式庫)溝通。
問題有兩層:
- 沒有認證。 DiffusionServer 開的 ZeroMQ ROUTER socket 接受任何用戶端連線,不檢查對方是誰。
- 用 pickle 還原外來資料。 伺服器收到多段訊息後,把最後一段直接交給 Python 的
pickle.loads(),而且發生在任何檢查之前。pickle 是 Python 的物件存檔格式,還原時可能執行資料裡指定的動作,因此還原陌生人送來的 pickle,等於讓對方在你的程序裡執行程式碼。這類錯誤對應 CWE-502(不受信任資料的反序列化)。
兩者加起來:任何能開 TCP 連線到這個埠的主機,都能在 DiffusionServer 程序中執行任意程式碼。CISA 的 SSVC 評估將其評為「可自動化」(automatable),技術影響為「完全」。
有問題的思路(概念示意,不是原始程式碼):
展開程式碼範例(python)
frames = router_socket.recv_multipart() # 任何人都能連進來
request = pickle.loads(frames[-1]) # 還沒檢查就還原比較安全的思路(PlainCVE 的示意;目前沒有修補版本):
展開程式碼範例(python)
frames = router_socket.recv_multipart()
request = json.loads(frames[-1]) # 只接受純資料格式
validate(request) # 再檢查內容時間軸
| 日期 | 事件 |
|---|---|
| 2026-04-16 | 依研究者說法,commit 9da998a8(PR #21701,分散式擴散功能)加入 orchestrator.py,問題由此產生 |
| 2026-07-03 | 研究者透過 GitHub Security Advisory(GHSA-8374-wrr5-7q7f)私下回報 |
| 2026-07-10 | 社群 PR #30804 公開列出「disaggregation orchestrator accepts external pickle payloads」:問題在 CVE 公開前,已出現在公開的 PR 裡 |
| 2026-08-11 | 研究者開公開追蹤 issue #34419,表示超過五週沒有維護者回應 |
| 2026-08-14 | 回報給 CERT/CC(VINCE,VU#727584) |
| 2026-09-17 | CERT/CC 驗證並指派 CVE |
| 2026-09-19 | 社群修補 PR #30804 未合併即被關閉;維護者 PR #40259 合併(只改 srt/utils/common.py,未動 orchestrator.py) |
| 2026-09-22 | CVE 公開 |
| 2026-09-24 | 仍未列入 CISA KEV(目錄 2026.09.23 版),也沒有修補版本;PlainCVE 查原始碼,main 仍直接呼叫 pickle.loads() |
延伸閱讀
- 評分: 9.8(CVSS 3.1)來自 CISA 的 ADP 補充評分,不是 CNA(CERT/CC)給的。NVD 目前仍是「等待分析」。
- 受影響版本: CVE 紀錄目前列 0.5.11 至 0.5.14(OSV、Strix 相同;NVD 尚未分析,沒有列出範圍);研究者提出後續版本仍受影響的證據;我們查原始碼,v0.5.20 仍有這個呼叫。OSV 列的起始 commit(612785ff…)與研究者說的 9da998a8 不同,可能只是 0.5.11 的發版 commit。
- 公開 PoC: 研究者已公開核心 PoC 片段(只印出標記訊息的無害版本)、驗證方法與執行輸出,CVE 紀錄中 CISA 的 SSVC 也把 Exploitation 評為 poc;是否另有完整、可直接執行的工具公開,未查證。TheHackerWire 說尚未確認有公開攻擊程式碼,與上述不符。
- 利用狀況: 截至 2026-09-24(CISA KEV 目錄 2026.09.23 版)未列入 KEV。是否已遭實際利用、是否曾在修補前被利用,來源都沒有證據;未列入 KEV 不代表沒被利用。
- 相關弱點類型:CWE-502。
驗證紀錄 AI 依審稿規則逐項核對來源,全部通過;未經人工審稿,也尚未在我們的環境重現
| AI 審稿 | 2026-09-28 · 審稿規則 |
|---|
驗證紀錄只寫環境與結果,不公開重現步驟或可攻擊他人系統的程式。詳見 政策.
來源
- 安全公告CVE-2026-93088 Record (CVE Services API) · CVE Program / CERT/CC, 2026-09-22 · 查閱 2026-09-24
- CVE / NVD / OSVNVD API - CVE-2026-93088 · NIST · 查閱 2026-09-24
- 其他OSV - CVE-2026-93088 · OSV · 查閱 2026-09-24
- 安全公告GitHub Advisory Database - CVE-2026-93088 (unreviewed) · GitHub · 查閱 2026-09-24
- 研究文章SGLang CVE-2026-93088 write-up · Keita Sode (SYZD Research) · 查閱 2026-09-24含示範程式碼(無害的標記 PoC);CISA 在 CVE 紀錄中將這個網址標為 exploit
- 其他sglang issue #34419 (public tracking issue) · sgl-project (GitHub), 2026-08-11 · 查閱 2026-09-24
- 其他sglang PR #30804 (community fix, closed unmerged) · sgl-project (GitHub), 2026-09-19 · 查閱 2026-09-24
- 其他sglang PR #40259 (SafeUnpickler allowlist) · sgl-project (GitHub), 2026-09-19 · 查閱 2026-09-24
- 廠商說明SGLang Diffusion disaggregation guide · SGLang · 查閱 2026-09-24
- 其他CVE-2026-93088 · Strix · 查閱 2026-09-24
- 新聞報導CVE-2026-93088 · TheHackerWire · 查閱 2026-09-24
- 其他sglang v0.5.20 orchestrator.py (DiffusionServer._handle_client_request) · sgl-project (GitHub) · 查閱 2026-09-24
- 其他sglang v0.5.20 launch_server.py (launch_disagg_server endpoints) · sgl-project (GitHub) · 查閱 2026-09-24
- 其他sglang main a69583f orchestrator.py · sgl-project (GitHub) · 查閱 2026-09-24
- 其他sglang PR #40259 changed files · sgl-project (GitHub) · 查閱 2026-09-24
- 其他CISA Known Exploited Vulnerabilities Catalog (version 2026.09.23) · CISA · 查閱 2026-09-24
媒體簡報
一句話
SGLang 是用來執行 AI 模型的開源推論框架。它負責圖像等多模態生成的「分散式擴散」模式有一個嚴重漏洞:伺服器會把網路上收到的資料直接用 Python 的 pickle 還原,而且不需要任何登入,連得到該埠的人就能在伺服器上執行任意程式碼。CISA 給出 CVSS 9.8 的評分。截至 2026 年 9 月 24 日,官方尚未釋出修補版本。
關鍵數字
- 嚴重度
- CVSS 3.1 9.8(CISA ADP);NVD 尚未分析 cveawg.mitre.org
- CVE 公開
- 2026-09-22 cveawg.mitre.org
- 修補版本
- 尚無修補版本(CVE 紀錄沒有列出修補版本) cveawg.mitre.org
- 發現者
- Keita Sode(SYZD Research) cveawg.mitre.org
- 弱點類型
- CWE-502 不受信任資料的反序列化 cveawg.mitre.org
已確認
- DiffusionServer 的 ZeroMQ ROUTER socket 沒有認證,且在任何檢查前就對收到的資料呼叫 pickle.loads()。
- 截至研究者撰文時,最新版與 main 分支仍有問題程式碼,沒有修補版本。
- PlainCVE 於 2026-09-24 查原始碼:v0.5.20 與當天 main 的 _handle_client_request() 仍直接呼叫 pickle.loads()。
- 維護者 PR #40259 只修改 srt/utils/common.py,沒有動到 orchestrator.py 的 pickle.loads()。
- 研究者已公開核心 PoC 片段、驗證方法與執行輸出;CVE 紀錄中 CISA 的 SSVC 將 Exploitation 評為 poc。
- 截至 2026-09-24(CISA KEV 目錄 2026.09.23 版),未列入 KEV;未列入不代表沒被利用。
尚未確認 / 說法不一
- CVE 紀錄是否會更新受影響版本範圍(目前列 0.5.11 至 0.5.14),以及官方何時釋出修補版本。
- 核心 PoC 片段與驗證結果已公開;是否另有完整、可直接執行的工具公開,未查證。
- 是否已遭實際利用:沒有任何證據支持或排除;未列入 KEV 不代表沒被利用。
可引用的一句話
用 pickle 讀取陌生人送來的資料,就像照著陌生人寫的紙條操作自己的電腦。
圖片
引用時請標示「PlainCVE」並附上本頁連結。 完整引用格式見下方「如何引用本頁」。有事實錯誤請回報.
SGLang 分散式擴散模式 pickle 反序列化:連得到 ZeroMQ 埠就能執行任意程式碼 SGLang 是用來執行 AI 模型的開源推論框架。它負責圖像等多模態生成的「分散式擴散」模式有一個嚴重漏洞:伺服器會把網路上收到的資料直接用 Python 的 pickle 還原,而且不需要任何登入,連得到該埠的人就能在伺服器上執行任意程式碼。CISA 給出 CVSS 9.8 的評分。截至 2026 年 9 月 24 日,官方尚未釋出修補版本。 關鍵數字: - 嚴重度:CVSS 3.1 9.8(CISA ADP);NVD 尚未分析(https://cveawg.mitre.org/api/cve/CVE-2026-93088) - CVE 公開:2026-09-22(https://cveawg.mitre.org/api/cve/CVE-2026-93088) - 修補版本:尚無修補版本(CVE 紀錄沒有列出修補版本)(https://cveawg.mitre.org/api/cve/CVE-2026-93088) - 發現者:Keita Sode(SYZD Research)(https://cveawg.mitre.org/api/cve/CVE-2026-93088) - 弱點類型:CWE-502 不受信任資料的反序列化(https://cveawg.mitre.org/api/cve/CVE-2026-93088) 已確認: - DiffusionServer 的 ZeroMQ ROUTER socket 沒有認證,且在任何檢查前就對收到的資料呼叫 pickle.loads()。 - 截至研究者撰文時,最新版與 main 分支仍有問題程式碼,沒有修補版本。 - PlainCVE 於 2026-09-24 查原始碼:v0.5.20 與當天 main 的 _handle_client_request() 仍直接呼叫 pickle.loads()。 - 維護者 PR #40259 只修改 srt/utils/common.py,沒有動到 orchestrator.py 的 pickle.loads()。 - 研究者已公開核心 PoC 片段、驗證方法與執行輸出;CVE 紀錄中 CISA 的 SSVC 將 Exploitation 評為 poc。 - 截至 2026-09-24(CISA KEV 目錄 2026.09.23 版),未列入 KEV;未列入不代表沒被利用。 尚未確認 / 說法不一: - CVE 紀錄是否會更新受影響版本範圍(目前列 0.5.11 至 0.5.14),以及官方何時釋出修補版本。 - 核心 PoC 片段與驗證結果已公開;是否另有完整、可直接執行的工具公開,未查證。 - 是否已遭實際利用:沒有任何證據支持或排除;未列入 KEV 不代表沒被利用。 「用 pickle 讀取陌生人送來的資料,就像照著陌生人寫的紙條操作自己的電腦。」— PlainCVE https://plaincve.date/vulns/cve-2026-93088-sglang-diffusion-pickle-rce
如何引用本頁
本文採 CC BY 4.0,轉載請保留署名與連結。
PlainCVE 團隊(2026)。《SGLang 分散式擴散模式 pickle 反序列化:連得到 ZeroMQ 埠就能執行任意程式碼》。PlainCVE。https://plaincve.date/vulns/cve-2026-93088-sglang-diffusion-pickle-rce(查閱日期:YYYY-MM-DD)BibTeX
@misc{cve202693088sglangdiffusionpicklerce2026,
title = {SGLang 分散式擴散模式 pickle 反序列化:連得到 ZeroMQ 埠就能執行任意程式碼},
author = {PlainCVE 團隊},
year = {2026},
howpublished = {PlainCVE},
url = {https://plaincve.date/vulns/cve-2026-93088-sglang-diffusion-pickle-rce},
note = {更新於 2026-09-28}
}