cdnjs 中允许在 Cloudflare 服务器上执行代码的漏洞

Cloudflare 的 cdnjs 内容交付网络中发现了一个严重漏洞,该漏洞旨在加速 JavaScript 库的交付,允许在 CDN 服务器上执行任意代码。 由于互联网上大约 12.7% 的网站使用该服务下载 JavaScript 库,并且基础设施的受损使得替换任何这些网站提供的库成为可能,这一事实加剧了该问题的危险。

cdnjs 服务从 Git 或 NPM 存储库下载软件包,之后它允许任何站点免费使用 Cloudflare 内容交付网络,以加快 JavaScript 库的加载速度。 在研究 GitHub 上发布的 cdnjs 组件的代码时发现,为了解压 tgz 档案中的 NPM 包,使用了 Go 语言中的标准 archive/tar 模块,该模块按原样生成文件列表,没有路径规范化。 在脚本根据给定列表解压内容的情况下,存档中存在诸如“../../../../../../../tmp/test”之类的文件可以在访问权限允许的范围内,导致覆盖系统中的任意文件。

有人建议攻击者可以申请将其库添加到 cdnjs 中,并上传一个专门设计的存档,其中包含 NPM 存储库路径中带有“../”字符的文件。 在 cdnjs 服务器上,会定期执行“自动更新”操作,在此期间处理程序会下载建议库的新版本并解压内容。 使用路径为“../”的文件,攻击者可以用服务脚本覆盖文件,并在执行解包的服务器上执行其代码。

在从 Git 下载更新的情况下,我们发现下载更新的处理程序在从 Git 复制文件时没有考虑符号链接。 此功能使得通过向 Git 添加符号链接来组织从服务器读取任何文件成为可能。

决定开始实验,演示黑客 cdnjs,通过测试有关文件读取的假设来获得 HackerOne 的奖项。 符号链接 test.js 已添加到通过 CDN 提供的 JavaScript 库的 Git 存储库中,指向 /proc/self/maps 文件。 发布新版本的库后,更新处理程序处理此存储库并在 cdnjs 中发布指定文件(test.js 被创建为符号链接,当请求此文件时,返回 /proc/self/maps 的内容)。

通过替换文件 /proc/self/environ 的符号链接,研究作者注意到给定的数据包含环境变量 GITHUB_REPO_API_KEY 和 WORKERS_KV_API_TOKEN 的值。 第一个变量存储 API 密钥,用于对 GitHub 上的 robocdnjs 存储库进行写访问。 第二个变量将令牌存储到 cdnjs 中的 KV 存储中。 使用收到的信息,攻击者可以对 cdnjs 进行更改并完全破坏基础设施。

来源: opennet.ru

添加评论