CVE-2026-114583

LOWCVSS 6.9 · MEDIUM

Immediate actions

  • Track advisory updates for patch or workaround availability

Recommended action window: Monitor and triage in normal cycle

NVD description

tarfile.tar_filter could be bypassed using crafted link entries, including symlinks with empty or directory-like names, to redirect later archive members outside the intended extraction directory. This allowed a malicious tar archive to cause tarfile.extractall() with filter="tar" to write files outside the destination directory, subject to the permissions of the extracting process. This is the tarfile.tar_filter counterpart of CVE-2026-7774, which covered tarfile.data_filter.

0.0/ 10 priority

Sources & remediation

Priority

LOW

Exploitation

NONE

PoC

NONE

Patch

NONE

Momentum

NONE

Deep dive

Full discourse1 post
  • 美濃加茂まむ@superdoccimo

    Pythonの標準ライブラリtarfileで、信頼できないtar展開の安全弁である「tarフィルタ」をすり抜けられる脆弱性CVE-2026-114583が10月22日に公開された。前日10月21日に出たばかりのセキュリティリリース3.15.1/3.14.9/3.13.17にもこの修正は入っておらず、ソースを確認した限り現行の全リリースが影響を受ける。 tarfile.extractall(filter="tar")は、絶対パスや..による展開先外への書き込みを拒否する安全側のフィルタとして使われる。公開情報(http://python.orgのsecurity-announce、openwallのoss-security、いずれも10月22日付)によると、空文字やディレクトリ風の名前を持つリンクエントリを使うと、展開先ディレクトリそのものをシンボリックリンクに置き換え、後続のメンバーを展開先の外へ誘導できる。より厳格なdataフィルタ向けに手当て済みのCVE-2026-7774の、tarフィルタ側の抜けという位置づけだ。発行元の深刻度はMEDIUM、CVSSは6.9(ローカル、権限不要、完全性High)とされている。 自分でも手元のLinuxマシン(8 vCPU、uvで導入したCPython 3.14.8/3.13.16/3.15.0、ほかにシステムの3.13.5)で再現した。メンバー名が「.」(正規化すると展開先自身を指す)でリンク先が「..」のシンボリックリンクと、続けて通常ファイル「escaped」を1つ入れた小さなtarを作り、空の展開先に対してextractallした。結果、filter="data"はどのバージョンでもOutsideDestinationErrorで拒否したのに対し、filter="tar"は3.14.8でも3.13.16でも3.15.0でも例外を出さずにこのリンクメンバーを受理した。dataが止めるものをtarは素通しする、という差がそのまま観測できた。 原因はソースを読むとはっきりする。_get_filtered_attrsの中にある「リンクのパスが展開先ディレクトリ自身に解決されるなら拒否する」判定(target_path == dest_path)が、3.14.8でも昨日の3.14.9でも、if for_data: のブロックの内側にしか置かれていない。tar_filterはfor_data=Falseで呼ばれるため、このチェックを一度も通らない。これがtarフィルタだけ素通しになる理由だった。 修正(PR python/cpython#160098、10月22日マージ)は、リンクメンバーの名前がos.path.normpathで「.」になる場合に拒否する判定を、for_dataの外へ出して両フィルタに効かせるものだ。自分で3.14.8の標準ライブラリtarfileに同じ数行を当てて試すと、filter="tar"でも同じtarがOutsideDestinationErrorで拒否されるようになった。 ひとつ正直に書いておくと、今回の自分の検証ではextractallが展開先ディレクトリを先に作るため、「.」単体のリンクでは実ファイルが外に書き出されるところまでは至らなかった。確認できたのは「tarフィルタが本来弾くべき危険なリンクメンバーを受理してしまう」という差分そのもので、実際に外へ書き出すには発行元が言うディレクトリ風の名前の連鎖など展開順の条件が要るとみられる(ここは推測)。 影響を受けるのは、ユーザーがアップロードしたtarやビルド成果物、プラグインアーカイブなどを、dataではなくtarフィルタで展開しているサービスやツールだ。tarフィルタはシンボリックリンクなどの表現力が要る場面で選ばれるが、その分「展開先の外には出さない」という最低限の保証が崩れていた。昨日のセキュリティリリースはCA証明書(eMudhra)対応が主目的でこのtarfile修正を含まないため、更新しても直らない点は注意したい。さしあたり信頼できないアーカイブはtarではなくdataフィルタで扱い、展開先を毎回新しい隔離ディレクトリにするのが現実的な緩和策になる。 これは6月のCVE-2026-11940(hardlinkフォールバック経由の別経路)や2025年のCVE-2025-4330とは別個の問題で、古い話の蒸し返しではない。 参考 GitHub python/cpython PR python/cpython#160098、CVE-2026-114583 http://openwall.com/lists/oss-security/2026/10/22/33 http://mail.python.org の security-announce スレッド(2026-10-22) http://docs.python.org の tarfile「Extraction filters」 #Python #セキュリティ

    00001269
    21.0K followersView on X

Explore more