Логотип
Артефакты браузерных расширений: маленькие плагины с большой памятью

Артефакты браузерных расширений: маленькие плагины с большой памятью

17 августа, 2026

28

История браузера врёт охотнее, чем расширение. Пользователь жмёт «очистить всё», чистит cookies, включает инкогнито – и искренне верит, что стёр следы. Расширение в это время спокойно пишет LevelDB, IndexedDB и свой локальный склад. «Очистить историю» его, как правило, не трогает.

Это не магия. Это архитектура: плагин – отдельное приложение внутри профиля, со своим storage API и своими файлами. Для форензики это золото. Для тех, кто «просто почистил Chrome» – неприятный сюрприз.

Не повторяйте это дома, я серьезно: ниже – разбор своих профилей, лабораторных образов и кейсов с законным основанием. Чужой диск без мандата – уже не OSINT, а статья УК.

Почему плагин помнит больше браузера

Chromium и Firefox дают расширениям chrome.storage.local, chrome.storage.sync, IndexedDB, Cache Storage и (у старых) WebSQL. Браузер не считает это «историей». Поэтому:

  • adblocker хранит списки доменов и счётчики блокировок;
  • менеджер паролей держит метаданные сейфа и иногда зашифрованный vault;
  • криптокошелёк пишет ключи/сид в LevelDB (infostealer’ы это знают лучше половины SOC);
  • AI-сайдбары (Monica, Sider и компания) складывают переписки в Local Extension Settings.

Исследование 2026 года по conversational AI-расширениям прямо указывает: основные артефакты лежат в Local Extension Settings, формат – LevelDB. Не в History. Не в cookies.

Отдельный бонус: состояние расширений переживает Clear All History. Password managers, ad blockers, «продуктивность» и даже тупые темы часто оставляют навигационный контекст.

Карта диска: Chromium-семья

Chrome, Edge, Brave, Opera, Vivaldi, Яндекс – одна кухня, разные адреса профиля.

Windows (пример Chrome):

%LOCALAPPDATA%\Google\Chrome\User Data\<Profile>\

Что смотретьПуть относительно профиляЗачем
Код и манифестExtensions\<extension_id>\<version>\ID, версия, permissions, update URL, подозрительный CWS vs self-hosted
Настройки браузераPreferences, Secure Preferencesсписок установленных, enabled/disabled, install time, pin to toolbar
Локальный storageLocal Extension Settings\<extension_id>\LevelDB: *.ldb, *.log, CURRENT, MANIFEST-*
СинкSync Extension Settings\<extension_id>\то, что уехало в аккаунт Google/Microsoft
СостояниеExtension State\LevelDB, runtime-флаги
IndexedDBIndexedDB\chrome-extension_<id>_0.indexeddb.leveldbкрупные объекты: кошельки, заметки, чаты
Cache Storage / Service WorkerService Worker\, CacheStorage\кэш UI и иногда токены

Edge: ...\Microsoft\Edge\User Data\Default\Extensions\...
Opera: чаще %APPDATA%\Opera Software\Opera Stable\Extensions\

extension_id – 32 символа латиницы (nkbihfbeogaeaoehlefnkodbefgpgknn = MetaMask, и да, это уже мем в инцидентах). Не гадай: сверяй с manifest.json и Preferences.

Linux: ~/.config/google-chrome/<profile>/
macOS: ~/Library/Application Support/Google/Chrome/<profile>/

Что внутри LevelDB

Это не SQLite. Открывать «как таблицу» бесполезно. На диске – SST/LDB плюс WAL-подобный *.log. Значения часто JSON или protobuf. Строки ключей иногда читаются strings, но для суда нужен парсер (Hindsight, leveldbdump, кастом на Python plyvel – только с копии, не с живого профиля).

Типичный улов:

  • списки URL / last visited / pinned tabs у session-менеджеров;
  • email, workspace id, last prompt у AI-плагинов;
  • address book и tx history у кошельков;
  • правила фильтрации – косвенно показывают, какие домены пользователь видел.

Infostealer’ы (Vidar 2.0 и наследники) целенаправленно грабят Local Extension Settings, Sync Extension Settings и IndexedDB\chrome-extension_*. Если в IR видишь, что малварь ходила именно туда – это не «ещё один путь», это приоритет: там деньги и сессии.

Firefox: другая религия, та же жадность

Профиль: %APPDATA%\Mozilla\Firefox\Profiles\<random>.default-release\

  • extensions.json – каталог аддонов, состояние, даты.
  • extensions\ – XPI/распакованные.
  • addonStartup.json.lz4 – что реально поднималось при старте.
  • storage\default\moz-extension+++<uuid>\ – IndexedDB/local storage в SQLite (idb, ls).
  • browser-extension-data\<id>\ – storage.local в JSON у части аддонов.
  • prefs.js – флаги, в том числе отключённые плагины.

UUID в storage\default не равен addon id с AMO. Связка: extensions.jsonpath / idstorage. Пропустишь маппинг – получишь красивый дамп ни о чём.

Что именно доказывать

Расширение само по себе не преступление. Цепочка обычно такая:

  1. Inventory. Что стояло, когда поставили, откуда (update_url в манифесте: Chrome Web Store vs левый CDN – уже сюжет).
  2. Permissions. <all_urls> + webRequest + debugger у «ускорителя PDF» – красный флаг, не диагноз.
  3. Runtime state. Enabled в момент инцидента или «случайно» выключили за час до изъятия.
  4. User data. Содержимое storage: переписки, адреса, seed-фразы, списки сайтов.
  5. Корреляция. Сопоставить install time с загрузками в History/places.sqlite, с Secure Preferences и с prefetch браузера.

Пример из практики (лаборатория, не «взлом соседа»): пользователь чистит историю после спорной сессии. В History пусто. В storage адблока – счётчики хитов по доменам за тот же день. В AI-сайдбаре – промпт с реквизитами. Timeline собирается без единого URL из visits.

Ещё один классический слой: Clear All History режет таблицы urls/visits, но WAL/History-wal и freelist SQLite ещё часы живут. Плюс Top Sites, Network Action Predictor, Service Worker. Расширения – четвёртый слой, который вообще не входил в «очистить».

Инструменты без театра

  • Копия профиля, браузер закрыт. Живой Chrome держит локи на LevelDB – сломаешь и себе, и цепочке.
  • Hindsight (RyanDFIR) – Chromium-артефакты, включая куски extension-related.
  • DB Browser for SQLite – Firefox storage\default, не LevelDB.
  • WebX / triage-сканеры – инвентаризация расширений пачкой с KAPE/образа.
  • Elcomsoft Quick Triage и аналоги – полевой съём Preferences, IndexedDB, Yandex-специфики (Ya Passman Data и т.п.).
  • Свой парсер LevelDB – когда вендорный софт молчит. Пиши на копии. Хеши до и после.

Не тащи «Inspect background page» на боевой машине подозреваемого, если задача – изъятие. Это изменение состояния. Для своего лаба – пожалуйста: DevTools → Application → Extension storage. Для суда – файл с диска.

Грязные зоны (и почему я не дам рецепт)

Криптокошельки в расширениях, менеджеры паролей, сессионные токены SaaS – это не «интересно посмотреть JSON». Это доступ к чужим деньгам и аккаунтам. Разбор формата vault’а, обход мастер-пароля, эксплуатация уязвимого плагина – за скобками. Если на образе лежит nkbihfbeogaeaoehlefnkodbefgpgknn и жирный LevelDB, фиксируешь факт, хеши, версию, permissions. Дальше – уполномоченные и политика кейса.

То же про вредоносные расширения из supply chain: анализируй манифест, сетевые IOC, persistence. Не пиши и не запускай эксплойт «чтобы проверить».

Короткий чеклист на изъятие

  1. Зафиксировать запущен ли браузер; по возможности live-triage только если нужен App-Bound Encryption / сессия. Иначе – выключить чисто.
  2. Снять весь User Data / Firefox profile, не только Extensions.
  3. Не забыть Local Extension Settings, Sync Extension Settings, IndexedDB, Extension State.
  4. Рядом положить Preferences, Secure Preferences, Local State, extensions.json.
  5. Посчитать SHA-256. Парсить только копии.
  6. Смапить ID → имя → версия → store/sideload.
  7. Отдельно пометить кошельки, password managers, AI-чаты, корпоративные SSO-плагины.

Маленький плагин с большой памятью – это не поэзия. Это каталог на диске, который пользователь не считает уликой. Ты – считаешь. И да, сначала свой профиль: открой Local Extension Settings и посмотри, сколько о тебе помнит «просто блокировщик рекламы». Спойлер: больше, чем тебе комфортно.

Оставьте заявку