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が報告したのは一部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>

エンジニアリング&システム堅牢化チェックリスト

参考資料