觀點 · 資訊分享
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 在「存檔」時,會把聊天模板的名稱直接當成檔名。惡意的模型庫可以利用它,讓你存檔時把檔案寫到資料夾外面,內容還由攻擊者決定。

先用白話講:路徑穿越是什麼?
想像你請快遞員把包裹放進「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 模型與資料集的網站,任何人都可以發布模型庫。