7-Zip XZ 解压漏洞:从堆溢出风险到企业应急处置

2026-07-22 32 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:9 分钟

根据公开披露,CVE-2026-14266 是一个影响 7-Zip 处理 XZ 分块数据流程的远程代码执行漏洞。攻击者可以构造特殊的 XZ 压缩数据,在受害者打开或解压恶意压缩包时触发堆缓冲区溢出,并以当前用户权限执行代码。

这类漏洞的危险之处不只在于“解压即触发”,还在于压缩包是邮件附件、即时通信文件和软件发布包中的常见载体。安全团队需要同时处理版本确认、入口收敛、终端排查和更新验证,而不能只提醒用户“不要打开陌生文件”。

漏洞链条发生在哪里

从披露信息看,问题位于 7-Zip 解析 XZ 分块数据的流程。程序需要根据压缩流中的元数据分配内存、计算偏移并复制解压后的数据;精心构造的输入可以破坏这些边界条件,最终造成堆缓冲区溢出。

一次典型攻击可以沿着下面的路径发生:

  1. 攻击者制作包含异常 XZ 数据的压缩包。
  2. 压缩包通过邮件、网盘、聊天工具或供应链下载进入终端。
  3. 用户使用受影响的 7-Zip 版本打开、预览或解压文件。
  4. 解析过程触发内存破坏,攻击代码随 7-Zip 进程执行。
  5. 恶意代码继承当前用户权限,访问该用户可读取的数据和网络资源。

“以当前用户身份执行”并不等于风险较低。开发人员的终端上往往保存源码仓库凭据、云平台令牌、SSH 私钥和浏览器会话;如果用户拥有本地管理员权限,攻击面还会进一步扩大。权限最小化可以限制损失,但不能代替补丁。

先确认暴露面,不要只检查安装列表

7-Zip 既可能通过安装程序部署,也可能以便携版形式存在于工具目录、构建节点或用户下载目录中。因此,仅检查 Windows 的“已安装应用”容易漏掉实际被调用的 7z.exe

可以这样实践:在 Windows PowerShell 中运行下面的清点脚本。它搜索常见安装目录,并输出文件版本和数字签名状态。若组织把工具放在其他盘符或软件分发目录,需要把对应路径加入 $roots

$roots = @(
    "$env:ProgramFiles\7-Zip",
    "${env:ProgramFiles(x86)}\7-Zip",
    "$env:LOCALAPPDATA\Programs",
    "$env:USERPROFILE\Downloads"
) | Where-Object { $_ -and (Test-Path $_) }

$results = foreach ($root in $roots) {
    Get-ChildItem -Path $root -Filter '7z.exe' -File -Recurse -ErrorAction SilentlyContinue |
        ForEach-Object {
            $signature = Get-AuthenticodeSignature -FilePath $_.FullName
            [PSCustomObject]@{
                Path      = $_.FullName
                Version   = $_.VersionInfo.FileVersion
                Signature = $signature.Status
                Modified  = $_.LastWriteTimeUtc
            }
        }
}

$results |
    Sort-Object Path -Unique |
    Format-Table -AutoSize

这段脚本只负责发现文件,不能判断某个版本是否已经修复。由于摘要没有给出受影响版本范围和修复版本,实际处置时应把结果与 7-Zip 官方公告、供应商补丁说明及组织的软件资产清单进行核对,不要根据文件日期猜测安全状态。

还应检查以下位置:

  • PATH 环境变量中实际命中的 7z.exe
  • CI/CD Runner、构建服务器和制品处理节点。
  • 文件管理器右键菜单及其他调用 7-Zip 的集成程序。
  • 随开发工具、备份软件或运维脚本打包分发的私有副本。

可用以下命令确认命令行默认调用的是哪个副本:

Get-Command 7z.exe -All -ErrorAction SilentlyContinue |
    Select-Object Name, Source, Version

补丁落地前如何降低触发概率

最稳妥的措施是安装供应商确认包含修复的版本,并删除旧版和便携版副本。在补丁尚未完成验证或分发时,可以先收紧入口:暂停用 7-Zip 处理来源不明的 XZ、TXZ 及嵌套压缩包,在邮件网关隔离相关附件,并把高风险解压工作转移到无生产凭据、无共享目录、网络受限的沙箱或临时虚拟机。

下面的 PowerShell 示例可以对下载的压缩包执行哈希留档和 Microsoft Defender 自定义扫描,再将其移动到独立审查目录。运行前把 -Archive 改为待检查文件;这只是接收流程的一道门槛,杀毒扫描不能证明压缩包安全,也不会修复 7-Zip 漏洞。

param(
    [Parameter(Mandatory = $true)]
    [string]$Archive
)

$source = (Resolve-Path -LiteralPath $Archive).Path
$reviewRoot = Join-Path $env:USERPROFILE 'ArchiveReview'
New-Item -ItemType Directory -Path $reviewRoot -Force | Out-Null

$hash = Get-FileHash -LiteralPath $source -Algorithm SHA256
Start-MpScan -ScanType CustomScan -ScanPath $source

$destination = Join-Path $reviewRoot ([IO.Path]::GetFileName($source))
Move-Item -LiteralPath $source -Destination $destination -Force

[PSCustomObject]@{
    File       = $destination
    SHA256     = $hash.Hash
    ScannedAt  = (Get-Date).ToUniversalTime().ToString('o')
    NextAction = 'Only inspect in an isolated environment with a verified patched extractor.'
} | Format-List

不要把“换一个解压命令”直接当作缓解措施。如果另一个工具复用了相同组件,或者自动调用系统中的 7-Zip,风险仍然存在。隔离环境也必须关闭宿主目录映射、剪贴板共享和敏感凭据挂载,否则恶意代码仍可能越过预期边界窃取数据。

更新后的验证清单

完成升级后,建议按以下项目闭环:

  • 从官方或组织批准的软件源获取更新,并验证签名或发布方提供的校验值。
  • 重新运行资产清点,确认旧版本、便携版和构建镜像中的副本均已移除。
  • 检查文件关联、右键菜单和自动化脚本是否仍指向旧路径。
  • 在 EDR 中检索 7-Zip 拉起 PowerShell、命令解释器、脚本宿主或陌生可执行文件的异常进程链。
  • 排查近期处理过的 XZ、TXZ 和来源不明压缩包,结合邮件、下载和终端日志确定影响范围。
  • 降低日常账户权限,避免在保存生产令牌或管理员凭据的会话中处理外部压缩包。

这起漏洞提醒团队,压缩工具并不是单纯的桌面辅助软件,而是直接解析不可信二进制输入的攻击面。真正有效的处置应覆盖补丁、资产发现、文件入口、终端检测和权限控制;只升级一台常用电脑,无法解决散落在构建机、脚本目录和便携工具包中的旧副本。


相关推荐