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/