🔴 【深度分析】严重安全漏洞:CVE-2026-45034

CVSS 评分: 严重(9.2)🔴  状态: Deferred  发布时间: 2026-06-22


🔍 技术细节速览

字段 值
CVE ID CVE-2026-45034
CVSS 评分 9.2 🔴
严重程度 严重
CVSS 向量 CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X
CWE 分类 CWE-502
发布时间 2026-06-22
状态 Deferred

好的,作为一名资深网络安全分析师,我将基于您提供的NVD漏洞数据,对CVE-2026-45034进行深度分析。

漏洞概述

CVE-2026-45034 是一个存在于 PHPOffice/PhpSpreadsheet 库中的严重反序列化漏洞。该漏洞源于对之前一个类似漏洞(CVE-2026-34084)的修复不完整。攻击者可以通过构造一个包含特制 phar:// 流包装器的文件路径,绕过开发者添加的安全检查,从而在特定条件下实现远程代码执行(RCE)。该漏洞的CVSS 4.0评分为9.2(严重),表明其具有极高的危害性。

受影响组件与版本

  • 受影响组件: PHPOffice/PhpSpreadsheet
  • 受影响版本: 所有低于 1.30.5 的版本
  • 不受影响版本: 1.30.5 及以上版本

漏洞原理分析

该漏洞的核心问题在于对用户提供的文件路径进行安全检查时存在逻辑缺陷,导致 phar:// 流包装器绕过检测。

  1. 不完整的修复:为了防御通过 phar:// 等流包装器触发的反序列化攻击,开发者引入了 File::prohibitWrappers 辅助函数。该函数使用 parse_url($filename, PHP_URL_SCHEME) 来提取URL的协议部分(scheme),并检查提取到的字符串长度是否大于1,以此来判断是否包含 phar://、php:// 等包装器。

  2. 绕过逻辑:攻击者可以构造一个形如 phar:///path/to/file.phar/inner 的文件路径。关键在于,当URL的scheme后面紧跟三个或更多斜杠(///)时,PHP的 parse_url() 函数会返回 false,而不是返回 phar 这个scheme字符串。

  3. 绕过效果:由于 parse_url() 返回了 false,is_string($scheme) 条件判断失败,File::prohibitWrappers 函数会直接返回,不会抛出异常。然而,PHP底层的文件流处理机制(stream layer)仍然能够正确识别并处理 phar:///... 这种格式,将其视为一个合法的 phar 流包装器并打开对应的phar文件。

  4. 攻击链:

    • PHP 7.x 环境:当 IOFactory::load($attackerPath) 被调用时,程序会尝试通过 is_file() 等函数检查文件是否存在。在PHP 7.x中,仅仅是访问一个 phar:// 流包装器,就会触发PHP自动反序列化phar文件中的元数据(metadata)。如果攻击者精心构造了phar文件的元数据,其中包含一个具有 __wakeup() 或 __destruct() 魔术方法的对象,那么这些方法会在反序列化时被自动调用,从而直接导致远程代码执行(RCE)。
    • PHP 8.x 环境:从PHP 8.0开始,对于普通的文件操作(如 is_file()、file_exists()),自动反序列化phar元数据的行为已被移除。因此,在PHP 8.x上,该漏洞的攻击链被削弱。攻击者通过 phar:// 包装器最多只能实现文件读取(read primitive)。只有当下游的应用程序代码显式调用了 Phar::getMetadata() 方法来获取并处理phar文件的元数据时,才可能重新触发反序列化,进而实现RCE。

影响评估

  • 危害等级: 严重(CVSS 9.2)
  • 攻击向量: 网络远程攻击(AV:N)
  • 攻击复杂度: 低(AC:L),攻击者只需构造一个特制的文件路径。
  • 所需权限: 无(PR:N),攻击者无需任何身份验证。
  • 用户交互: 无(UI:N),攻击过程无需用户参与。
  • 影响范围:
    • 机密性: 高(VC:H),可能导致敏感信息泄露。
    • 完整性: 高(VI:H),攻击者可篡改数据或系统文件。
    • 可用性: 高(VA:H),可能导致服务中断或完全控制服务器。
  • 利用条件:
    • 应用程序使用 PhpSpreadsheet 库,并且允许用户控制传递给 IOFactory::load() 等方法的文件路径。
    • 在PHP 7.x环境下,利用条件非常宽松,仅需访问路径即可触发RCE。
    • 在PHP 8.x环境下,需要下游代码显式调用 Phar::getMetadata() 才能实现RCE,利用条件相对苛刻,但文件读取漏洞本身也具有较高风险。

修复建议

  1. 立即升级:最直接有效的修复方法是将 PhpSpreadsheet 库升级到 1.30.5 或更高版本。该版本已彻底修复了 parse_url() 的绕过问题。

  2. 临时缓解措施(如无法立即升级):

    • 输入验证:对所有用户提供的文件路径进行严格的输入验证和清理。拒绝任何包含 :// 模式或 phar、php、data、expect 等关键字的路径。
    • 禁用phar流包装器:在 php.ini 配置文件中,将 phar 流包装器加入禁用列表:stream_wrapper_unregister('phar')。请注意,这可能会影响应用程序中其他依赖phar功能的正常使用。
    • 升级PHP版本:如果可能,将PHP环境升级到8.x或更高版本。虽然不能完全消除风险,但可以显著提高攻击门槛,将RCE降级为文件读取。

参考资料