本文へ移動
English version →
重大 9.4 急ぎ度: 早めに

pyLoadのtar展開に脆弱性、修正版あり

ダウンロード管理ツールのpyLoadに、細工したtarアーカイブの展開でデバイスファイルを作らせられる脆弱性があります。root実行のDocker構成を含め、0.5.0b3.dev102以降へ更新し、権限と展開先を点検してください。

CVE-2026-123815 公開 更新 執筆・監修: 佐々木 航 人が監修しながらAIを活用して執筆
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

CVSS v4は9.4で、rootで動かす公式のDocker構成ではホスト全体の侵害に至りますが、修正版が公開されているため、早めの更新で対応できます。

関係があるか

pyLoadを自前のサーバーやコンテナーで動かし、複数のユーザーにアーカイブの追加と展開を許している組織が対象です。公式のDockerイメージのようにrootで動かしている場合は、被害がホスト全体に及びます。

製品影響を受ける版修正版
pyLoad(pipのパッケージ名はpyload-ng) 0.5.0b3.dev102より前。Python 3.9〜3.13で動かしている場合に、tarの展開時の既定の設定が危険な側になります。Python 3.14は既定で安全な展開フィルターを使います。 0.5.0b3.dev102

確かめ方

  1. 1pip show pyload-ngで導入している版を確認し、0.5.0b3.dev102より前なら対象です。
  2. 2python3 --versionで実行しているPythonの版を確認します。3.9〜3.13なら、pyLoad側の修正が必要です。
  3. 3pyLoadをrootで動かしているか確認します。公式のDocker構成はrootで動きます。
  4. 4pyLoadの管理画面で、ADDとSTATUSの権限を持つユーザーを洗い出します。

何が起きたか

pyLoadがtarアーカイブを展開するとき、通常のファイルではなく、デバイスファイルやFIFO(名前付きパイプ)といった特殊なファイルまで作ってしまう脆弱性です。rootで動いていると、ディスクを直接読み書きできる状態になり、ホスト全体が侵害されるおそれがあります。

原因はUnTarの展開処理にあります。展開前にファイル名とリンク先は検査しますが、メンバーの種類は検査していません。さらにtarfileのextractallをfilter指定なしで呼んでいます。Python 3.9〜3.13では、この場合の既定が検査を行わないfully_trustedになります。

pyLoadには、tarのパストラバーサルを防ぐGHSA-mvwx-582f-56r7の対策がすでに入っていました。今回の脆弱性は、その対策が名前とリンクしか見ていなかったことで生じた抜けです。CWEはCWE-22とCWE-434が付いています。修正のコミットでは、デバイス系のメンバーを見つけたら展開を拒否する検査が加わりました。

攻撃の流れ

  1. 1

    tarを取り込む

    ADDとSTATUSの権限を持つユーザーが、特殊なメンバーを含む細工したtarをpyLoadに取り込ませます。

  2. 2

    展開を実行

    pyLoadが取り込んだアーカイブの展開処理を始めます。

  3. 3

    検査をすり抜ける

    名前とリンク先の検査は通り、メンバーの種類は検査されないまま展開が進みます。

  4. 4

    特殊ファイル作成

    デバイスファイルやFIFOがディスク上に作られます。

  5. 5

    ホストに影響

    rootならディスクの生データに触れられ、非rootでもFIFOによる停止や処理の混乱が起きます。

公開されている情報をもとにした流れの例です。

どう悪用されるか

ネットワーク経由で届き、利用者の操作は要りません。ただし認証は必要で、ADDとSTATUSの権限を持つユーザーが、細工したアーカイブを展開させる必要があります。権限の低いユーザーでも実行できる点に注意が要ります。

rootなど、OSの権限でデバイスの作成が許される環境では、アーカイブからブロックデバイスや文字デバイスが作られ、ディスクの生データを読み書きされてホストが侵害されます。公式のroot構成のDockerはこれに当たります。非rootの環境でも、FIFOが作られることで、処理の停止やプロセス間通信の混乱が起こりえます。

7zのバイナリが入っていても安心できません。拡張子によっては先に7zが処理しますが、ファイルの中身で判定される形式や、7zが使えない場合には、UnTarに処理が回ります。

今すぐやること

  1. 1

    導入している版を確認する

    pyload-ngの版とPythonの版を確認し、0.5.0b3.dev102より前かどうかを判断します。コンテナーで運用している場合は、イメージの版も確認します。

    pip show pyload-ng
  2. 2

    修正版に更新する

    pyLoadを0.5.0b3.dev102以降に更新します。この版は開発版の表記なので、pipではプレリリースの扱いになります。Dockerイメージで運用している場合は、修正を取り込んだイメージがいつ出るかを配布元の告知で確認し、出てから入れ替えます。

  3. 3

    特殊ファイルが作られていないか調べる

    ダウンロード先と展開先のフォルダーを調べ、デバイスファイルやFIFOがないか確認します。見覚えのないものがあれば、権限を持つユーザーの操作履歴も調べます。

    find <ダウンロードフォルダー> ( -type b -o -type c -o -type p ) -ls
  4. 4

    権限と実行ユーザーを見直す

    ADDとSTATUSの権限は、信頼できるユーザーだけに絞ります。更新後も、pyLoadをrootで動かす必要があるかを見直し、可能なら一般ユーザーで動かします。

すぐ更新できないとき

すぐに更新できないときは、ADDとSTATUSの権限を持つユーザーを必要最小限にし、信頼できない相手にはアーカイブを取り込ませないようにします。rootで動かしている場合は、一般ユーザーでの実行に切り替えると、デバイスファイルが作られるリスクを下げられます。ただしFIFOは作られるため、修正版の適用までのつなぎです。Python 3.14は既定が安全な展開フィルターのため、実行環境を3.14に移す手もあります。

背景

pyLoadはPython製のオープンソースのダウンロード管理ツールで、Web画面やAPIから操作します。社内では、資料や配布物を自動で取得する用途に使われることがあり、取得したアーカイブは展開処理まで自動で行われます。アーカイブを受け取って展開する処理は、取り込んだ側のディスクに何が作られるかを決めるため、検査の漏れがそのままホストへの影響になります。

tarの展開時に名前が展開先の外を指す問題は、CVE-2007-4559として古くから知られ、pyLoadの修正コードにもその番号が残っています。今回の脆弱性は、同じ展開処理でパス名の対策が入ったあとに残っていた、メンバーの種類の検査漏れです。Pythonのtarfileは3.14になって初めて既定が安全な展開フィルターになりました。それまでは、呼び出す側が自分でfilterを指定しなければ、検査のない展開になります。

よくある質問

Q.修正版の版名にb3.devが付いていますが、そのまま入れてよいですか。
A.修正が入ったのは0.5.0b3.dev102で、pipではプレリリースの扱いになるため、版を指定して更新する必要があります。0.5.0の正式版に修正が含まれているかは、配布元のリリースノートで確認してください。

この記事は、取得元の公開情報をもとに、人が監修しながらAIを活用して執筆しています。執筆と監修は佐々木 航が担い、公開したあとも人が内容を確認しています。誤りに気づいたときは直し、記事の末尾に訂正の行を残します。対応を決める前に、下の原文と参照先も確認してください。

影響パッケージ

パッケージ影響を受ける版 → 修正版
pyloadpyload —
pippyload-ng
すべての版→ 記載なし
PyPIpyload-ng
0.5.0b3.dev101 以前→ 記載なし

この記録には修正版の版が載っていません。修正版の有無と版は、本文か参照URLのベンダーの勧告で確かめてください。

原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

pyLoad is a free and open-source download manager written in Python. Prior to 0.5.0b3.dev102, UnTar._safe_extractall in src/pyload/plugins/extractors/UnTar.py validates archive member paths and link targets but does not call TarInfo.isdev to reject special tar member types before calling tarfile.extractall. On supported Python 3.9 through 3.13 runtimes, tarfile defaults to the fully_trusted extraction filter, so a user with ADD and STATUS permissions can cause extraction of a crafted archive containing character devices, block devices, or FIFOs. Python 3.14 defaults to a safe extraction filter. When pyLoad runs with operating-system privileges that permit device creation, including the official root-based Docker deployment, the archive can expose raw devices and compromise the host. Non-root deployments can still create FIFOs that cause hangs or IPC confusion. This issue is fixed in version 0.5.0b3.dev102.

出典: CVE.org (CVE Program・cvelistV5) NVD GitHub Advisory

参照URL

当サイトでは、アクセス解析と広告の効果測定のために Cookie を使います。株式会社Game のサイト共通の設定です。 詳しく