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

Rustのzipに脆弱性、ファイル上書きの恐れ 修正版9.0.5あり

Rust用のZIPライブラリzipに、検査では無害に見えるのに展開すると別の場所へ別の内容を書き込むZIPを作れる脆弱性が見つかりました。外部から受け取ったZIPをRustのアプリで検査・展開している組織が対象で、修正版が出ているため、依存関係を調べて更新します。

CVE-2026-115905 公開 生成 AI で作成
画像は生成 AI で作成したイメージです

急ぎ度: 早めに

CVSS v4は10で修正版9.0.5が出ていますが、影響を受けるのは該当ライブラリでZIPを展開するアプリに限られるため、早めの更新が妥当です。

関係があるか

RustでZIPを展開するアプリやサービスのうち、利用者や外部システムから受け取ったZIPを扱うものが当てはまります。とくに、展開前に別の処理でZIPの中身を検査している構成は注意が必要です。

製品影響を受ける版直った版
zip(Rust用ZIPライブラリ。パッケージ情報ではzip2) 9.0.4まで 9.0.5

確かめ方

  1. 1Cargo.lockを開き、zipまたはzip2のversionが9.0.4以下になっていないかを確認します。直接の依存だけでなく、他のクレート経由で入っているものも対象です。
  2. 2ソースコードでZipStreamReaderを使っている箇所を探します。ストリーム形式で展開している処理が、この脆弱性の影響を受ける部分です。
  3. 3外部から受け取ったZIPが、そのまま展開処理に渡る経路があるかを洗い出します。アップロード機能、メールの添付、他システムからの連携などが該当します。

何が起きたか

Rust用のZIPライブラリzipで、ZIPの中身の読み方が部品ごとにずれていました。そのため、ある部品が検査したときは無害なファイルに見えるのに、別の部品が展開すると、攻撃者が選んだ場所に攻撃者が選んだ内容が書き込まれることがあります。展開を担うサービスが使うファイルを上書きされるおそれがあります。

ZIPでは、ファイル名が2か所に記録されます。ひとつは末尾にまとめて置かれるセントラルディレクトリ、もうひとつは各ファイルの直前にあるローカルヘッダーです。ZipArchiveはセントラルディレクトリのファイル名を正とします。一方、src/read/stream.rsにあるZipStreamReaderは、ローカルヘッダーのファイル名で展開し、二つの記録が食い違っていても突き合わせていませんでした。

分類はCWE-20(入力検証の不備)とCWE-436(解釈の不一致)です。CVSS v4は10で、深刻度はcriticalと評価されています。元の脆弱性情報の題には、任意ファイルの上書きに加えてRCE(任意コード実行)につながる旨が書かれています。

攻撃の流れ

  1. 1

    細工したZIPを用意

    同じファイルについて、二つのファイル名の記録が食い違うZIPが作られます。

  2. 2

    検査をすり抜ける

    セントラルディレクトリを見る検査では、無害なファイル名に見えて通過します。

  3. 3

    別の名前で展開

    ZipStreamReaderがローカルヘッダーの名前で展開し、別のパスにファイルを書きます。

  4. 4

    既存ファイルの上書き

    後続のサービスが使うファイルが書き換えられ、その内容によっては被害が広がります。

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

どう悪用されるか

CVSS v4のベクターでは、ネットワーク経由で、認証なし、利用者の操作なしで悪用できると評価されています。実際には、攻撃者が細工したZIPを、該当アプリの展開処理まで届けられることが前提になります。ZIPを受け付ける窓口が外部に開いているほど、条件は満たしやすくなります。

悪用されると、展開先のディレクトリにとどまらず、アプリや後続のサービスが使うファイルが攻撃者の指定した内容に置き換えられるおそれがあります。置き換えられたファイルが設定や実行対象であれば、任意のコード実行に至る可能性があります。評価では、機密性・完全性・可用性のいずれも高い影響とされ、連携先のシステムへの影響も高いとされています。

今すぐやること

  1. 1

    使っている版を洗い出す

    ビルドしているすべてのRustプロジェクトで、zipまたはzip2が9.0.4以下になっていないかを調べます。コンテナイメージや配布済みのバイナリも、どのコミットからビルドしたかをたどって確認します。

    grep -A1 -E 'name = "zip2?"' Cargo.lock
  2. 2

    修正版に更新して再ビルドする

    修正版の9.0.5に更新します。Cargo.tomlで版を固定している場合は指定を直し、他のクレート経由の依存は、そのクレート側の更新も確認します。更新後は再ビルドし、本番環境に再デプロイします。

  3. 3

    ZIPを受け付ける経路を確認する

    外部から受け取ったZIPが展開処理に届く経路と、展開するプロセスの書き込み権限を確認します。展開先以外のファイルに書き込めないようになっているかを見直します。

  4. 4

    展開先まわりを点検する

    更新前に外部のZIPを展開していたサービスでは、展開先以外のディレクトリに、更新日時が不自然なファイルや心当たりのないファイルがないかを確認します。

すぐ更新できないとき

すぐに更新できないときは、外部から受け取ったZIPの展開を一時的に止めるか、受け付ける相手を信頼できるものに絞ります。展開は書き込み権限の最小な専用ユーザーで、サービス本体の設定やプログラムと切り離したディレクトリに限って行います。展開する前に、セントラルディレクトリだけで検査して通す構成は、この脆弱性の前提を満たすため避けてください。

背景

ZIPは、ファイルの名前や位置を末尾の一覧と各ファイルの直前の両方に書く形式です。同じ情報が2か所にあるため、読み手が一方だけを信じると、別の読み手との間で解釈がずれる余地が残ります。検査用の部品と展開用の部品が別々に動くアプリでは、そのずれがそのまま検査の抜け道になります。

アーカイブ内のファイル名が展開先を左右する問題は、Zip Slipの名で広く知られています。今回の脆弱性は、ファイル名そのものの細工ではなく、二つの記録のどちらを採用するかという読み方の食い違いが原因です。zipは、Rustでアップロードされた圧縮ファイルを受けたり、配布物を展開したりする処理で広く使われています。ZIPを検査するコードを別に書いている組織ほど、見直すべき箇所が多くなります。

よくある質問

Q.ZipArchiveだけを使っていて、ZipStreamReaderは使っていません。影響はありますか。
A.脆弱性の中心は、ZipStreamReaderがローカルヘッダーのファイル名で展開する点にあります。ZipArchiveだけで読み書きしているなら影響は小さいとみられます。ただし、依存先のクレートが内部でZipStreamReaderを使っている場合があるため、まず版を確認し、9.0.5に更新しておくと安心です。
Q.Rust以外のZIPライブラリにも同じ問題がありますか。
A.今回の脆弱性は、Rustのzipに固有のものです。ほかの言語のライブラリが同じ問題を持つかどうかは、それぞれの開発元の情報を確認してください。ただし、検査と展開で別の部品を使う構成は、読み方のずれが起きやすい点で共通しています。

まだ分かっていないこと

  • 実際の攻撃で悪用されたかどうかは公表されていません。悪用状況は、ベンダーのアドバイザリ(GHSA-m665-v7pm-7grj)で確認できます。
  • 9.0.4以前のうち、どの版から影響を受けるのかは公表されていません。使っている版が古い場合は、リリースノートで確認してください。
  • ZipStreamReader以外の読み取り経路で影響が出る条件や、実際のアプリでの被害の例は公表されていません。

この記事は、取得元の公開情報をもとに生成 AI で作成しています。誤りを含むことがあります。対応を決める前に、下の原文と参照先を確認してください。

影響パッケージ

種類パッケージ影響を受ける版直った版
zip-rs zip2 — —
原文の説明 取得元が公開している説明をそのまま載せています (多くは英語)。

zip is a zip library for Rust that supports reading and writing simple ZIP files. Through 9.0.4, ZipArchive treats Central Directory File Header filenames as authoritative while ZipStreamReader extracts using Local File Header filenames without reconciling the duplicate metadata in src/read/stream.rs. A crafted archive can therefore appear benign to a component that inspects the central directory but cause a streaming extractor to write a different attacker-selected path and content, potentially overwriting files used by a downstream service. This issue is fixed in version 9.0.5.

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

参照URL

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