flawopen.com/Incidents/polyfill-io-supply-chain-incident-june-2024
Атака Polyfill.io (2024)
Инцидент 2024 года: polyfill.io перенаправлял часть посетителей. Удалите ссылку на CDN; CVE не назначалась.
Представьте ресторан, который ставит на каждый стол бутылку внешнего поставщика. Если поставщик меняет содержимое, это затронет гостей, даже если ресторан не менял меню.
Ключевые понятия и термины
Dynamic User-Agent Polyfilling- Выдача разных наборов JavaScript в зависимости от заголовков браузера клиента, из-за чего хеши Subresource Integrity (SRI) использовать невозможно.
Conditional Payload Evasion- Анализ HTTP Referer, размера экрана, user-agent и наличия devtools, чтобы разработчикам отдавать чистые скрипты, а атаковать реальных мобильных пользователей.
Domain Ownership Transfer Risk- Неустранимый риск встраивания сторонних скриптов с доменов, которые могут быть куплены, просрочены или переданы без вашего согласия.
Subresource Integrity (SRI)- Механизм браузера, проверяющий криптографический хеш скрипта перед его выполнением.
Связи со стандартами
- Ссылка CWE для слабого места, описанного в этом руководстве: CWE-829
Хронология инцидента
Sansec сообщила о смене владельца домена и аккаунта GitHub; Fastly предложила альтернативу в качестве меры предосторожности.
Sansec опубликовала анализ и оценила число затронутых сайтов более чем в 100 тысяч по собственным измерениям.
Cloudflare объявила о переписывании ссылок на своё зеркало; позднее домен приостановили. Удалите старые ссылки, не полагаясь на временное переписывание.
Пошаговый сценарий атаки
Смена владельца
Sansec сообщила, что домен и аккаунт GitHub сменили владельца в феврале 2024 года. Fastly предложила альтернативу в качестве меры предосторожности до сообщений о вредоносных ответах. Позже Fastly сообщила, что узнала об атаке после публикации отчёта Sansec; предложенная в феврале альтернатива была мерой предосторожности и не доказывает, что Fastly тогда знала о вредоносной активности.
Сайт загружает CDN
Ссылка на cdn.polyfill.io заставляет браузер запросить и выполнить полученный JavaScript в контексте страницы.
Наблюдалось условное перенаправление
Исследованный Sansec образец при определённых условиях перенаправлял некоторых мобильных посетителей. Это описание образца, а не всех ответов CDN.
Меры и реакция
Cloudflare настроила переписывание ссылок на своё зеркало, а Fastly предложила отдельную альтернативу. Sansec сообщила об отклонении 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 заменой проверке контроля над зависимостью; применяйте его только при стабильных байтах и проверенном хеше.