觀點 · 資訊分享

transformers 的 save_pretrained() 有路徑穿越漏洞:存檔別人的模型,檔案可能被寫到任意位置

NVD 在 8 月 2 日公開 CVE-2026-9856:transformers 在存檔時把聊天模板的名稱直接當檔名,惡意的模型庫可以用它跳出資料夾、寫入任意檔案。GitHub 公告列出的修補版本是 5.10.0。

發布
2026-08-02
篇幅
約 4 分鐘 · 1,639 字
結構
7 節 + 3 題常見問題
標籤
#Hugging Face#transformers#CVE-2026-9856#路徑穿越#本地 AI
transformers 的 save_pretrained() 有路徑穿越漏洞:存檔別人的模型,檔案可能被寫到任意位置

一句話看懂:Hugging Face 的 transformers 在「存檔」時,會把聊天模板的名稱直接當成檔名。惡意的模型庫可以利用它,讓你存檔時把檔案寫到資料夾外面,內容還由攻擊者決定。

transformers 存檔路徑穿越資訊圖卡:存檔時把模板名稱當檔名,惡意模型庫能寫入任意位置

先用白話講:路徑穿越是什麼?

想像你請快遞員把包裹放進「3 樓 A 室的鞋櫃」。如果有人在包裹單上寫的地址是「出了大樓,再往左走兩條街,進去那間咖啡店的櫃台」,而快遞員沒有檢查,就真的照著送,那包裹就被放到了你根本沒打算放的地方。

這就是路徑穿越(Path Traversal):在檔名裡塞進「往上一層」之類的路徑符號,讓程式以為是在指定資料夾裡存檔,實際上卻寫到資料夾外面。

發生什麼事

NVD 在 8 月 2 日公開 CVE-2026-9856,對象是 Hugging Face 的 transformers(很多人用來跑 AI 模型的 Python 套件):

  • 問題在哪:save_pretrained() 這個「把 tokenizer 或 processor 存到硬碟」的功能,會把 chat_template(聊天模板)字典裡的鍵,直接拿來當檔名,沒有檢查
  • 怎麼被利用:攻擊者在 Hugging Face Hub 上發布一個模型庫,裡面的 tokenizer_config.json 做了手腳。你下載之後,如果對它的 tokenizer 或 processor 執行存檔,攻擊者設定的鍵就可以逃出你指定的資料夾
  • 後果:任意檔案寫入,而且寫進去的內容由攻擊者控制
  • 影響的處理器:繼承 ProcessorMixin 的多個處理器,公告點名 Idefics、Florence、Gemma、Phi、Qwen-VL

評分是 CVSS 7.1(High)。這個漏洞需要受害者操作(要下載並存檔)才會觸發。

哪些版本要升級?

兩份公告的寫法略有不同:

來源 受影響範圍
NVD 描述 5.8.0.dev0(含)以前
GitHub 安全公告(後續有更新) 5.10.0 以前受影響,5.10.0 修補

依 GitHub 上的發布紀錄,5.10 系列最晚在 6 月初就已發布,也就是說修補版本早於 CVE 公開(8 月 2 日)。最簡單的做法是直接升到最新的穩定版。

給開發者的技術細節

pip show transformers
pip install -U transformers
  • 觸發點是 save_pretrained(),所以只載入、不存檔的流程不在公告描述的範圍內;但仍建議升級
  • 自己寫的腳本如果會「下載別人的模型 → 重新存檔到某個目錄」(例如轉檔、量化、打包),要特別檢查
  • 保險做法:處理不信任的模型時,放在容器或專用使用者帳號下,只給它一個可寫入的資料夾,這樣就算寫出邊界,破壞範圍也有限
  • 補丁的提交紀錄在 transformers 的 GitHub 上,細節以官方為準

我的看法

這個漏洞很適合拿來提醒我自己:「下載別人的 AI 模型」和「下載別人的程式」其實一樣需要小心。我們常把模型當成一包數字,但它旁邊總是附著設定檔、模板、程式碼,每一個都是會被程式解讀的輸入。

對自架、玩本地 AI 的人來說,實際的建議很簡單:別在重要的機器上隨便執行來路不明的轉檔腳本;套件定期升級;有條件的話,用單獨的帳號或容器跑模型相關的工作。這些都不難,只是需要習慣。

名詞小辭典

  • 路徑穿越(Path Traversal):利用特殊的路徑寫法,讓程式存取或寫入原本範圍以外的檔案。
  • tokenizer:把文字切成模型看得懂的小單位的工具。
  • chat_template:模型用來把對話整理成固定格式的模板。
  • Hugging Face Hub:分享 AI 模型與資料集的網站,任何人都可以發布模型庫。

資料來源

常見問題

我只是用 transformers 載入模型,也有風險嗎?
公告描述的觸發點是 save_pretrained(),也就是把 tokenizer 或 processor 存到硬碟的步驟。只載入、不存檔,不在公告描述的範圍內;但為了保險,仍建議升級。
什麼是路徑穿越?
把檔名寫成像「../../某個位置」這樣的路徑,讓程式以為是在指定資料夾裡存檔,實際上卻寫到資料夾外面。
要升到哪個版本?
GitHub 安全公告列的修補版本是 5.10.0;NVD 的描述只寫到 5.8.0.dev0 以前,兩者寫法不同,建議直接升到較新的穩定版。
LINE