CVE-2025-8291CVE-2025-8291是Python标准库中zipfile模块存在的一个安全漏洞,该漏洞源于zipfile模块在解析ZIP64格式压缩文件时,未对ZIP64 End of Central Directory (EOCD) Locator记录中的偏移量(offset)字段进行有效性验证。根据ZIP64规范,ZIP64 EOCD Locator记录中包含一个偏移值,用于定位ZIP64 EOCD记录在文件中的实际位置。然而,Python的zipfile模块在实现中并未使用该偏移值来查找ZIP64 EOCD记录,而是简单地假设ZIP64 EOCD记录就是ZIP64 EOCD Locator记录的前一条记录。这一设计缺陷可以被恶意攻击者利用,构造出特殊的ZIP压缩文件,使得Python的zipfile模块与其他标准的ZIP实现(如系统解压工具、其他编程语言的ZIP库等)在解析同一文件时产生不同的结果。这种解析差异可能导致安全检查绕过、文件内容混淆或安全策略规避等问题。该漏洞由Python官方安全团队通过[email protected]披露,CVSS评分为4.3分,属于中危级别。攻击者需要通过网络投递恶意ZIP文件,并需要用户交互(如打开或解压文件)才能触发漏洞,对机密性影响较低,但可能导致完整性破坏。
从技术层面分析,ZIP文件格式中,当压缩文件大小超过4GB或包含超过65535个条目时,会使用ZIP64扩展格式。ZIP64格式在标准EOCD记录之后,会附加一个ZIP64 EOCD Locator记录,该记录的结构包含:
- 签名(Signature): 0x07064B50
- ZIP64 EOCD磁盘号(Disk Number)
- ZIP64 EOCD起始磁盘偏移(Offset to ZIP64 EOCD Record)
- 总磁盘数(Total Number of Disks)
按照ZIP规范,解析器应当使用ZIP64 EOCD Locator记录中的偏移值来定位ZIP64 EOCD记录的实际位置。然而,Python的zipfile模块在实现中直接假设ZIP64 EOCD记录紧邻ZIP64 EOCD Locator记录之前(即偏移量固定为locator_offset - sizeof(ZIP64_EOCD_record)),完全忽略了Locator记录中的偏移字段。
这种实现方式使得攻击者可以:
1. 创建一个包含多个ZIP64 EOCD记录的恶意ZIP文件
2. 将ZIP64 EOCD Locator记录的偏移值设置为指向一个伪造的ZIP64 EOCD记录
3. Python的zipfile模块会忽略该偏移值,使用其假设的位置读取ZIP64 EOCD
4. 其他遵循规范的ZIP实现会使用正确的偏移值,读取到不同的EOCD记录
5. 两者的解析结果不同,可能导致安全检查绕过
该漏洞的修复方案是保持原有的解析行为(即假设ZIP64 EOCD在Locator之前),但增加对Locator记录中偏移值的验证,确保其与期望值一致。