7-Zipバージョン26.00において、深刻なヒープバッファオーバーフロー脆弱性(CVE-2026-48095 / GHSL-2026-140)が公開されました。この脆弱性は、広く利用されているオープンソースのアーカイブユーティリティのNTFSハンドラに影響します。
この欠陥により、攻撃者は古典的なvtableハイジャックを介して任意のコードを実行できるようになります。被害者が特別に細工されたNTFSイメージファイルを開くだけで攻撃が成立します。
この脆弱性は、NtfsHandler.cpp内のCInStream::GetCuSize()関数に存在します。この関数は、(UInt32)1 << (BlockSizeLog + CompressionUnit)という32ビットシフト式を使用してNTFS圧縮ユニットのバッファサイズを計算します。
攻撃者が細工したNTFSイメージにおいて、パーサーが明示的に受け入れる値であるClusterSizeLogを28以上に設定し、CompressionUnit == 4の圧縮データ属性を使用すると、シフト指数が32に達し、C++における未定義動作(UB)が引き起こされます。
x86ハードウェア上では、このUBにより_inBufが本来のサイズではなくわずか1バイトとして割り当てられ、その後のReadStream_FALSE呼び出しがその1バイトバッファに最大256MBの攻撃者制御データを書き込もうとすると、SecurityLabは述べています。
リリースビルドにおけるヒープレイアウトの分析によると、CInStreamストリームオブジェクトはヒープ上で_inBufのわずか304バイト後に割り当てられます。
最初のRead()イテレーションで64KBの攻撃者制御クラスタコンテンツを書き込むと、わずか304バイトのオーバーフローでストリームオブジェクトのvtableポインタが上書きされます。
2回目のRead()呼び出しは、破損したvtableを通じてディスパッチされ、典型的なvtableハイジャックが発生します。攻撃者は書き込まれるNTFSクラスタデータを完全に制御できるため、上書きされるvtableポインタも制御でき、信頼性の高いコード実行が可能になります。
32ビットおよび64ビットの両ビルドが影響を受けますが、動作はわずかに異なります。32ビットシステムでは、_inBufと_outBufの両方が不足したサイズで割り当てられ、無条件にヒープオーバーフローが発生します。
64ビットビルドでは、_outBufの割り当てが8GBに達する可能性があり、RAM16GB以上のシステムでは成功した後、ReadStream_FALSEへと実行が進み、同様のオーバーフローが発生します。
メモリが少ない64ビットシステムでは、影響がサービス拒否(DoS)に限定される場合があります。重要な点として、NTFSハンドラはバグを引き起こすために.ntfsや.img拡張子のファイルを必要としません。
7-Zipはシグネチャベースのフォールバック検出を使用しているため、.7z、.zip、.rar、または拡張子なしを含む任意の拡張子を持つ細工されたNTFSイメージは、拡張子一致ハンドラが開くことに失敗した後、脆弱なハンドラにルーティングされます。これにより攻撃対象領域が大幅に拡大します。
この脆弱性を発見・報告したのは、GitHub Security LabのJaroslav Lobačevski(@JarLob)氏です。この脆弱性はUBSan(clang、Linux x64)を使用して確認されており、NtfsHandler.cpp:687にてランタイムエラーが発生し、根本原因であるシフトUBが確認された後、無効なvtableポインタによるSEGVが続きました。
ユーザーは、修正済みリリースが利用可能になり次第、7-Zipを26.00以降のバージョンにアップデートすることを強く推奨します。GetCuSize()の計算はNTFS圧縮ストリームサポートの導入時から存在しており、それ以前のすべてのバージョンも脆弱です。
翻訳元: https://cyberpress.org/new-7-zip-vulnerabilities/