Cloudflare已修复其免费开源CDNJS中的一个严重漏洞,该漏洞可能影响互联网上12.7%的网站。
CDNJS为数百万网站提供超过4000个JavaScript和CSS库,这些库公开存储在GitHub上,使其成为第二大JavaScript CDN。
该漏洞利用包括使用GitHub和npm将数据包发布到Cloudflare的CDNJS,以触发路径遍历漏洞,并最终远程执行代码。
如果被利用,该漏洞将导致CDNJS基础设施的完全攻击。
从“ZIP Slip”到远程代码执行
本周,安全研究员RyotaK解释了他如何在研究供应链攻击的同时找到一种方法来完全攻击Cloudflare的CDNJS网络。
CDN的全称是Content Delivery Network,即内容分发网络。其基本思路是尽可能避开互联网上有可能影响数据传输速度和稳定性的瓶颈和环节,使内容传输的更快、更稳定。在维护互联网的安全性、完整性和可用性方面发挥着关键作用,因为绝大多数网站都依赖这些服务来加载流行的JavaScript库和CSS脚本。
CDN可能成为攻击者的目标选择,因为如果受到攻击,攻击会对许多网站、在线商店及其客户产生深远的影响。
在浏览cdnjs.com时,RyotaK注意到对于CDNJS中尚不存在的库,他可以建议通过CDNJS的GitHub存储库添加一个新库。

用户可以请求将包发布到CDNJS的GitHub存储库
在探索了这个GitHub存储库以及共同使CDNJS生态系统工作的相邻存储库之后,RyotaK找到了一种方法来诱使服务器执行任意代码。
特别是,研究人员研究了cdnjs/bot-ansible和cdnjs/tools中存在的脚本,包括一个自动更新脚本,有助于自动检索库更新。
这些脚本会定期使用其开发者在相应npm注册表上发布的较新版本的软件库更新CDNJS服务器。
换句话说,对于发布到CDNJS的GitHub存储库的每个库,其更新版本将从链接的npm注册表下载,并且npm版本也由库开发者维护。
RyotaK想知道,如果他发布到CDNJS的库在对应的npm版本中包含路径遍历漏洞,会发生什么。注意,npm包是以TGZ(.tar.gz)档案的形式发布的,可以很容易地使用隐藏在其中的路径遍历漏洞来制作。
研究人员首先使用GitHub向CDNJS发布了一个名为hey-sven的测试库,然后开始在npm注册表上发布更新版本的“hey-sven”。
在发布到npm的较新的“hey-sven”版本中,最终将由CDNJS的更新机器人处理,研究人员在看起来很奇怪的路径上注入了Bash脚本。
这些不同的路径只不过是隐藏在ZIP/TGZ档案中的路径遍历漏洞,这个概念在2018年以“ZIP Slip”方式爆发了。
2018年6月5日,Snky安全团队公布了一个名为Zip Slip的漏洞。这是一个广泛存在的文件覆盖漏洞,通过这个漏洞,攻击者可以利用一个特制的Zip压缩文件,从路径遍历覆盖任意文件,继而远程命令执行,发起攻击。Zip Slip是以目录遍历的一种形式,通过从存档中提取文件来进行攻击。目录遍历漏洞的前提是攻击者可以访问文件系统中应该驻留的目标文件夹之外的部分文件系统。然后,攻击者可以覆盖可执行文件并远程调用它们,或者等待系统或用户调用它们,从而实现受害者机器上的远程命令执行。此漏洞还可能通过覆盖配置文件或其他敏感资源而造成损害,并且可能会在客户端(用户)机器和服务器上受到攻击。
攻击者主要可以利用保存目录遍历文件名的特制档案文件(例如../../evil.sh)触发Zip Slip漏洞。该漏洞已影响许多存档的格式,包括tar、jar、war、cpio、apk、rar和7z等大量的压缩文件。
目前Zip Slip漏洞已经影响了包括阿里巴巴、Google、Oracle、Eclipse、HP、Amazon、Apache、Pivotal、Linkedin等企业的数千个项目,以及Java、Ruby、.Net、Go等多种语言生态系统,其中Java受到的攻击尤为严重,主要是因为它没有中央仓库提供高级别归档(如Zip)文件处理。缺乏这样的库导致易受攻击的代码片段被手工制作,并在诸如Stack Overflow等开发者社区中共享。

“hey-sven”库的npm 1.0.1和1.0.2版本包含路径遍历漏洞
一旦CDNJS服务器处理了精心制作的“hey-sven”npm档案,这些Bash脚本的内容将在服务器上执行。
但是,研究人员不想意外覆盖现有脚本,因此在概念验证(PoC)测试期间,他首先使用符号链接漏洞读取他即将覆盖的文件的内容。
由于Git在默认情况下支持符号链接,所以可以通过在Git存储库中添加符号链接来从cdnjs库更新服务器中读取任意文件。如果定期执行的脚本文件被覆盖执行任意命令,自动更新功能可能会被攻击,所以研究人员决定先检查任意文件读取。
一旦攻击者精心制作的PoC击中服务器,RyotaK就能够意外地将敏感机密(例如GITHUB_REPO_API_KEY和WORKERS_KV_API_TOKEN)转储到CDN提供的脚本中,网址为https://cdnjs.cloudflare.com/...

初始符号链接PoC的输出为研究人员提供了密钥
GITHUB_REPO_API_KEY是一个授予写作权限的API密钥,使攻击者能够修改CDNJS上的任何库甚至篡改cdnjs.com网站本身。
另一方面,WORKERS_KV_API_TOKEN秘密可用于篡改存在于Cloudflare Workers缓存中的库。
通过组合这些权限,CDNJS的核心部分,例如CDNJS的原始数据、KV缓存,甚至CDNJS网站,都可以完全被篡改。
Cloudflare发布了许多修复程序以修复漏洞
研究人员于2021年4月6日通过HackerOne的漏洞披露计划向Cloudflare报告了此漏洞,并看到Cloudflare的团队在数小时内应用了间歇性修复。
BleepingComputer看到的初始修复旨在解决符号链接漏洞:

Cloudflare的CDNJS(GitHub)应用的初始修复
然而,根据研究人员的说法,由于CDNJS生态系统的复杂性,在接下来的几周内对不同的存储库应用了一系列更具体的修复。
RyotaK与BleepingComputer分享了第一个修复以拒绝Git存储库中的符号链接为中心,但它只修复了部分问题。
修复人员首先试图拒绝符号链接,但注意到机器人当前的设计太危险了。因此他们隔离了最危险的功能。
对于其他功能,修复人员应用了AppArmors。
Application Armor或AppArmor是一种安全功能,它使用预定义的配置文件限制在基于Unix的环境上运行的程序的功能,以便程序不会无意中超出其预期的访问范围。
研究人员还与Cloudflare部署的BleepingComputer共享了一系列修复程序,以保护自动机器人处理更新的库:

Cloudflare对CDNJS进行了多项更改以解决该漏洞
虽然这个漏洞可以在没有任何特殊处理的情况下被利用,但它可能会影响许多网站。鉴于供应链中存在许多漏洞,这些漏洞很容易被利用但影响很大。
正如BleepingComputer先前报道的那样,影响数千家在线商店的Magecart供应链攻击源于对Volusion的CDN基础设施的攻击。
本文翻译自:https://www.bleepingcomputer.com/news/security/critical-cloudflare-cdn-flaw-allowed-compromise-of-12-percent-of-all-sites/
