GitHub安全实验室的研究员Jaroslav Lobačevski于5月22日发布了关于CVE-2026-48095(GHSL-2026-140)的安全公告:7-Zip的NTFS存档处理模块存在堆缓冲区写入溢出漏洞,该漏洞可被利用来执行任意代码。问题的根源在于GetCuSize()函数存在未定义行为——该函数通过32位左移运算来计算NTFS压缩流缓冲区的大小;当攻击者构造的NTFS镜像将ClusterSizeLog设为28、CompressionUnit设为4时,移位指数会达到32,这在C++中属于未定义行为。在x86和x64架构下,硬件对移位计数的掩码处理使得该表达式的计算结果为1,因此_inBuf仅被分配了1字节的空间。紧接着调用的ReadStream_FALSE函数会将最多256 MB的、由攻击者控制的集群数据写入这个仅1字节大小的缓冲区。调试器分析证实:堆内存中,CInStream流对象的位置距离_inBuf仅304字节;前64 KB的数据写入操作会覆盖其虚函数表指针,后续调用则会通过被破坏的虚函数表执行指令——这就是典型的虚函数表劫持手法,可最终实现代码执行。该漏洞的CVSS 3.1评分为8.8分(高危):无需身份验证、无需任何权限,仅需用户打开文件这一次交互即可触发攻击。
一个值得注意的攻击面细节是:7-Zip采用基于签名的回退检测机制,因此只要精心构造的NTFS镜像在偏移量为3的字节处包含8字节的"NTFS "签名,无论文件扩展名是什么都会被交由NTFS处理模块处理。无论是以.7z、.zip、.rar为扩展名的文件,还是没有扩展名的恶意文件,都会触发相同的代码执行路径。所有32位及64位版本的7-Zip直到26.00版均受此漏洞影响;在可用空闲内存不足约16 GB的64位系统中,8 GB大小的_outBuf分配可能失败,此时漏洞仅会导致程序崩溃。Lobačevski于4月24日私下向官方报告了该问题,Igor Pavlov随后在4月27日发布的26.01版中修复了该漏洞。仍在使用26.00版或更早版本的用户应立即更新。