Браузерные расширения давно перестали быть чем-то экзотическим. Мы ставим переводчики, блокировщики рекламы, менеджеры паролей, инструменты для заметок — и редко задумываемся о том, что расширение по своей природе имеет куда больше привилегий, чем обычный сайт.
Расширение может:
читать содержимое любой страницы,
отслеживать навигацию,
изменять DOM,
отправлять данные на внешний сервер.
В этой статье разберём расширение Greenwich, которое позиционируется как инструмент для предложения «связанных ссылок» на любой странице. На первый взгляд — социальная функция, что-то вроде коллективных аннотаций. Но при детальном разборе становится понятно: поведение расширения выходит далеко за рамки заявленной функциональности и очень похоже на spyware-модель сбора данных.
Архитектура: всё стандартно — и в этом проблема
Расширение построено по модели Manifest V3:
background.js — service worker
contentScript.js — внедрение в страницы
popup.js — интерфейс отправки «предложений»
внешний backend на
greenwich-for-chrome.replit.app
Самый важный момент — область внедрения.
В манифесте указано:
"content_scripts": [{ "matches": ["<all_urls>"], "run_at": "document_end" }], "host_permissions": ["<all_urls>"]
Это означает буквально следующее:
расширение внедряется на все сайты без исключений;
оно может читать и изменять содержимое любой страницы;
оно может отслеживать действия пользователя везде.
Для функции «добавить связанную ссылку» такие права выглядят чрезмерными. Это не специализированный инструмент для одного домена — это глобальный наблюдатель.
Отслеживание каждой загрузки страницы
В background.js используется chrome.webNavigation.onCommitted:
chrome.webNavigation.onCommitted.addListener(function(details) { if (details.frameId === 0) { chrome.tabs.query({ active: true, currentWindow: true }, function(tabs) { const url = tabs[0].url; fetchPostIts(url); }); } });
Что это означает на практике?
Каждый раз, когда пользователь открывает новую страницу:
расширение перехватывает событие навигации;
получает URL активной вкладки;
отправляет этот URL на внешний сервер.
Фактически это постоянная передача истории посещений.
Даже если сервер «только возвращает связанные ссылки», он неизбежно получает полный список сайтов, которые пользователь открывает. Это уже телеметрия поведения.
Передача истории на внешний сервер
Запрос выглядит так:
fetch(`https://greenwich-for-chrome.replit.app/getPostIts?sourceUrl=${encodeURIComponent(url)}`)
Каждый открытый сайт отправляется на удалённый backend.
Пользователь при этом:
не видит явного уведомления,
не даёт отдельного согласия на сбор истории,
не получает информации о хранении этих данных.
Если backend ведёт логирование — это полноценная база истории посещений.
Для «социальных ссылок» это выглядит как избыточный сбор данных.
Перехват любого выделенного текста
Следующий фрагмент кода особенно показателен:
document.addEventListener('mouseup', function () { const selectedText = window.getSelection().toString().trim(); chrome.storage.local.set({'currentSelectedText': selectedText}); });
Каждый раз, когда пользователь выделяет текст на странице, расширение его считывает и сохраняет.
Что может оказаться в этом тексте?
переписка в веб-почте,
фрагменты внутренних документов,
токены и API-ключи,
данные из CRM,
банковская информация,
служебные отчёты.
Да, текст не отправляется немедленно. Но он сохраняется и затем используется при формировании POST-запроса при создании «предложения».
С точки зрения модели угроз это уже перехват пользовательского ввода.
Отправка контента на сервер
Когда пользователь создаёт предложение, выполняется POST-запрос:
fetch('https://greenwich-for-chrome.replit.app/addPostIt', { method: 'POST', body: JSON.stringify({ source_url, highlighted_text, suggested_link, description }) })
Сервер получает:
URL страницы,
выделенный текст,
описание,
предложенную ссылку.
Это уже не просто метаданные — это контент страницы и пользовательский ввод.
Если backend логирует данные (а проверить это невозможно), формируется централизованное хранилище пользовательской активности.
Как формируется и отправляется пакет данных
Окончательная картина становится понятной в popup.js:
chrome.storage.local.get(['currentSelectedText', 'source_url'], (result) => { const selectedText = result.currentSelectedText || ''; const source_url = result.source_url || ''; const postData = { source_url: source_url, highlighted_text: selectedText, suggested_link: url, description: description }; fetch('https://greenwich-for-chrome.replit.app/addPostIt', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify(postData) }) });
Здесь видно, что:
ранее перехваченный текст берётся из
chrome.storage.local,URL страницы также берётся из локального хранилища,
формируется единый объект
postData,данные отправляются на внешний сервер.
Таким образом создаётся централизованный поток информации:
какие сайты посещает пользователь,
какие фрагменты текста он выделяет,
какие ссылки добавляет,
какие комментарии пишет.
Это уже не локальная функциональность, а архитектурно заложенный механизм агрегации данных.
Инъекция в DOM и потенциальные XSS-риски
Расширение активно модифицирует DOM:
добавляет CSS,
вставляет
<sup>элементы,создаёт HTML через
innerHTML.
Например:
postIt.innerHTML = ` <div class="post-it-header">Suggested Link</div> <p>${selectedText}</p> <a href="${url}" target="_blank">${url}</a> `;
Данные вставляются без явного экранирования.
Если сервер когда-нибудь начнёт возвращать вредоносный payload, расширение сможет внедрить его в любой сайт — включая банки и корпоративные порталы.
Таким образом, оно создаёт универсальную точку инъекции.
Централизация данных на стороннем backend
Backend размещён на Replit — это облачная среда разработки.
Ключевая проблема здесь не в самой платформе, а в том, что:
серверная часть закрыта;
невозможно проверить, как именно обрабатываются данные;
логику можно изменить без обновления расширения.
С сегодняшнего дня сервер может:
начать сохранять полную историю посещений;
агрегировать поведенческие профили;
передавать данные третьим лицам.
Пользователь об этом не узнает.
Почему это уже можно считать вредоносным
Если сложить всё вместе, получаем следующую картину:
глобальный доступ ко всем сайтам;
отслеживание навигации;
передача истории посещений;
перехват выделенного текста;
централизованный сбор данных;
отсутствие прозрачного уведомления.
Функционально расширение реализует:
поведенческую телеметрию,
сбор контента страниц,
формирование базы пользовательской активности.
Это выходит далеко за рамки заявленной цели.
Даже если изначально разработчик не ставил целью шпионаж, архитектура уже создаёт готовый механизм наблюдения.
Потенциал злоупотребления
С технической точки зрения расширение может быть использовано для:
профилирования интересов пользователя,
мониторинга посещаемых ресурсов,
сбора корпоративной информации,
подготовки фишинговых сценариев,
анализа контента внутренних порталов.
Достаточно изменить поведение backend — и инструмент аннотаций превращается в spyware без необходимости обновлять расширение в магазине.
Indicators of Compromise (IOC)
Идентификатор расширения
hjepnlaapopkiedfendjaieefldndecd
Путь установки в Chrome (Windows)
%LocalAppData%\Google\Chrome\User Data\Default\Extensions\hjepnlaapopkiedfendjaieefldndecd\
Хэши файлов
popup.js
MD5: 700b94df15d6b6a27a80aefbb017c1b1
SHA-1: 3bf1d5a45d77f229f5e65b434f917c1267511d66
SHA-256: b9e3f301137a15d9be2132b96e72de71a9846e2bdb5f57d8c1f59e76b379ffed
contentScript.js
MD5: 38a9ae185a8de3f18969a335fef953a7
SHA-1: ea74e3073f0687670298278887da749d266bb7ba
SHA-256: 1154661e2417ac13f80f87a8597b34a710d042ada3e765b1a1c00b91bbfea42c
background.js
MD5: 29a3f298cd723a31a657c9156fcbaca9
SHA-1: 68f349d7298472b24f81232df050c6c20a85b217
SHA-256: 2ee71d278c42e25dd29095a70855196c1f214a61295ebd872f4afa5a2474be4f
Заключение
Greenwich на первый взгляд выглядит как обычное расширение для обмена ссылками. Однако анализ показывает, что оно получает слишком широкий доступ к браузеру: отслеживает посещаемые сайты, реагирует на действия пользователя и взаимодействует с внешним сервером.
Даже если часть этого поведения объясняется заявленной логикой работы, сам объём прав и собираемых данных создаёт потенциальные риски. В первую очередь — это возможность утечки информации и накопления данных о действиях пользователя.
Поэтому к установке подобных расширений, особенно в рабочей или корпоративной среде, стоит относиться внимательно. Любой инструмент с доступом ко всем сайтам фактически получает доступ ко всей вашей веб-активности — и это нужно учитывать заранее.
