觀點 · 資訊分享

vLLM 公開 cache_salt 漏洞:塞一個超長字串,就能讓 AI 推論伺服器卡住所有人

自架 AI 模型常用的推論引擎 vLLM,在 9 月 12 日公開一則安全公告:請求裡的 cache_salt 欄位沒有長度上限,沒登入的人送出超大字串,就能拖慢排程、讓其他請求排隊。0.29.0 以上已修正。

發布
2026-09-13
篇幅
約 4 分鐘 · 2,015 字
結構
7 節 + 3 題常見問題
標籤
#vLLM#自架 AI#拒絕服務#CVE-2026-100647
vLLM 公開 cache_salt 漏洞:塞一個超長字串,就能讓 AI 推論伺服器卡住所有人

一句話看懂:自架 AI 常用的推論引擎 vLLM,有個請求欄位 cache_salt 沒有長度上限,沒登入的人送出超大字串,就能拖住唯一的排程執行緒,讓所有人的請求排隊;0.29.0 以上已修正。

vLLM 的 cache_salt 能被拿來塞爆資訊圖卡:一個沒上限的欄位,讓沒登入的人也能把推論伺服器拖到卡住

先用白話講:為什麼一個欄位能卡死整台伺服器?

想像一間餐廳,只有一位櫃台人員負責把每張訂單唸給廚房。點餐單上有個「備註」欄,本來大家只會寫幾個字,例如「少冰」。但這個備註欄沒有字數限制,有人寫了一本小說,櫃台人員得從頭到尾唸完,才能輪到下一位客人。這段時間所有人都在排隊。

vLLM 是很多人拿來自架 AI 模型服務的推論引擎,這次出問題的就是這種「單一櫃台」設計:它的排程執行緒只有一條,而請求裡的 cache_salt 欄位正好會在這條執行緒上被處理。

發生什麼事

2026 年 9 月 12 日,vLLM 在 GitHub 公開安全公告(GHSA-wpww-v874-ph2p,CVE-2026-100647):

  • 問題:cache_salt 欄位只檢查「至少 1 個字元」,沒有最大長度;OpenAI 相容的 chat completions、completions、responses、pooling 端點,以及 Anthropic 格式的 /v1/messages 都接受它
  • 為什麼會慢:這個字串會被整段放進快取鍵,並在單一排程執行緒上做序列化與 SHA-256 雜湊,字串越大花的時間越多
  • 不需要特別條件:不用登入,也不用開特殊功能;前綴快取預設就是開的,vLLM 也預設不限制 HTTP 請求本文大小
  • 嚴重度:官方標為 medium(CVSS 5.3),影響是可用性(服務變慢或停擺),不是資料外洩
  • 修正:升到 0.29.0 以上(0.29.0 在 9 月 9 日釋出)

實測有多慢?

下面是公告裡回報者的實測(2026-08-29,vllm 0.28.0 預設設定,RTX PRO 6000):

情境 結果
沒有 salt 單次請求中位數約 9 毫秒
10 MB 的 salt 約 58 毫秒
100 MB 的 salt 約 599 毫秒
200 MB 的 salt 約 1195 毫秒
6 個攻擊者各送 100 MB salt 一般請求的 p90 約 1.8 秒(空閒時中位數約 8.5 毫秒)

這是回報者自己的環境與方法,數字會因硬體而不同,但可以看出趨勢:字串越大,延遲幾乎成正比增加。

給開發者與維運的技術細節

  • 先升級:vLLM 升到 0.29.0 以上
  • 別把推論埠直接開到網路上:放一層反向代理(例如 nginx 或 API 閘道),設定請求本文大小上限、要求驗證、限制來源。公告提到 vLLM 預設沒有請求本文大小限制,這是我會優先補上的一層
  • 多人共用的環境:官方建議 cache_salt 是隨機、不被第三方取得的值,長度約 43 字元;自己的前端或閘道不要把使用者可任意控制的字串直接轉成 cache_salt
  • 同一天還有 3 則公告:多模態聊天的音訊解碼忽略 VLLM_MAX_AUDIO_CLIP_FILESIZE_MB 上限(CVSS 4.3,0.29.0 以上修正);取樣器子類別影響影片解碼限制與 GPU 記憶體計算(CVSS 3.7,0.29.0 以上修正);遠端媒體在檢查大小上限前就被完整載入(CVSS 6.5,公告標示的修正版本為高於 0.29.0)
  • 後續:之後 vLLM 在 9 月下旬到 10 月間,又陸續公開多則同類的拒絕服務與資源耗盡公告,若你長期自架,建議把安全公告納入定期檢查

我的看法

自架 AI 的人常有個盲點:以為「我的模型在家裡跑,沒人會打」。但 vLLM 這類服務一旦為了方便,開了 0.0.0.0 讓手機或同事連,或放到雲端主機上,就等於把一個沒有任何防護的 API 暴露出去。這則公告提醒的重點不是某個欄位,而是推論服務本身通常沒有內建的流量與大小保護。

我自己的做法是:推論服務只綁內網,對外一律經過反向代理,並加上驗證與請求大小限制。如果是接案給客戶用,這一層更不能省,不然哪天客戶的服務被一個大請求拖垮,是很難解釋的事。

名詞小辭典

  • vLLM:高效能的開源推論引擎,用來把大型語言模型包成 API 服務。
  • 前綴快取(prefix caching):把提示詞開頭相同的部分先算好存起來,之後重複使用,省時間也省算力。
  • 拒絕服務(DoS):讓服務變慢或停擺,使正常使用者無法使用的攻擊。
  • p90:把所有請求的延遲由小排到大,第 90% 位置的那一筆,用來看「大多數人最慢會等多久」。

資料來源

常見問題

cache_salt 是什麼?為什麼會有這個欄位?
vLLM 會把處理過的提示詞前綴快取起來重複使用。cache_salt 是一個「鹽」,加進快取的雜湊裡,用來避免多人共用的環境中,有人靠猜測別人的提示詞來探測快取。官方文件建議鹽要隨機、不可被第三方取得,長度約 43 個字元(256 位元的 base64)。
為什麼一個大字串能影響所有人?
因為處理這個欄位的步驟,發生在 vLLM 唯一的排程執行緒上。字串越大,這個執行緒花在序列化與雜湊上的時間越長;它忙的時候,其他人的請求就沒辦法被排程,所以連沒帶 salt 的一般請求也會被拖慢。
我只在自己電腦或內網用,需要擔心嗎?
公告描述的前提是攻擊者能連到 API。如果只有你自己能連線,風險很低;但只要服務開放給多人、跨網段或網際網路,就值得升級並加上請求大小限制。
LINE