Python标准库tarfile模块存在任意文件写入高危漏洞,PoC已公开

admin 2025年6月24日23:52:39评论3 views字数 2422阅读8分4秒阅读模式
Python标准库tarfile模块存在任意文件写入高危漏洞,PoC已公开

安全研究人员发现Python标准库中的tarfile模块存在高危漏洞(CVE-2025-4517,CVSS评分9.4)。该漏洞允许攻击者通过特制的tar压缩包实现任意文件写入(Arbitrary File Write),目前概念验证代码(PoC)已在技术社区流传。

Part01

漏洞概述

CVE-2025-4517是Python的tarfile模块中存在的一个严重漏洞,影响Python 3.12及更高版本。该漏洞允许在使用filter="data"参数进行解压时,在解压目录之外执行任意的文件系统写入操作。

当用户使用tarfile模块通过TarFile.extractall()TarFile.extract()方法提取不受信任的tar归档文件,并将filter参数设置为"data""tar"时,会受到影响。

Python标准库tarfile模块存在任意文件写入高危漏洞,PoC已公开
Part02

技术细节

当使用TarFile.extractallTarFile.extract配合filter="data"filter="tar"处理不受信任的tar归档文件时,攻击者可利用此漏洞向文件系统的任意位置写入文件。

该漏洞的根源在于:虽然data过滤器本应通过阻止tar归档内危险目标(如符号链接或设备文件)来提供防护,但其未能有效防范路径遍历攻击。这意味着精心构造的tar归档文件可将文件写入预期解压目录之外。

Python官方已将该漏洞的CVSS v3.1基础评分定为9.4(严重),其向量字符串为CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:L。

Part03

风险关键点

此漏洞对源码分发包安装的影响较小,因为该场景本身允许代码执行。但若通过程序处理来自用户、自动化流程或上传的任意 tar 文件,则存在风险。

假设恶意tar文件包含以下路径:

../../../../etc/passwd

若未正确校验,解压时将覆写/etc/passwd或目标目录外的任意文件。

"data""tar"过滤器本应对输出进行清理,但因此缺陷,其无法阻止包含目录遍历的文件名。

假设存在以下代码:

import tarfilewith tarfile.open('archive.tar''r'as tar:    # filter="data" is the new recommended/safe default, right? (not anymore!)    tar.extractall(path="safe_folder"filter="data")

那么,精心构造的archive.tar可包含 ../../outside.txt类文件,会导致向父目录写入。

通过Python复现漏洞的方式如下:

import tarfilewith tarfile.open('malicious.tar''w'as tar:    import io    info = tarfile.TarInfo("../../outside.txt")    data = b"This should not be here!"    info.size = len(data)    tar.addfile(info, io.BytesIO(data))

通过shell生成复现漏洞的方式如下:

echo "Evil!" > evil.txttar cvf malicious.tar --transform='s/^/../../../../' evil.txt

使用存在漏洞的代码解压时,将在"safe_folder"的三级父目录写入 outside.txt。

Part04

漏洞影响

  • 任意文件系统写入:攻击者可覆写敏感文件(SSH 密钥、系统配置等)
  • 权限提升:若Python脚本以root运行,后果可能是灾难性的。
  • 模式普遍性:这种“解压即忘”模式存在于大量代码库,而 "data" 本应是安全默认值
Part05

缓解措施与解决方案

1、短期解决此问题,可自主验证归档内容或使用强化解压,此方案至少可检测并阻止路径遍历,具体代码如下:

import osimport tarfiledef is_within_directory(directory, target):    abs_directory = os.path.abspath(directory)    abs_target = os.path.abspath(target)    return abs_target.startswith(abs_directory + os.sep)with tarfile.open('archive.tar''r'as tar:    for member in tar.getmembers():        member_path = os.path.join("safe_folder", member.name)        if not is_within_directory("safe_folder", member_path):            raise Exception("Attempted Path Traversal in Tar File")    tar.extractall("safe_folder"filter="data")

2、长期解决方案是升级到已修复该漏洞的Python版本。

参考来源:

Critical Python Tarfile Flaw (CVE-2025-4517, CVSS 9.4): Arbitrary File Write, PoC Available

https://securityonline.info/critical-python-tarfile-flaw-cve-2025-4517-cvss-9-4-arbitrary-file-write-poc-available/

原文始发于微信公众号(FreeBuf):Python标准库tarfile模块存在任意文件写入高危漏洞,PoC已公开

 

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年6月24日23:52:39
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Python标准库tarfile模块存在任意文件写入高危漏洞,PoC已公开https://cn-sec.com/archives/4195595.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息