Urban VPN Proxy: бесплатный, но какой ценой?
Разобрали на настоящем примере, как обычное браузерное расширение может перехватывать трафик и данные пользователя
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 и остальные функционируют по одинаковой логике:
- получение конфигурации
- подмена стандартных Web API
- перехват информации
- извлечение нужных значений по заданным путям
- передача данных наружу через 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
});
- чтение SSR-JSON внутри \\<script>
- перехват XHR-запросов
- сбор метаданных видеороликов
- обнаружение видеопотоков .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