觀點 · 資訊分享

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#tarfile#安全更新#路徑穿越#CPython
Python 3.10 到 3.12 同日推出安全更新:解壓縮 tar 的防護被繞過,惡意檔案能把檔案寫到資料夾外

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

Python 發布三個舊版安全更新資訊圖卡:3.12、3.11、3.10 補上 tar 解壓防護的新繞過漏洞,用舊版的人要升級

先用白話講:解壓縮的「安檢門」是什麼?

想像你收到一個包裹,打開前先過安檢門,確認裡面沒有危險物品。壓縮檔也一樣:有人會故意做出特製的壓縮檔,裡面藏著「捷徑」(符號連結),解壓縮的時候,程式不知不覺就把檔案放到你根本不想放的地方,甚至覆蓋重要檔案。

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:公開漏洞的編號,方便大家用同一個代號討論同一個問題。

資料來源

常見問題

tarfile 的過濾器是什麼?為什麼被繞過很嚴重?
tarfile 的過濾器是 Python 用來擋掉壓縮檔裡危險內容(例如寫到目錄外的路徑、危險的捷徑)的安全機制。如果過濾器本身能被繞過,開發者以為已經安全的解壓程式,其實還是可能被特製檔案騙到。
我用 Python 3.13 或 3.14,需要處理嗎?
這次發布的是 3.10、3.11、3.12 三條線。3.13 與 3.14 不在這份公告裡,官方部落格另有 3.14.7 與 3.13.15 的發布,建議到 python.org 確認自己的版本是不是最新。
怎麼知道自己的程式有沒有風險?
只要程式會解壓「不是自己產生的」壓縮檔,例如使用者上傳、從網路下載的 tar 或 ZIP,就值得升級。純粹處理自己打包的檔案,風險比較低,但升級也沒壞處。
LINE