摘要:在收录该文之后,知道创宇404安全实验室对该文中所提到的攻击方式进行跟进、整理分析原作者公布的钓鱼数据。这个包却是原文作者上传的恶意程序包。原作者据此进行研究,发现了一个上传限制绕过的方法。同时也感谢全体404实验室的小伙伴在本篇报告完成中的无私帮助。
####one.概述
2017年6月2日,[Paper]()收录了fate0的一篇文章[“Package Phishing”](),描述了作者在PyPI上放置恶意Python包钓鱼的过程。 当用户因各种原因安装这些恶意软件包时,其主机名、Python语言版本、安装时间、用户名等信息都会被发送到攻击者的服务器。 在钓鱼后期,作者将[Github上的相关项目]()中获取相应主机信息的方法改为提示用户安装恶意Python包。
文章被收录后,智创鱼404安全实验室对文章中提到的攻击方式进行了跟踪,对原作者发布的钓鱼数据进行了整理和分析。 值得一提的是,在后续过程中,我们发现了新的钓鱼行为。 文章第4章有相应的介绍。
与传统的钓鱼方式相比,上传恶意Python包且不通过电子邮件、网页等方式传播,导致用户很难有相关的防护意识。 同时,由于Pypi源码的全球性以及Python语言的跨平台性,相关恶意包可以在全球任何操作系统上执行。 由于执行恶意包的人大多是互联网从业者,因此通过Python恶意包进行钓鱼也具有一定的针对性攻击。 在原作者公布的钓鱼数据中,疑似有百度、滴滴、京东等相关互联网公司受到影响。 试想,以这种方式发起全球性的APT攻击,无疑将是一场灾难。
这篇文章我们就来聊聊这个隐藏的攻击面——Python包钓鱼。
####二。 Python包钓鱼简析
######2.1 Python封装钓鱼方法
Python有两个著名的包管理工具,easy_install.py和pip。 这次我们的主角是pip,包管理工具。 在Python语言中,当需要安装第三方库时,可以通过命令pip install package_name快速安装。 我们将安装过程中的相关步骤简化为如下流程图:
![]()
可以看到,通过pip安装恶意smb包时,最终会运行setup.py文件。 由于任何Python开发者都可以将自己的开发包上传到Pypi,当攻击者精心构造上传的包名时,就可以达到钓鱼的目的。
例如,前段时间Samba远程命令执行漏洞的POC中导入了以下包:
从 smb.SMBConnection 导入 SMBConnection
从 smb 导入 smb_structs
从 smb.base 导入 _PendingRequest
从 smb.smb2_structs 导入 *
从 smb.base 导入 *
查询后可知,需要安装pysmb包才能成功执行POC。 然而,许多安全研究人员会根据他们的经验直接执行 pip install smb 。 然而smb包是原文章作者上传的恶意包。 所以当我们执行pip install smb命令时,主机相关的信息就会被发送到攻击者的服务器上。
######2.2 Pypi上传限制绕过
原作者fate0还注意到一个细节。 日常使用中,通常会通过命令 pip install –rrequirements.txt 来安装整个项目的依赖文件。 但它经常被错误地输入为 pip installrequirements.txt。
这意味着requirements.txt对于恶意包来说也是一个好名字。 原作者据此进行研究,找到了绕过上传限制的方法。
中有以下代码片段
![]()
我们可以看到PyPI直接对这些文件名进行硬编码,禁止用户上传同名文件。
当用户使用pip安装Python包时,PyPI在查询数据库时会对文件名进行如下正则处理。
\_将 \_runs\_of\_characters\_标准化为 \_a\_.py
![]()
这意味着相同的软件包将通过以下方式安装
![]()
基于此,我们可以绕过requirements.txt等一系列包被硬编码而无法上传的限制。
PyPI已针对该漏洞正式做出回应:
![]()
截至发稿,该漏洞的官方补丁尚未发布。
####三.钓鱼数据分析
根据fate0公开的钓鱼数据,我们按照关键词国家、语言、套餐、用户名进行数据汇总,得到如下排名:
* 受影响最大的 10 个国家:
![]()
* Python版本分布排名:
![]()
*恶意包命中排名:
![]()
* root权限安装的恶意包排名
![]()
*主机用户排名:
![]()
从上述数据可以看出,美国、中国、印度等国家都受到了此次攻击的影响。 美国受到的影响最为严重,其次是中国、印度等国家。 这也在一定程度上反映了各个国家的互联网发展水平。
从Python版本分布可以看出,绝大多数用户使用的是2.7、3.5、3.6等版本,具体来说,python2占48%,python3占52%。 这也从侧面反映出python3已经开始变得更加流行。
opencv、tkinter等热门软件恶意包命中率最高。 可见,不少用户没有养成安装软件包前检查的良好习惯,最终落入钓鱼陷阱。
同时,绝大多数用户直接以最高权限root运行安装命令。 一旦受到钓鱼攻击,用户隐私和服务器安全将得不到保障。
通过对这批数据的hostname字段进行深入分析,我们发现以下企业、学校、政府可能受到了此次钓鱼事件的影响。 (理论上主机名是可以修改的,以下结果仅供参考)
* 公司、企业、团体等:
![]()
![]()
![]()
* 学校
![]()
* 政府
![]()
* 受影响的中国企业
![]()
* 值得一提的是,以下2017年全球财富500强企业也可能受到此网络钓鱼的影响,具体如下:
![]()
根据主机名字段和用户名字段的信息粗略估计操作系统,我们发现受影响的系统包括:Linux、Mac、Windows、RaspberryPi等,其中以Mac和Linux为主。 显然,Python的跨平台特性决定了这次钓鱼攻击也是跨平台的。
可识别的系统分布如下:
![]()
我们还发现以下 IP 已多次成为攻击目标:
![]()
经过进一步分析,我们发现部分重复IP地址的主机名相同,符合docker主机名特征。 同时操作权限均为root。 我们怀疑这可能是安全研究人员利用docker环境来跟踪分析后续的钓鱼行为。
####四、后续钓鱼事件
在继续跟进Python包钓鱼事件时,有人在PyPI上恶意提交了zoomeye-dev Python安装包。 截图如下:
![]()
根据前面的分析,我们可以很容易找到关键恶意代码的位置:
![]()
可以看到,当用户错误安装zoomeye_dev包时,操作系统名称、主机名、用户名、Python语言版本等都会被收集并发送给指定地址。 同时会返回一个回调地址。 如果回调地址不为空,则从该地址下载文件并执行。 实际测试过程中,回调地址并没有返回具体内容。 如果钓鱼者心怀恶意,而我们以root的最高权限安装了这个恶意包,那么恶意程序就可以畅通无阻地访问我们的电脑了!
目前,该恶意包已被删除。 从恶意包上传到Pypi源到被发现并删除仅用了两个小时。 但我们无法想象非互联网安全公司要花多长时间才能发现自己公司的相关恶意包已上传到Pypi源。 也许,当它最终被发现时,已经造成了巨大的损害。
####五.摘要
包钓鱼巧妙地利用了用户误操作的不可避免性和开源仓库审查不严的特点,利用流行的软件名称来扩大钓鱼的范围。 基于这种想法的攻击往往比普通漏洞危害更大。 比如,在这次网络钓鱼事件中百度重新收录命令,谷歌、亚马逊等互联网巨头也身陷网络钓鱼事件。 他们的安全防护能力无疑是毋庸置疑的百度重新收录命令,但谁能想到问题出在开源仓库上。 开源仓库一旦被污染,后果将是可怕的,比如上面的回调如果真的非空,那么渗透企业内网就不是什么难事了。
仅一次对 Python 开源仓库平台的钓鱼尝试就已经产生了如此广泛的影响。 试想一下,结合Ruby等也面临同样问题的语言,潜在的攻击范围将会再次扩大。 即使公共镜像源平台被攻破,正常的第三方库被恶意包替换,通过镜像源安装程序的主机也会受到影响。
我们可以想象,如果采用其他攻击面,比如针对开源组件的开发者进行攻击,从而控制相关开源组件的代码,在开发者不知情的情况下长期潜伏,最终发起全球性的APT攻击,我们该如何防范呢?
当今世界,各种开源软件和工具无处不在。 当我们享受免费软件提供的便利时,我们是否考虑过它们的安全性?
开源本身极大地推动了信息时代的发展,但如果开源缺乏有效的审查,被不怀好意的人用于作恶,其杀伤力将难以想象。
我们一直在努力让世界变得更安全,但同时用户的安全意识才是重中之重!
####六.参考链接
[1] seebug收录的文章《包钓鱼》
[]()
[2]包钓原文
[]()
[3] Fate0公开钓鱼数据
[]()
[4] 编程语言包管理器中的误植
[]()
[5] cookiecutter-邪恶包
[]()
**致谢:**
感谢fate0在《包钓鱼》一文中从“恶意演员”的角度进行的精彩尝试,以及[]()上披露的钓鱼数据,让我们意识到随意安装Python包的潜在危害。 还要感谢404实验室的所有合作伙伴为本报告的完成提供的无私帮助。 谢谢。