Urban VPN Proxy: бесплатный, но какой ценой?
Новости 2026-02-14
Все статьи

Urban VPN Proxy: бесплатный, но какой ценой?

Разобрали на настоящем примере, как обычное браузерное расширение может перехватывать трафик и данные пользователя

vpn безопасность кража данных

Urban VPN Proxy — популярное расширение для браузеров, продвигаемое как «бесплатный VPN без ведения логов». Тем не менее изучение JavaScript-кода, который плагин выполняет прямо внутри открытых пользователем страниц, показывает: реальные возможности сервиса значительно шире, чем простая маршрутизация интернет-трафика через прокси. Реверс-инжиниринг выявил, что расширение фактически содержит универсальную систему сбора и вывода данных, способную работать сразу с несколькими типами информации:

  • трафик WebSocket
  • обращения через fetch и XMLHttpRequest
  • диалоги в AI-сервисах (ChatGPT, Copilot)
  • социальные платформы (Facebook, Instagram, LinkedIn, Pinterest, Reddit, TikTok, Twitter, Twitch)
  • рекламные материалы и видеопотоки

Структура расширения

Организация файлов контент-скриптов Внутри расширения обнаружен набор скриптов:

  • facebook.js
  • frame.js
  • insta.js
  • linkedin.js
  • pinterest.js
  • reddit.js
  • tiktok.js
  • traffic.js
  • twitch.js
  • twitter.js

Главное наблюдение: это не разные программы, а по сути один и тот же код, адаптированный под разные площадки. Отличаются они только:

  • путями конфигурации (PATH_*)
  • регулярными выражениями
  • типами отслеживаемых событий
  • названиями сервисов

То есть архитектура построена по шаблонному принципу.


Общая логика работы

Фактически расширение выглядит как управляемый данными механизм наблюдения, состоящий из нескольких уровней:

  • модуль загрузки конфигурации
  • слой перехвата сетевого трафика
  • специализированные парсеры для конкретных сайтов
  • слой приведения данных к единому формату
  • канал отправки информации наружу

Динамическая конфигурация (bis_data)

Работа всех компонентов завязана на объекте bis_data, который подгружается и сохраняется в sessionStorage

const getConfig = () => {
  const data = sessionStorage.getItem("bis_data");
  return data ? JSON.parse(data) : null;
};

Если конфигурационный объект отсутствует, скрипт либо переходит в режим ожидания его появления, либо полностью останавливает работу.


Содержимое bis_data

Разбор показывает, что в конфигурации хранятся:

  • перечень активированных платформ
  • шаблоны URL-адресов
  • правила, по которым извлекается информация
  • ограничения на количество сообщений
  • переключатели, включающие и отключающие отдельные модули

Иными словами, поведение расширения контролируется удалённо и может меняться без какого-либо обновления через Chrome Web Store.


Единый шаблон platform-скриптов

Скрипты facebook.js, insta.js, linkedin.js, twitter.js, twitch.js и остальные функционируют по одинаковой логике:

  1. получение конфигурации
  2. подмена стандартных Web API
  3. перехват информации
  4. извлечение нужных значений по заданным путям
  5. передача данных наружу через window.postMessage

Универсальный доступ к данным по путям

Во всех модулях применяется одна и та же функция:

const byPath = (obj, path) => {
  let current = obj;
  for (const key of path) {
    if (!current || !current.hasOwnProperty(key)) return null;
    current = current[key];
  }
  return current;
};

Она используется:

  • во всех модулях парсинга
  • при обработке JSON-ответов
  • для потоковых (streaming) данных
  • в запросах GraphQL

Благодаря этому структура извлечения информации может полностью перенастраиваться через конфигурацию — без каких-либо изменений в самом коде расширения.


Слой перехвата трафика (traffic.js, frame.js)

Перехват WebSocket

Расширение подменяет стандартную реализацию WebSocket API

const NativeWebSocket = window.WebSocket;

window.WebSocket = class extends NativeWebSocket {
  send(data) {
    interceptOutgoing(data);
    return super.send(data);
  }
};

Подмена fetch

const nativeFetch = fetch;

fetch = async function(req) {
  if (!urlMatches(req)) {
    return nativeFetch.apply(this, arguments);
  }

  const res = await nativeFetch.apply(this, arguments);
  const clone = res.clone();
  const json = await clone.json();
  analyze(json);
  return res;
};

Подмена XMLHttpRequest

XMLHttpRequest.prototype.open = function() {
  this.method = arguments[0];
  this.url = arguments[1];
};

По сути внутри браузера создаётся полноценная схема «человек-посередине» (MITM).


Нормализация данных

Любая перехваченная информация приводится к стандартной структуре:

function normalizeMessage(text, limit, time, type) {
  return {
    messageType: type,
    messageText: text.trim().slice(0, limit),
    messageLength: text.length,
    creationTime: time
  };
}

Этот механизм применяется для обработки:

  • переписок с AI
  • комментариев
  • описаний к видео
  • рекламных текстов

AI-диалоги (ChatGPT и Copilot)

Copilot

  • перехватывается WebSocket-трафик
  • фиксируются сообщения пользователя
  • сохраняются ответы модели
  • данные привязываются к sessionId
window.postMessage({
  type: "COPILOT_DATA",
  content: {
    chatbotName,
    sessionId,
    messages
  }
});

ChatGPT

  • анализируются потоковые ответы (streaming)
  • ожидаются внутренние события AI-интерфейса
  • собираются сообщения system, user и assistant
window.postMessage({
  type: "CHATGPT_DATA",
  content: conversation
});

Фактически это означает ведение полного журнала всех разговоров пользователя с ИИ.


Социальные сети: единая система обработки

Facebook / Instagram / LinkedIn

Разбор ответов GraphQL Извлечение:

  • videoId
  • videoUrl
  • audioUrl
  • preview
  • userName
  • рекламных метаданных
window.postMessage({
  type: "FACEBOOK_VIDEO_DATA",
  content: videoData
});

Pinterest

  • чтение SSR-JSON внутри \\<script>
  • перехват XHR-запросов
  • сбор метаданных видеороликов

Reddit

  • обнаружение видеопотоков .mpd
  • сбор рекламных исходящих URL
  • анализ правой панели страницы

TikTok

  • перехват API-ответов
  • выявление рекламы
  • сбор информации об авторах
  • изменение ответа сервера:
json.content = content.filter(item => !item.isAd);
return new Response(JSON.stringify(json));

Это уже прямое вмешательство в передаваемые данные.


Twitter / Twitch

По устройству практически повторяют Facebook и TikTok — отличаются только путями и регулярными выражениями. Функции те же: сбор видео, описаний и метаданных стримов.


Exfiltration Layer — общий канал передачи данных

Во всех модулях используется единый способ отправки информации:

window.postMessage({
  posdMessageId: "PANELOS_MESSAGE",
  posdHash: randomId(),
  type,
  from,
  to,
  content,
  dynamicAppId
});

Характерные особенности

  • нет проверки origin
  • не запрашивается согласие пользователя
  • функционирует на любых доменах
  • данные централизованно агрегируются

Почему файлы почти идентичны

Потому что это больше похоже не на обычное расширение, а на встроенный SDK:

  • единое ядро
  • множество конфигураций
  • быстрое расширение на новые платформы

Подключение нового сайта по сути сводится к добавлению JSON-описания в bis_data и копированию шаблонного скрипта.


Итоговая классификация


Заключение

Urban VPN Proxy на практике представляет собой универсальную браузерную систему наблюдения, обладающую следующими функциями:

  • перехват WebSocket, fetch и XHR-запросов
  • фиксация переписок с AI-сервисами
  • разбор данных из социальных сетей
  • сбор рекламной информации
  • активное влияние на сетевой трафик
  • удалённая настройка логики работы

С технической точки зрения продукт можно охарактеризовать как:

  • архитектуру уровня spyware
  • агент сбора рекламной аналитики (ad-intelligence)
  • встроенный в браузер surveillance-SDK


И всё это маскируется под «бесплатный VPN».


IOC

Ниже указаны контрольные суммы (SHA256) файлов:


После таких разборов становится понятно: «бесплатный VPN» нередко оплачивается вашими данными

VPN должен лишь шифровать соединение и не вмешиваться в содержимое страниц, поэтому лучше использовать решения без браузерных расширений — например Luch VPN