CVE-2007-4559原理及复现
2022年9月21日,Trellix(McAfee Enterprise和FireEye合并之后的新公司)的安全研究人员发现早在2007年就披露的漏洞CVE-2007-4559依然没有被修复(https://mail.python.org/pipermail/python-dev/2007-August/074290.html ),该漏洞影响到Python的tarfile模块,可造成系统文件的任意读取和写入。当时的漏洞被披露后,官方采取的做法是在编译过程中给出警告提示,说明可能存在从未信任的来源中解压文档,之后便关闭了漏洞。
经过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 | …… |
TarInfo类是tar文件包中用于记录文件信息的类,上述代码中的tarinfo.name即是文件名称,_extract_member方法根据传入的文件路径、名称、属性、权限将文件写入系统。另外,extractall方法也调用了extract方法,因此也受到影响。
Trellix研究人员用受影响的软件Spyder呈现了该漏洞的影响,笔者复现了该漏洞:
Spyder右侧操作框的Variable Explorer有一个Import Data功能,可以导入.spydata文件,该文件实际上是tar文件,使用恶意构造的tar包导入虽然可以成功但会报导入错误。因此,需要手动添加一条记录并导出.pickle文件,将该文件和恶意名称的文件名打包为.spydata文件导入。
最终的tar包生成脚本如下:
1 | import tarfile |