flawopen.com/Incidents/polyfill-io-supply-chain-incident-june-2024
Polyfill.io サプライチェーン攻撃(2024年)
2024年の事案でpolyfill.ioが一部訪問者を転送。CDN参照を削除してください。本件にCVEは割り当てられていません。
レストランが外部業者の飲料ボトルを各テーブルに置いているとします。客は店を信頼しているため、そのまま飲みます。業者が中身をひそかに変えれば、店がメニューを変えなくても客に影響します。客に届くものを外部業者に任せたことが、信頼の境界になっています。
主要な概念と専門用語
Dynamic User-Agent Polyfilling- クライアントのブラウザのヘッダーに応じて異なる JavaScript を配信するため、サブリソース完全性(SRI)のハッシュが使えなくなる仕組みです。
Conditional Payload Evasion- HTTP Referer、画面サイズ、user-agent、開発者ツールの有無を調べ、開発者にはきれいなスクリプトを返しつつ実際のモバイル利用者を攻撃する手口です。
Domain Ownership Transfer Risk- 買収されたり、期限切れになったり、同意なく譲渡されたりし得るドメインからサードパーティのスクリプトを読み込むこと自体に伴う危険です。
Subresource Integrity (SRI)- スクリプトを実行する前に、その暗号学的ハッシュを検証するブラウザの仕組みです。
フレームワーク対応
- このガイドで説明する弱点の CWE 参照: CWE-829
インシデントのタイムライン
SansecはドメインとGitHubアカウントの譲渡を報告し、Fastlyは予防策として代替手段を提示しました。
Sansecは分析を公開し、自社測定に基づき10万超のサイトへの露出を推定しました。
Cloudflareはミラーへの自動書き換えを発表し、その後ドメインは停止されました。一時的な書き換えに頼らず古い参照を削除してください。
ステップ・バイ・ステップの攻撃フロー
管理者の変更
Sansecは、polyfill.ioドメインとGitHubアカウントが2024年2月に譲渡されたと報告しました。Fastlyは悪意ある応答の報告前に予防策として代替手段を提示しました。 Fastly は後に、Sansec のレポート公開時に初めて攻撃を知ったと説明しました。2月の代替手段の提供は予防措置であり、当時すでに悪意ある活動を把握していたことを示すものではありません。
サイトがCDNを読み込む
cdn.polyfill.ioを参照するページでは、ブラウザーが返されたJavaScriptを取得し、そのページのコンテキストで実行します。
条件付きリダイレクトの観測
Sansecが調査したサンプルは条件に応じて一部のモバイル訪問者をリダイレクトしました。これはサンプルの挙動であり、CDNのすべての応答を示すものではありません。
緩和策と対応
Cloudflareは自社ミラーへの書き換えを導入し、Fastlyは別の代替手段を提供しました。Sansecが報告したのは一部ECサイトのGoogle Ads広告不承認であり、自然検索全体のペナルティではありません。
ソースコード比較:脆弱 vs 堅牢化
<!-- 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を依存関係の管理権確認の代わりにしない。バイト列が固定され、ハッシュを検証できる場合にのみ使う。