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>工程与系统安全加固清单
- ✓切勿 load third-party scripts from public CDNs into production applications without Subresource Integrity (SRI) hashes。
- ✓工程安全防范准则:Vendor all runtime polyfills and libraries directly into your application bundle via npm/yarn/pnpm lockfiles。
- ✓强制执行 a strict Content Security Policy (CSP) with script-src 'self' to prevent unauthorized script injections。
- ✓严格审查 all domain assets periodically to ensure embedded hosts have not lapsed or transferred ownership。
- ✓不要将 SRI 视为依赖控制权审查的替代品;仅在脚本字节稳定且哈希经过验证时使用。