Polyfill 供应链攻击将恶意软件嵌入 JavaScript CDN 资产中

2025-05-28

Polyfill 供应链攻击将恶意软件嵌入 JavaScript CDN 资产中

2024 年 6 月 25 日,Sansec 安全研究和恶意软件团队宣布,一个流行的 JavaScript polyfill 项目已被一个被确认为来自中国的公司的外国行为者接管,该行为者将恶意代码嵌入从其 CDN 源获取的 JavaScript 资产中:cdn.polyfill.io。Sansec 声称,这次 polyfill 攻击影响了超过 100,000 个网站,其中包括 Intuit 等上市公司。

恶意 polyfill 库发生了什么?

Andrew Betts 是polyfill web service的原作者。该项目允许根据网站的用户代理或其他属性自动将 JavaScript polyfill 库注入网站。Andrews早在二月份就曾发表声明,警告称他们不会参与官方cdn.polyfill.io网站的开发。

我们不知道 npm 上是否有任何特定的 polyfill 库属于此特定恶意行为者活动的一部分,目的是注入恶意代码。话虽如此,不同软件生态系统中的库(例如 Magento 项目等内容管理系统)可能包含引入来自 的 JavaScript 代码的静态脚本导入的代码cdn.polyfill.io。特别是,我们pdoc在 PyPI 注册表中检测到了 CVE-2024-38526,这是该库的安全报告,该注册表为 Python 项目提供 API 文档。在使用命令生成文档的情况下,pdoc --math将包含来自 的 JavaScript 文件的链接polyfill.io。该库的这种行为pdoc已在 pdoc 版本 14.5.1 中修复,我们敦促用户尽快升级。

什么是 JavaScript polyfill?

JavaScript Polyfill 通常是一段专门构建的代码,用于在原生不支持现代功能的旧版浏览器上提供现代功能。从历史上看,polyfill 对于希望创建跨不同浏览器版本无缝运行的应用程序的 Web 开发者来说至关重要。它们充当桥梁,使旧版浏览器能够运行较新的 JavaScript 功能,从而确保无论浏览器的版本或功能如何,都能提供一致的用户体验。

在 Web 开发的早期阶段,浏览器的演进速度参差不齐,导致开发环境碎片化,相同的代码可能无法在所有平台上统一运行。一般来说,浏览器 API 的支持情况也参差不齐。由于无法控制最终用户可用的浏览器版本,开发者无法保证 JavaScript 代码在浏览器中执行时可用的 API 是相同的。因此,polyfill 应运而生,它引入了 polyfill 库,解决了这个问题,使开发者能够编写现代 JavaScript 代码,而无需担心兼容性问题。例如,像Array.prototype.includes和 这样的方法Promise在 Internet Explorer 等老版本浏览器中不受支持。尽管如此,开发者可以通过在浏览器中加载 polyfill 库来使用这些功能。

JavaScript CDN 在 polyfill 库中的作用

内容分发网络 (CDN) 是一个由全球部署和分布的服务器组成的系统,可根据用户的地理位置向其分发 Web 内容。在 JavaScript polyfill 库的环境中,CDN 通过在全球范围内高效地托管和提供这些库发挥着至关重要的作用。通过利用 CDN,开发者可以确保他们的 polyfill 快速可靠地分发给用户,从而最大限度地减少延迟并缩短加载时间。使用 CDN 还有助于开发者避免捆绑 JavaScript 库。

您可能会遇到的 CDN 一般用例是使用基于云的指标和应用程序性能,例如 Google Analytics(谷歌分析),它正式建议您将以下代码添加到您的网站:






{
 "vars" : {
 "gtag\_id": "<GA\_MEASUREMENT\_ID>",
 "config" : {
 "<GA\_MEASUREMENT\_ID>": { "groups": "default" }
 }
 }
}




Enter fullscreen mode Exit fullscreen mode

在此次恶意 polyfill 接管事件中,cdn.polyfill.io我们利用了一个广泛使用的 CDN,它根据传入请求的 HTTP 标头动态提供 polyfill。这意味着系统会根据用户的浏览器和版本提供相应的 polyfill,从而确保最佳兼容性。

CDN 上托管的 polyfill 的安全风险

使用托管在 CDN 上的 polyfill 会带来严重的安全风险,主要是因为在应用程序上下文中可能会执行任意 JavaScript 代码。这种风险通常被报告为特定 Web 应用程序的跨站脚本 (XSS) 漏洞。

当从 CDN 获取 polyfill 库时,应用程序依赖于外部服务器的完整性和安全性。CDN 源本身也是如此。如果 CDN 或托管库遭到入侵,例如最近针对 的攻击cdn.polyfill.io,新入侵的代码就会被注入并在用户浏览器中执行。此类恶意代码可以执行各种恶意活动,例如将用户重定向到钓鱼网站、窃取敏感信息,甚至进一步传播恶意软件。就浏览器安全而言,此类 XSS 漏洞的后果最为严重。

Snyk 如何检测 CDN 上存在漏洞的 JavaScript 库?

除了检测项目清单和项目依赖项中的不安全代码和易受攻击的第三方库之外,Snyk VS Code 扩展还支持检测使用静态脚本导入语句导入的易受攻击的库。

例如,如果lodash从 CDN 导入的库使用易受攻击的版本范围或已知包含恶意代码,Snyk 将附加内联注释以引起开发人员对安全风险的注意。

防范 CDN 供应链攻击

最近针对 JavaScript polyfill 项目的攻击凸显了在整个 Web 生态系统中支持资源的重要性,而 CDN 正是其中的重要组成部分。供应链安全问题通常围绕着 PyPI 和 npm 等开源软件包注册中心,但 JavaScript polyfill 攻击提醒我们,CDN 也是 Web 的重要组成部分。

以下是您应该考虑的一些最佳做法,以帮助防止此类攻击:

  • 使用值得信赖的 CDN:仅使用来自信誉良好的提供商的 CDN。例如,Cloudflare 以其强大的安全措施和可靠性而闻名。
  • 监控依赖项:定期审核和监控所有第三方脚本和依赖项。
  • 子资源完整性:子资源完整性 (SRI) 等工具可以帮助确保 CDN 传送的内容未被篡改,并且可以固定到经过审核且已知没有恶意或其他不良行为的预期版本/哈希。
  • 内容安全策略 (CSP):实施强大的 CSP 来限制脚本的加载来源。这可以防止恶意脚本的执行。由于 polyfill 通常包含在应用程序加载的关键路径中,它们以与页面上任何其他 JavaScript 相同的权限运行,这使得它们成为攻击者利用这种信任的首要目标。这种风险凸显了使用安全可靠的 CDN、实施内容安全策略 (CSP) 等强大的安全措施以及定期审核第三方依赖项以防范此类漏洞的重要性。
  • 定期更新:确保所有库和依赖项保持最新。许多攻击利用的是已知漏洞,而这些漏洞已在后续版本中得到修补。
  • 替代解决方案:评估你的项目是否仍然需要 polyfill。随着浏览器的现代化,polyfill 提供的许多功能现在都已原生支持。强烈建议将依赖项与你自己的项目资源一起提供,而不是依赖 CDN 等第三方提供商。
文章来源:https://dev.to/snyk/polyfill-supply-chain-attack-embeds-malware-in-javascript-cdn-assets-55d6
PREV
使用 async/await 更好地处理错误
NEXT
Django网站模板