觀點 · 資訊分享
Python 3.10 到 3.12 同日推出安全更新:解壓縮 tar 的防護被繞過,惡意檔案能把檔案寫到資料夾外
Python 官方發布 3.12.14、3.11.16、3.10.21 三個只修安全問題的版本。其中 tarfile 的安全過濾器被發現有新的繞過方式,壓縮檔裡的捷徑可能指到解壓目錄之外。
- 發布
- 2026-08-13
- 篇幅
- 約 4 分鐘 · 1,746 字
- 結構
- 8 節 + 3 題常見問題
- 標籤

一句話看懂:Python 官方一口氣發布 3.12、3.11、3.10 三個安全更新,補上「解壓縮 tar 檔時,防護機制又被繞過」的漏洞,還修了 ZIP、網路連線等多處問題。

先用白話講:解壓縮的「安檢門」是什麼?
想像你收到一個包裹,打開前先過安檢門,確認裡面沒有危險物品。壓縮檔也一樣:有人會故意做出特製的壓縮檔,裡面藏著「捷徑」(符號連結),解壓縮的時候,程式不知不覺就把檔案放到你根本不想放的地方,甚至覆蓋重要檔案。
Python 的 tarfile 模組有一套過濾器,就是這道安檢門。這次的問題是:安檢門被找到新的繞過方式,特製的壓縮檔可以讓捷徑指到解壓資料夾的外面。
發生什麼事
Python 核心團隊在 8 月 12 日發布三個版本:
- Python 3.12.14
- Python 3.11.16
- Python 3.10.21
這三條線都已經進入「只修安全問題」的階段,所以這次只提供原始碼,不提供安裝程式。官方的結論很直接:強烈建議所有受影響版本的使用者升級。
這次修了哪些問題?
官方列了很長的清單,挑和一般開發者最有關的幾項:
| 位置 | 白話說明 |
|---|---|
| tarfile 過濾器 | 特製壓縮檔能建立指向解壓目錄之外的符號連結,這是對先前 CVE-2025-4330 的繞過 |
tarfile 的 extract() |
解出連結目標時,現在也會套用你指定的過濾器 |
| ZIP 解壓(Windows) | 路徑若帶磁碟機代號,檔案可能寫到目的地之外,現在會直接略過 |
http.client |
分塊回應的結尾行與 1xx 暫時回應,各限制最多讀 100 個 |
unicodedata.normalize() |
修掉可被餵入大量特製字元、讓處理時間暴增的問題 |
bz2 |
解壓失敗後重複使用同一個解壓器,可能造成緩衝區溢位,現在失敗後就不能再用 |
html.parser、configparser、csv |
修掉特定輸入會讓執行時間暴增的問題 |
另外,3.11 與 3.12 也把內建的 XML 解析函式庫 libexpat 更新到 2.8.3。
誰需要升級?
重點是你的程式會不會處理別人給的壓縮檔:
- 會:使用者上傳 tar 或 ZIP、從網路下載後自動解壓、自動化部署流程裡解包。這類情況建議盡快升級。
- 不會:只處理自己產生的檔案,風險相對低,但升級也沒壞處。
給開發者的技術細節
- 官方在公告中說明,這些是「只修安全問題」的原始碼版本,沒有固定發布週期。如果你用的是發行版或容器映像檔,要等映像檔更新,不會自動跟著變。
- 解壓外來 tar 檔時,建議明確指定過濾器,而不是用預設行為:
import tarfile
with tarfile.open("upload.tar") as tar:
# 指定 data 過濾器,擋掉危險的路徑與連結
tar.extractall(path="out", filter="data")
- 即使有過濾器,也別把不可信的壓縮檔直接解到有重要檔案的目錄,先解到獨立的暫存資料夾比較穩。
- 自己用
python --version檢查版本:3.12 要 3.12.14 以上,3.11 要 3.11.16 以上,3.10 要 3.10.21 以上。
我的看法
接案時常遇到客戶的系統還跑著舊版 Python,理由通常是「現在能動就好」。這種情況最容易被忽略的,就是「舊版還有沒有人在修安全問題」。3.10 到 3.12 目前還有安全修補,代表這次升級是小版本更新,風險很低,比整套搬到新版 Python 輕鬆很多。
另外我會特別留意 tarfile 這類解壓縮功能。很多網站有「上傳壓縮檔自動匯入」的功能,這類功能一旦碰到不可信的檔案,就是攻擊者最愛的入口。與其期待安檢門永遠不被繞過,不如多做一層:解壓在隔離的暫存目錄,檢查完再搬走。
名詞小辭典
- 符號連結(Symbolic Link):像是桌面上的捷徑,本身不是檔案,只是指向另一個檔案或資料夾的路徑。
- 路徑穿越(Path Traversal):用特殊路徑讓程式把檔案寫到本來不該碰的位置。
- 安全過濾器(filter):
tarfile內建的檢查機制,在解壓前先擋掉危險的檔案名稱與連結。 - CVE:公開漏洞的編號,方便大家用同一個代號討論同一個問題。