7-Zipにヒープバッファオーバーフローが可能な危険な脆弱性-CVE-2026-48095

セキュリティニュース

投稿日時: 更新日時:

7-Zipにヒープバッファオーバーフローア可能な危険な脆弱性-CVE-2026-48095

GitHub Security Labのセキュリティ研究者Jaroslav Lobačevski氏(@jarlob)は2026年5月22日、世界で最も広く使われているオープンソースのファイル圧縮ツール「7-Zip」のバージョン26.00にCVSS v3.1スコア8.8(High)の深刻なヒープバッファオーバーフロー脆弱性が存在することを公式アドバイザリ「GHSL-2026-140」として公開しました。

脆弱性(CVE-2026-48095)は7-ZipのNTFSアーカイブハンドラー(NtfsHandler.cpp)内のCInStream::GetCuSize()関数に存在するC++の未定義動作(Undefined Behavior)が根本原因です。攻撃者が細工したNTFSイメージファイルを被害者に開かせるだけで、1バイトのバッファに256MBものデータが書き込まれvtableが乗っ取られるという古典的な手法でリモートコード実行が可能になります。

特に重大なのは、7-ZipがファイルをシグネチャベースのフォールバックでNTFSハンドラーに渡すため、.7z.zip.rar・無拡張子を含む事実上あらゆる拡張子のファイルが攻撃媒体になりえる点です。

修正済みバージョンv26.01は2026年4月27日(責任ある開示後3日後)にすでにリリースされています。

この記事のサマリー

  • CVE:CVE-2026-48095
  • GitHub Security Lab AdvisoryGHSL-2026-140
  • CVSS v3.1スコア8.8(High)(AV:N/AC:L/PR:N/UI:R/S:U/C:H/I:H/A:H)
  • 脆弱性の種類:ヒープバッファオーバーフロー(CWE-787: Out-of-bounds Write・CWE-190: Integer Overflow or Wraparound)
  • 発見者:Jaroslav Lobačevski氏(GitHub Security Lab・@jarlob)
  • 攻撃の条件:認証不要。ユーザーが細工されたNTFSイメージファイルを7-Zipで開くだけで発動。拡張子は問わない.7z.zip.rar・任意の拡張子・拡張子なしすべてが対象)。
  • 影響:vtableハイジャックによる任意コード実行(メモリが十分なシステム)またはDoS(低メモリシステム)
  • PoCの公開:アドバイザリと同時に**PoCジェネレータ(gen_ntfs_sparse.py)**が公開済み
  • 責任ある開示タイムライン:2026年4月24日(報告)→4月27日(v26.01リリース)→5月22日(公開)

脆弱性の対象と修正バージョン

  • 影響を受けるバージョン7-Zip 26.00以前のすべてのバージョン(NTFSの圧縮ストリームサポートが追加されて以降)
  • 修正済みバージョンv26.01(2026年4月27日にSourceForgeでリリース済み)

7-Zipは自動アップデートが存在しません。利用ユーザーがいる場合は組織内への告知とアップデート確認が必須です。

修正版へのアップデート方法

修正版:7-Zip v26.01

修正済みバージョンv26.01は2026年4月27日(責任ある開示の3日後)にリリース済みです。

Windowsの場合として、7-zip.orgから7-Zip 26.01以降のインストーラーをダウンロードしてインストールしてください。Linuxの場合として、ディストリビューションのパッケージマネージャーでの更新を確認してください(p7zipパッケージのメンテナーによる更新が提供されているか確認)。

# Ubuntu/Debian系
sudo apt update && sudo apt upgrade p7zip-full p7zip-rar

# Arch Linux
sudo pacman -Syu p7zip

# バージョン確認
7z --version

設定上の緩和策(即時アップデートができない場合)

アップデートが困難な場合の一時的な回避策として、信頼できないソースから受け取ったファイルを7-Zipで直接開かないことが最重要です。特に.ntfs.img形式のファイルはもちろん、あらゆる未知のファイルには注意が必要です。またメールや外部からダウンロードしたアーカイブファイルを7-Zipで展開する場合は、専用のサンドボックス環境を使用することを検討してください。

脆弱性の根本原因—「32ビットシフトの未定義動作が1バイト割り当てを生む」

CInStream::GetCuSize()の整数演算バグ

GitHub Security Labアドバイザリ(GHSL-2026-140)の技術解説によれば、問題の核心はNtfsHandler.cpp内の以下の1行です。

// NtfsHandler.cpp, line 687
UInt32 GetCuSize() const { return (UInt32)1 << (BlockSizeLog + CompressionUnit); }

この関数はNTFS圧縮ストリームのバッファサイズを計算します。攻撃者が細工したNTFSイメージに以下を設定した場合:

  • ClusterSizeLog >= 28(パーサーがClusterSizeLogとして28・29・30を許可していることを利用)
  • CompressionUnit == 4(非常駐圧縮データ属性のヘッダーから取得・値4は明示的に許可されている)

BlockSizeLog + CompressionUnit = 28 + 4 = 32となり、(UInt32)1 << 32というC++の未定義動作(Undefined Behavior)が発生します

UBがx86で1バイト割り当てを引き起こす仕組み

x86/x64ハードウェアではシフトカウントを31ビットにマスクする仕様があるため、(UInt32)1 << 32(UInt32)1 << 0 = 1と評価されます。その結果:

UInt32 cuSize = GetCuSize();      // UB → 1が返る
_inBuf.Alloc(cuSize);             // 1バイトしか確保されない!(本来は4GBのはず)

本来256MB〜4GBを確保すべきバッファがわずか1バイトになります。

1バイトバッファに256MBが書き込まれる

続いて実行される読み込み処理では:

// NtfsHandler.cpp, lines 940-941
const size_t compressed = (size_t)numChunks << BlockSizeLog;  // 最大256MB
RINOK(ReadStream_FALSE(Stream, _inBuf + offs, compressed))    // 1バイトバッファに書き込み

1バイトしか確保されていない_inBufに対して最大256MBのデータが書き込まれ、ヒープ上の隣接領域を侵食します。


vtableハイジャックによる任意コード実行の仕組み

ヒープレイアウトの特性を利用した精密な攻撃

GitHub Security Labのリリースビルドでのデバッガー分析によれば、_inBufの304バイト(0x130バイト)後にヒープ上でCInStreamストリームオブジェクトが配置されています

攻撃の流れは以下の通りです。

最初のRead()イテレーション(1回64KBずつ)として、_inBufから始まる64KBの攻撃者が制御するデータを書き込み、304バイト後に位置するストリームオブジェクトのvtableポインターを上書きします。2回目のRead()イテレーションとして、破壊されたvtableを通じてメソッドが呼び出される——古典的なvtableハイジャックです。攻撃者はNTFSクラスターデータ(=書き込まれるデータ)を完全に制御しているため、vtableポインターに任意のアドレスを書き込むことができ、信頼性の高いコード実行が可能になります。

プラットフォーム別の動作の違い

x86(32ビット)ビルドとして、_inBuf(1バイト)・_outBuf(2バイト)の両方が縮小割り当てになり、ヒープオーバーフローは無条件に発生しますx64(64ビット)ビルドとして、_outBufは8GBの割り当てが試みられます。16GB以上のRAMを搭載したシステムでは成功し、その後_inBufの1バイトバッファへのオーバーフローが同様に発生します。低メモリシステムでは_outBufの割り当て失敗により、影響がDoSにとどまります。


なぜ「任意の拡張子のファイル」が危険なのか

本脆弱性の最も重要な攻撃面の特性として、GHSL-2026-140は以下を明確に指摘しています。

「NTFSハンドラーはバイトオフセット3の"NTFS "シグネチャでファイルを識別する。7-Zipはシグネチャベースのフォールバック検出を使用するため、ファイル拡張子に対応するフォーマットハンドラーが開けない場合、すべての残りのハンドラーがシグネチャ優先順位で試みられる。これにより、.7z.zip.rar・拡張子なしを含む任意の拡張子を持つ細工されたNTFSイメージがNTFSハンドラーで処理される」

攻撃者は被害者に細工された.zipファイルや.7zファイルに見せかけたNTFSイメージを送りつけ、被害者が7-Zipで通常通りに開くだけで攻撃が発動します。被害者は「普通のZIPファイルを開いただけ」という認識であっても攻撃を受けます。


PoCとエクスプロイトの状況

GHSL-2026-140では、512MBのスパースNTFSイメージ(実際のデータは約8KB)を生成するPoCジェネレータ(gen_ntfs_sparse.py)がPythonスクリプトとして公開されています。SecurityOnlineおよびCyberSecurityNewsの報道によれば、公開されたPoCを使うことで攻撃の再現は比較的容易であり、未修正の7-Zip 26.00を使用しているユーザーは直ちにリスクにさらされています


2024〜2026年のNTFSハンドラー関連脆弱性の系列

今回の脆弱性は7-ZipのNTFSハンドラー(NtfsHandler.cpp)に繰り返し発見される脆弱性の系列のうちの最新例です。

CVE-2023-52168(2024年7月)として、7-Zip 24.01未満に影響するNTFSハンドラーのヒープバッファオーバーフローです。buffer+512*i-2オフセットへの2バイト書き込みを可能にします。CVE-2025-53816(2025年7月)として、RAR5ハンドラーのヒープバッファへのゼロ書き込みによるメモリ破損・DoSです。7-Zip 25.0.0で修正済みです。そして今回のCVE-2026-48095(2026年5月・今回)として、NTFSハンドラーの32ビットシフトUBによる1バイト割り当て→vtableハイジャックです。

NTFSハンドラーのコードには複数の整数演算上の脆弱性が潜在していることが示されており、定期的なアップデートの重要性が改めて示されています。


参考情報(1次ソース)