7-Zip の LZX ヒープオーバーフロー、細工した CAB で RCE(CVE-2026-125742)
7-Zip の LZX デコーダのヒープオーバーフローにより、細工したマルチボリューム CAB が展開時にコードを実行する。26.06 で修正。
要点
- 7-Zip の LZX デコーダの境界外ヒープ書き込みにより、細工したマルチボリューム CAB が被害者の展開時にコードを実行します。LZX ウィンドウはボリューム間で縮小できますが、デコーダは古い書き込み位置を保持します。
- 7-Zip 26.06 より前のすべてのバージョンが影響を受けます。欠陥はデコーダにあるため、同じコードを共有する Windows、Linux、macOS のビルドが対象です。
- CVE レコードは CVSS v4.0 8.5 High、CVSS:4.0/AV:L/AC:L/AT:N/PR:N/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N、CWE-787 と評価しています。現実の攻撃は確認されておらず、CVE-2026-125742 は 2026 年 11 月 10 日時点で CISA の Known Exploited Vulnerabilities(KEV)カタログにありません。
- 2026 年 11 月 6 日に公開された 7-Zip 26.06 に更新し、すべてのコピーが更新されるまで信頼できないマルチボリューム CAB を展開しないでください。「修正方法」を参照してください。
影響を受けますか?
次のすべてに当てはまる場合に影響を受けます。
- 7-Zip 26.06 より前のバージョンを使用している。CVE レコードの影響範囲は 26.06 より前のすべてのバージョンです。
- 攻撃者が、電子メール、ファイル共有、ダウンロードなどで細工したマルチボリューム CAB を展開させることができる。
- 展開に 7-Zip 自身の LZX デコーダを使用する。LZX で圧縮された CAB フォルダではこれが既定です。別のアーカイバは異なるコードを含む場合があります。
CVE レコードはバージョン範囲を「0」から「26.06」未満としています。修正は 26.06 のソースコードと、2026 年 11 月 6 日に公開された 26.06 リリースに含まれます。欠陥は公式ビルドが共有する CPP/7zip/Compress/LzxDecoder.cpp にあります。
| 系統 | 影響を受けるバージョン | 修正バージョン |
|---|---|---|
| Windows、Linux、macOS 版 7-Zip | 26.06 より前のすべてのバージョン | 26.06 |
ターミナルからインストール済みのバージョンを確認します。
7zz i | head -n 3
Windows のコンソール実行ファイルは 7z なので、PowerShell またはコマンドプロンプトで 7z i を実行します。GUI では「ヘルプ」の「7-Zip について」にバージョンが表示されます。公式の Linux 版と macOS 版は 7zz をインストールします。Chocolatey と Windows Package Manager はインストール済みパッケージを表示します。
choco list 7zip
winget list 7zip.7zip
バージョン行が 26.05 以前なら、そのインストールは影響を受けます。26.06 のインストールはこの CVE について修正済みです。
修正方法
信頼できないアーカイブを展開するすべてのマシンで 7-Zip を 26.06 に更新します。
- Windows では公式ダウンロードページから 26.06 をインストールするか、パッケージマネージャーを使用します。
winget upgrade 7zip.7zipchoco upgrade 7zip -y - Linux では、26.06 を提供するディストリビューションのパッケージを使用します。提供しない場合は、7-zip.org の公式 Linux ビルドをインストールします。
7zz iでバージョンを確認します。 - macOS では公式ダウンロードページから 26.06 の macOS ビルドをインストールし、
7zz iでバージョンを確認します。 - インストーラーやアーカイブ管理ツールなど、独自の 7-Zip コピーを同梱するソフトウェアを確認します。システムの 7-Zip を更新しても、同梱コピーは更新されません。
脆弱な LZX 経路を無効にしながら CAB 展開を維持する設定スイッチはありません。すべてのコピーが更新されるまで、マルチボリューム CAB を信頼できないコードとして扱います。
- 電子メールや信頼できないダウンロードで届いた CAB を展開しない。
- どうしても確認する場合は、権限のないユーザーで使い捨ての仮想マシンまたはコンテナ内で展開する。
- メールゲートウェイでマルチボリューム CAB の添付をブロックする。これは露出を減らしますが、デコーダを修正しません。
根本原因は何ですか?
デコーダは LZX ウィンドウの書き込み位置 _pos を保持し、マルチボリューム アーカイブを継続するときにウィンドウ境界でのみこの位置をリセットします。後続のボリュームがより小さいウィンドウを要求でき、サイズ変更は _pos をリセットせずに古いバッファを解放します。
これが 7-Zip 26.05 の Code_WithExceedReadWrite() にある脆弱な継続ロジックです。
if (!_keepHistory)
{
_pos = 0;
_overDict = false;
}
else if (_pos == _winSize)
{
_pos = 0;
_overDict = true;
}
_writePos = _pos;
_unpackedData = _win + _pos;
if (outSize > _winSize - _pos)
return S_FALSE;
_keepHistory はデコーダが次のキャビネットで継続するときに真になります。_pos は現在の書き込み位置、_winSize は現在のウィンドウ サイズ、_win はウィンドウ バッファです。新しいアーカイブでは _pos はゼロになります。継続では _winSize と正確に等しい場合にのみゼロになります。
サイズ変更は Set_DictBits_and_Alloc() で行います。
const UInt32 newWinSize = (UInt32)1 << numDictBits;
if (_needAlloc)
{
if (!_win || newWinSize != _winSize)
{
z7_AlignedFree(_win);
_winSize = 0;
const size_t alloc_size = newWinSize + k_OutBufSize_Add;
_win = (Byte *)z7_AlignedAlloc(alloc_size);
if (!_win)
return E_OUTOFMEMORY;
memset(_win, 0, alloc_size);
}
}
_winSize = newWinSize;
この関数は古いウィンドウを解放し、より小さいウィンドウを割り当てて _winSize を更新します。_pos には触れません。2 MB のウィンドウで圧縮された最初のボリュームは、後続のボリュームが宣言する 32 KB のウィンドウをはるかに超えて _pos を進められます。継続が届くと、_pos は大きな位置を保持したままです。
境界チェックは脆弱なスニペットの最後の行です。outSize と _winSize は符号なしで、_pos は _winSize より大きくなります。_winSize - _pos の減算は巨大な値にラップアラウンドするため、チェックを通過します。デコーダは _win + _pos、つまり 32 KB バッファの先頭から約 1.3 MB 先に書き込みます。
どのように悪用されますか?
細工した 2 つの CAB ボリュームがデコーダを大きなウィンドウに通し、ウィンドウを縮小してから、古い位置でデコードされる継続ブロックを渡します。
- 攻撃者が
v1.cabとv2.cabを送ります。被害者は 7-Zip でv1.cabを展開します。 v1.cabには大きな LZX ウィンドウで圧縮されたフォルダが含まれます。1 つのフォルダが_posを選択した位置まで進め、別のフォルダがシェル スクリプトをディスクに書き込みます。- 空のフォルダが 32 KB のウィンドウを宣言します。デコーダは 2 MB のバッファを解放し、32 KB のバッファを割り当てて
_winSizeを更新しますが、_posは古い大きな値を保持します。 v1.cabはv2.cabへの継続ポインタで終わります。7-Zip は 2 番目のボリュームを開き、_keepHistoryが真のまま圧縮ブロックを LZX デコーダに渡します。- 境界チェックがアンダーフローし、デコーダは 32 KB の割り当てを超えて
_win + _posに書き込みます。 - エクスプロイトはヒープ グルーミングで
COutFileStreamオブジェクトをその位置に配置します。境界外書き込みが vtable ポインタと FILE 風のフィールドを上書きします。 - 破損したストリーム経由の次の書き込みは、ずらされた glibc の FILE vtable にディスパッチします。これが
_IO_file_xsputnにつながり、オブジェクトをFILE *として扱って実際の標準入力構造体を上書きします。House of Apple 2 手法がこれをsystem("sh r")の呼び出しに変えます。最初のボリュームが書き込んだスクリプトはすでにディスク上にあり、攻撃者はリバース シェルを受け取ります。
研究者は Arch Linux x86-64、glibc 2.44 で 7-Zip 26.04 と 26.05 に対してチェーンをテストしました。分析は完全なチェーンを説明しています。
分析には、別のリークなしでヒープ アリーナ ポインタから libc アドレスを組み立てる方法が含まれ、1 つのバリアントで再試行ありの成功率約 30 パーセントを報告しています。オフセットは 7-Zip のバージョン、glibc のビルド、ヒープ レイアウトに依存します。公開デモは Linux で、Windows のチェーンは実証されていません。
現実の攻撃は確認されていません。CVE レコードと研究者の分析が唯一の公開報告で、どちらも被害者やキャンペーンを名指ししていません。
攻撃の流れは?
最初の CAB ボリュームが大きなウィンドウで LZX の書き込み位置を進めます。後続のボリュームがその位置をリセットせずにウィンドウを縮小し、継続のデコードが新しいバッファを超えて書き込みます。エクスプロイトはその書き込みをコード実行に変えます。
攻撃者に何ができますか?
細工したアーカイブを展開させた攻撃者は、7-Zip を起動したユーザーの権限でコードを実行します。分析は Linux でのリバース シェルを実証しています。影響はそのユーザーの権限とマシンに依存します。
条件は影響の一部です。
- 被害者は影響を受ける 7-Zip ビルドで最初のボリュームを展開する必要があります。ファイル マネージャーでアーカイブを開いて内容を一覧表示することは実証されたトリガーではありません。エクスプロイトは展開中に実行されます。
- 攻撃者は両方のボリュームを届ける必要があります。2 番目のボリュームは継続として自動的に開かれます。
- エクスプロイトは特定の 7-Zip、glibc、ヒープ レイアウトに合わせて調整されています。別のビルドでは新しいオフセットが必要になる場合があり、公開デモは Linux x86-64 を対象としています。
- コードは 7-Zip を起動したユーザーとして実行されます。標準ユーザーはそのユーザーのファイルとセッションを得ます。管理者が展開すると、攻撃者に管理者権限のコード実行を与えます。
- 現実の攻撃は確認されておらず、公開された被害者報告もありません。
分析自身の数値が信頼性を示します。ASLR 無効で 5 回中 5 回成功し、1 つのバリアントで ASLR 有効時に 64 回中 19 回(約 30 パーセント)成功しています。失敗すると展開エラーで終わるため、再試行は無料です。これは動作するエクスプロイトであり、保証されたエクスプロイトではありません。
修正が機能する理由
修正は、デコーダが新しいウィンドウを割り当てるたびに書き込み位置と履歴フラグをリセットし、コンストラクタで両方のフィールドを初期化します。これにより、境界チェックが捕捉できなかった古い位置がなくなります。
これがコミット d3296e39e1f1f92c7b41c0c3848e65640428d42d の修正です。
CDecoder::CDecoder() throw():
+ _pos(0),
_win(NULL),
+ _overDict(false),
_isUncompressedBlock(false),
@@
z7_AlignedFree
(_win);
_winSize = 0;
+ _pos = 0;
+ _overDict = false;
const size_t alloc_size = newWinSize + k_OutBufSize_Add;
_win = (Byte *)
Set_DictBits_and_Alloc() は古いバッファを解放する同じブロックで _pos と _overDict をクリアするようになりました。ウィンドウの縮小は新しいバッファのオフセット 0 から継続を開始し、符号なしの減算はもうラップアラウンドしません。コンストラクタでの初期化は、最初の割り当て時の未初期化値のケースも取り除きます。
この変更は実証された経路を閉じます。アーカイブ形式やデコーダの出力は変えないため、通常のマルチボリューム CAB 展開はそのまま機能します。26.06 のリリース ノートは「いくつかのバグと脆弱性を修正した」とだけ述べています。このコミットがこの CVE の具体的な修正です。
侵害されたかどうかを確認するには?
CVE レコードも研究者も侵害の指標を公開していません。エクスプロイトはシェル スクリプトを残し、ネットワーク接続を開始するように設計されています。署名ではなく、これらの影響を確認してください。
- CAB 展開中に現れた予期しないファイル、特に小さなシェル スクリプトと多数の小さなパディング ファイルを探します。実証されたチェーンは
rという名前のスクリプトを書き込み、ヒープ グルーミングに多数の埋め草ファイルを使います。 - 展開時刻前後のマシンの外向き接続、特に
7z、7zFM、またはそれらが起動したシェルからの接続を確認します。 - 一緒に届いた CAB ファイルのペアを探します。1 つ目が継続ボリュームを指定しています。信頼できないソースからのマルチボリューム CAB が配布パターンです。
- 信頼できない CAB を展開したホストでは、クリーンアップ前に展開ディレクトリとプロセス、ネットワークのログを保存します。実行を排除できない場合はホストを再構築します。
失敗した試行は展開エラー以外の痕跡を残さない場合があります。シェルや接続がないことは、アーカイブが無害だった証拠ではありません。
年表
- 2026-11-06: 7-Zip 26.06 がコミット
d3296e39e1f1f92c7b41c0c3848e65640428d42dとともに公開され、ウィンドウ割り当て時に_posと_overDictをリセットします。 - 2026-11-10 11:57 UTC: VulnCheck が CVE-2026-125742 を予約します。
- 2026-11-10 12:00 UTC: VulnCheck が CVE レコードとアドバイザリを公開します。
- 2026-11-10: Nguyễn Trần Thanh Lâm が技術分析と悪用デモを公開します。
よくある質問
CVE-2026-125742 は現実の攻撃で悪用されていますか?
悪用は確認されていません。CVE レコード、VulnCheck のアドバイザリ、研究者の分析は動作する概念実証を説明しており、攻撃ではありません。この CVE は 2026 年 11 月 10 日時点で CISA の Known Exploited Vulnerabilities カタログにありません。
公開されたエクスプロイトはありますか?
はい。公開された技術分析がチェーン全体を説明し、デモ動画を含みます。エクスプロイト コードのリポジトリはリンクしていません。CVE レコードはこの分析をエクスプロイト参照としてタグ付けし、分析は測定された成功率を報告しています。
この欠陥は Windows、Linux、macOS の 7-Zip に影響しますか?
脆弱なデコーダは共有ソース コードです。公開デモは Linux x86-64 で動作し、分析はオフセットを 7-Zip、glibc、ヒープ レイアウトごとに調整する必要があると述べています。Windows は別の C ランタイムを使うため、glibc の正確なチェーンは移行しませんが、デコーダの境界外書き込みは存在します。すべてのプラットフォームを更新してください。
アーカイブを開くだけでトリガーされますか、それとも展開時だけですか?
実証されたトリガーは展開です。デコーダは展開ファイルを書き込みながら継続ボリュームを処理します。アーカイブの一覧表示は別の経路で、トリガーとしては実証されていません。
7-Zip 26.06 は安全ですか?
この CVE については安全です。26.06 には修正コミットが含まれ、CVE レコードが修正版として示すバージョンです。同梱コピーは別に確認してください。独自の 7-Zip コードを同梱するアプリケーションは、26.06 をインストールしても更新されません。
すぐに更新できない場合はどうすればよいですか?
信頼できないソースのマルチボリューム CAB を展開せず、メールゲートウェイでブロックしてください。どうしても確認する場合は、権限のないユーザーで使い捨ての仮想マシンまたはコンテナを使用します。これらの対策は露出を減らしますが、デコーダを修正しません。
参考資料
- CVE-2026-125742 レコード、CNA は VulnCheck、2026 年 11 月 10 日公開、CVSS v4.0 8.5 と v3.1 7.8 のベクトル、CWE-787、26.06 より前の影響範囲: https://www.cve.org/CVERecord?id=CVE-2026-125742 (2026 年 11 月 10 日確認)
- VulnCheck アドバイザリ「7-Zip before 26.06 Heap Out-of-Bounds Write via LZX Decoder in CAB Extraction」、2026 年 11 月 10 日、Nanyang Technological University の Nguyễn Trần Thanh Lâm へのクレジット: https://www.vulncheck.com/advisories/7-zip-before-26.06-heap-out-of-bounds-write-via-lzx-decoder-in-cab-extraction (2026 年 11 月 10 日確認)
- 7-Zip のコミット
d3296e39e1f1f92c7b41c0c3848e65640428d42d、Set_DictBits_and_Alloc()で_posと_overDictをリセットする修正: https://github.com/ip7z/7zip/commit/d3296e39e1f1f92c7b41c0c3848e65640428d42d (2026 年 11 月 10 日確認) - 7-Zip 26.06 リリース、ベンダー表記は 2026 年 11 月 6 日(GitHub のリリース オブジェクトは 11 月 7 日作成): https://github.com/ip7z/7zip/releases/tag/26.06 (2026 年 11 月 10 日確認)
- 脆弱な
Code_WithExceedReadWrite()とSet_DictBits_and_Alloc()(タグ 26.05 のCPP/7zip/Compress/LzxDecoder.cpp): https://github.com/ip7z/7zip/blob/26.05/CPP/7zip/Compress/LzxDecoder.cpp#L1444-L1513 (2026 年 11 月 10 日確認) - Nguyễn Trần Thanh Lâm「7-Zip Cabinet Window Desync: From Heap OOB Write to Remote Code Execution」、2026 年 11 月 10 日、根本原因分析、エクスプロイト チェーン、測定された成功率: https://potion-brew.pages.dev/posts/7zip-cab-lzx-window-desync-rce (2026 年 11 月 10 日確認)
- Chocolatey の 7zip コミュニティ パッケージ ページ、総ダウンロード 35,677,761、バージョン 26.6.0 のダウンロード 6,087、2026 年 11 月 10 日確認: https://community.chocolatey.org/packages/7zip (2026 年 11 月 10 日確認)
- CISA の Known Exploited Vulnerabilities カタログ JSON フィード、2026 年 11 月 10 日時点で CVE-2026-125742 は該当なし: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json (2026 年 11 月 10 日確認)