FlawOpen

flawopen.com/Incidents/polyfill-io-supply-chain-incident-june-2024

● Polyfill.io service · CWE-829 · June 2024 · 高危
安全研究 · FlawOpen

Polyfill.io 供应链攻击(2024)

2024 年事件:polyfill.io 曾向部分手机访客提供恶意脚本并触发重定向。移除 CDN 引用,检查页面与浏览器报告;这是第三方服务遭滥用,并未分配 CVE。

💡 通俗易懂的原理解析 (ELI5)

想象一家餐馆在每张桌子上摆放外部供应商的瓶装饮料。顾客通常信任餐馆,因此会直接饮用。如果供应商暗中更换瓶中内容,即使餐馆没有更改菜单,顾客也可能受到影响;问题出在餐馆把对顾客有影响的交付环节交给了外部供应商。

核心概念与专有名词

Dynamic User-Agent Polyfilling
根据客户端浏览器请求头返回定制的 JavaScript 包,因而无法使用子资源完整性(SRI)哈希。
Conditional Payload Evasion
分析 HTTP Referer、屏幕尺寸、user-agent 以及是否打开开发者工具,向开发者返回干净脚本,却攻击真实的移动端用户。
Domain Ownership Transfer Risk
从可能被收购、过期或未经同意转让的域名嵌入第三方脚本所固有的风险。
Subresource Integrity (SRI)
浏览器在执行脚本前校验其加密哈希的机制。

框架映射

  • 本指南所述弱点的 CWE 参考: CWE-829

事件演进时间线

2024 年 2 月

Sansec 报告称域名和 GitHub 账户易主;Fastly 出于预防目的提供了替代方案。

2024 年 6 月 25 日

Sansec 发布分析,并根据自身测量估计超过 10 万个网站可能受到影响。

2024 年 6 月 26–27 日

Cloudflare 宣布自动改写到其镜像站;随后域名被暂停。应移除旧引用,而不是依赖临时改写。

攻击执行流程分解

步骤 1

控制权变更

Sansec 报告称,polyfill.io 域名和 GitHub 账户于 2024 年 2 月易主。Fastly 在恶意响应被报告前出于预防目的提供了替代方案。 Fastly 后来表示,它是在 Sansec 发布报告时才获悉这次攻击;其 2 月提供替代方案是预防措施,并不表明当时已知存在恶意活动。

步骤 2

网站加载 CDN

引用 cdn.polyfill.io 的页面会让浏览器获取返回的 JavaScript,并在该页面上下文中执行。

步骤 3

观察到条件式重定向

Sansec 分析的样本会在特定条件下重定向部分移动访客。这是该样本的行为,并不代表 CDN 的所有响应。

步骤 4

缓解与响应

Cloudflare 将请求改写到其镜像站,Fastly 则提供独立替代方案。Sansec 报告称部分电商网站的 Google Ads 被拒登,并非自然搜索排名受到普遍惩罚。

源代码对比:漏洞与安全实现

存在漏洞的实现
<!-- VULNERABLE: Direct 3rd-party CDN script without integrity verification -->
<!DOCTYPE html>
<html>
<head>
  <title>Production Web App</title>
  <!-- Polyfill CDN serves arbitrary dynamic code controlled by third party -->
  <script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=default,Array.prototype.flat"></script>
</head>
<body>
  <h1>Welcome</h1>
</body>
</html>
加固后的安全修复
<!-- Build this file from a reviewed, version-pinned dependency. -->
<script defer src="/assets/vendor/polyfills.min.js"></script>

工程与系统安全加固清单

参考来源