page contents

Python 3.15 tarfile 这5个安全修复救了多少新手?

好消息是,Python 3.15 一口气修了 5 个 CVE,把 tarfile 模块里最容易让新手踩坑的安全问题全给堵上了。今天咱们就来聊聊,这些漏洞到底有多危险,3.15 怎么帮你挡住了它们,以及你以后用 tarfile 解压该注意什么。

attachments-2026-07-FoJA5VFv6a4b068c47240.png

你有没有遇到过这种情况:网上下载了一个 .tar.gz 文件,随手用 Python 的 tarfile 模块解压了,结果程序直接卡死,或者更离谱的——你的硬盘上突然多了几个莫名其妙的文件。

这不是你的代码写错了,是 Python 标准库里藏了好几年的安全漏洞。

好消息是,Python 3.15 一口气修了 5 个 CVE,把 tarfile 模块里最容易让新手踩坑的安全问题全给堵上了。今天咱们就来聊聊,这些漏洞到底有多危险,3.15 怎么帮你挡住了它们,以及你以后用 tarfile 解压该注意什么。

一、tarfile 的5个漏洞:每一个都能让你崩溃

先说最狠的那个。

CVE-2025-8194:恶意压缩包让程序无限循环

这个漏洞的逻辑特别简单:有人构造了一个 tar 文件,里面的偏移量是负数。Python 的 tarfile 模块处理这种负偏移量的时候不会报错,反而会进入一个无限循环。

啥意思?你写了一段解压代码,丢进去一个看起来正常的压缩包,程序直接卡死在那,CPU 占用率飙到 100%,不死不休。

对新手来说,这种情况特别可怕——你根本不知道是压缩包有问题,第一反应肯定是"我的代码写错了",然后花半天时间改代码,最后发现代码没问题,是压缩包有毒。

import tarfile

 

# 这种恶意压缩包会让程序无限循环卡死

with tarfile.open("malicious.tar") as t:

    t.extractall("/tmp/output")  # 程序卡死在这里

再说另外4个。

CVE-2025-4517:符号链接指向你不想被修改的地方

压缩包里有个符号链接,指向 /etc/passwd 或者你的项目目录。你解压的时候,Python 会老老实实地创建这个链接,然后后续操作可能直接修改你系统文件或者项目源码。

CVE-2024-12718:目录替换后的属性修复问题

当一个目录被移除或替换后,extractall() 还会尝试去修复这个已经不存在的目录的权限属性,这就可能出各种诡异问题。

CVE-2025-4330:链接替换时过滤器被绕过

解压的时候如果遇到了链接替换的情况,之前设置的提取过滤器(data_filter)会被重新应用一次。这本来是安全措施,但实现方式有问题,恶意构造的包可能绕过它。

CVE-2025-4435:被拒绝的成员还是被提取了

最离谱的一个:你用过滤器明确拒绝了一些文件的提取,但 Python 还是把它们给解压出来了。过滤器形同虚设。

总结一下:5个漏洞,涵盖无限循环、任意文件写入、权限篡改、过滤器绕过。任何一个都可能让新手栽个大跟头。

二、3.15 怎么修的?关键是 data_filter 变聪明了

Python 3.15 对 tarfile 做了几个关键改动:

第一,data_filter 规范化了符号链接目标

以前 data_filter 对符号链接的检查不够严格,攻击者可以通过路径拼接(比如 ../../etc/passwd)绕过限制。3.15 修复了这个问题,对链接目标做了规范化处理,防止路径穿越攻击。

第二,extractall() 跳过了被移除目录的属性修复

如果一个目录在解压过程中被移除或替换了,extractall() 不会再傻乎乎地去修复它的属性。这个改动直接堵上了 CVE-2024-12718。

第三,链接替换时重新应用提取过滤器

3.15 在替换链接的时候会重新应用 data_filter,确保不会因为链接操作绕过安全检查。同时新增了一个 LinkFallbackError 异常,让你知道哪里出了问题。

第四,不再提取被拒绝的成员

这个改法最直白:过滤器说不提取的文件,那就真的不提取了,不再是"说了不听"的状态。

第五,Windows 上斜杠替换为反斜杠

在 Windows 系统上解压时,tar 文件里的正斜杠路径会被替换为反斜杠。这能防止 Windows 上的路径穿越攻击。

三、新手以后怎么用 tarfile 才安全?

虽然 3.15 修了漏洞,但如果你还在用旧版本(3.13 或 3.14),该注意什么?即使升级到 3.15,也有一些最佳实践值得养成习惯。

1. 永远用 data_filter

从 Python 3.12 开始,tarfile 提供了 data_filter,它会帮你过滤掉危险文件(路径穿越、符号链接指向外部等)。3.15 里这个过滤器更强了,但前提是——你得用它。

import tarfile

 

# 安全用法:加 filter=data_filter

with tarfile.open("package.tar.gz") as t:

    t.extractall("/tmp/output", filter="data")

注意,Python 3.12-3.14 的 extractall() 默认不加过滤器。3.15 开始默认加 data_filter,但如果你没升级,必须手动写 filter="data"。

2. 不解压陌生人发的压缩包

这个道理跟"不打开陌生人发的邮件附件"一样。如果你不确定压缩包的来源,先别急着解压。可以先列出内容看看:

import tarfile

 

# 先看压缩包里有什么,别急着解压

with tarfile.open("unknown_package.tar") as t:

    for member in t.getmembers():

        print(member.name, member.type, member.linkname)

如果看到名字里有 ../ 或者链接指向系统目录,就别解压了。

3. 解压到隔离目录

别往 / 或者项目根目录解压,往一个专门的临时目录解压,比如 /tmp/output。即使出了问题,影响范围也有限。

4. 及时升级到 3.15

3.15 的 tarfile 是目前最安全的版本。5 个 CVE 全修了,过滤器默认开启,符号链接规范化也到位了。如果你还在用 3.13 或 3.14,建议尽快升级。

四、这5个 CVE 说明了什么?

有人可能会问:标准库也有漏洞?不应该是最安全的吗?

实话说,标准库也是人写的,人写的代码就有可能有漏洞。tarfile 这种处理外部输入的模块尤其容易出问题——它要解析别人构造的文件格式,攻击者只要精心构造一个 tar 包就能触发漏洞。

这5个 CVE 给新手的教训很简单:

处理外部输入的代码,永远要加防护

不管是 tarfile、zipfile 还是 json.loads,凡是接受外部数据的地方,都要想想"如果有人故意构造恶意数据会怎样"。过滤器、输入校验、限制操作范围,这些都是基本功。

Python 3.15 在这方面做得比以前好太多了。data_filter 默认开启、路径穿越检查更严格、被拒绝的文件真的不提取了。这些改动可能看起来不大,但对新手来说,少踩一个安全坑就是少花一个下午的调试时间。

所以,下次解压一个下载来的压缩包,记得检查来源、加过滤器、解压到临时目录。这三个习惯养成了,tarfile 的坑再也踩不到你身上。

更多相关技术内容咨询欢迎前往并持续关注好学星城论坛了解详情。

想高效系统的学习Python编程语言,推荐大家关注一个微信公众号:Python编程学习圈。每天分享行业资讯、技术干货供大家阅读,关注即可免费领取整套Python入门到进阶的学习资料以及教程,感兴趣的小伙伴赶紧行动起来吧。

attachments-2022-05-rLS4AIF8628ee5f3b7e12.jpg

 

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
Pack
Pack

2191 篇文章

作家榜 »

  1. 轩辕小不懂 2403 文章
  2. 小柒 2228 文章
  3. Pack 2191 文章
  4. Nen 576 文章
  5. 王昭君 209 文章
  6. 文双 71 文章
  7. 小威 64 文章
  8. Cara 36 文章