事件概述
据The Hacker News报道,在Python模块库中,存在一个一个长达15年未修复的安全漏洞,该漏洞可能导致约35万的项目陷入风险之中。这个存在安全风险的模块为tarfile模块,该模块涉及人工智能/机器学习、网络开发、媒体、安全、IT管理等多个领域。
其实早在2007年,该漏洞就已经被安全研究人员披露,并且标记过CVE-2007-4559,但是至今为止并没有获得正式的修复补丁,该漏洞尚未修复,已被无意间添加到全球几十万个开源和闭源项目中,从而可能造成庞大的软件供应链攻击面。
研究人员在分析影响后发现,该漏洞存在于成千上万个开源和闭源软件项目中。GitHub是一个面向开源及私有软件项目的托管平台,在 GitHub 中,对调用tarfile模块的代码文件进行统计,近期发现存在 251669个文件的 Python 代码中包含了 import tarfile”,影响数以万计的项目。
研究人员抽取了257个更有可能含有易受攻击代码的代码存储库,手动检查了其中的175个存储库,看看它们是否受到影响。结果发现,61%的代码存储库易受攻击。对其余存储库运行自动检查后发现,受影响的项目数量增加到了65%,表明这是个广泛的问题。
事件威胁分析
该漏洞是CVE-2007-4559(CVSS评分6.8),位于tarfile模块中。如遭成功利用,该漏洞可导致攻击者通过任意文件写而执行代码。
该漏洞最初披露于2007年8月,只需打开特殊构造的tar文档,即可在目标机器上覆写任意文件。简而言之,攻击者利用tarfile漏洞可上传任意恶意文件,通过路径穿越覆写任意代码,从而导致攻击者控制目标设备。
发现该漏洞的安全研究员 Kasimir Schulz 表示,“该漏洞是位于tarfile模块中extract和extractall 函数中的路径遍历攻击,可导致攻击者通过在TAR文档中的文件名称中增加 ‘../’,extract和extractall 函数的时候覆写任意文件。该漏洞类似于近期披露的位于RARlab 解压缩文件中的漏洞(CVE-2022-30333)。
对该漏洞进行验证分析,首先通过以下脚本生成一个恶意的tar文件。由于MacOS、Windows、Linux文件服务功能对命名的要求,需要使用一下脚本生成恶意tar文件。
以上代码意为创建一个名为”../torjan.php”的tar压缩文件,将恶意文件webshell.php文件调用tar模块进行压缩,在压缩前对恶意文件webshell.php进行重写,将名称重命名为“../torjan.php”,最后生成一个名为data.tar文件。
创建一个新文件checkdemo.py模拟业务系统中业务场景,获取用户上传的tar文件,并进行解压操作,代码如下:
当用户上传该包含恶意文件的data.tar模块时,后台程序调用tar.extractall()模块进行解压,程序运行后发现成功在上层当前运行workspace目录上级目录解压出tarjan.php文件。
对该漏洞进行分析,跟进tar.extractall()函数,调转到extractall函数所在文件。
调用该函数,首先对传入的文件进行基础信息获取,如压缩包内文件内容、文件名称等,在2045行进行预处理操作,拼接解压后的文件路径,此处并未进行任何安全处理,直接拼接程序运行目录(path)以及压缩包内文件的文件名称(tarinfo.name),导致路径拼接结果为“程序执行路径”+“文件名称”,最后的待解压路径为“./workspace/../torjan.php”,在后期文件解压释放的时候导致路径穿越漏洞。同理Python的tarfile模块中的extract函数中的代码也过分信任TarInfo对象中的信息,导致路径穿越漏洞。
解决建议
截止到2022年9月,针对此漏洞的相关 PR 仍然没有被合并修复,所以当前几乎所有正在维护的 Python 版本均受影响。在Python官方没有合并修复方案之前,需要谨慎使用Tarfile,排查当前项目中是否使用Tarfile模块,可手动进行项目全局检索,检索“import tarfile”,或者使用开源工具Creosote进行自动化检测
项目地址如下:https://github.com/advanced-threat-research/Creosote
在Python官方没有合并修复方案之前对于特定情况下必须使用tarfile模块,建议对函数进行加固,增加路径检测策略,确保tarfile模块在执行过程中避免出现路径穿越的漏洞。概念代码如下:
文章评论