
28
История браузера врёт охотнее, чем расширение. Пользователь жмёт «очистить всё», чистит cookies, включает инкогнито – и искренне верит, что стёр следы. Расширение в это время спокойно пишет LevelDB, IndexedDB и свой локальный склад. «Очистить историю» его, как правило, не трогает.
Это не магия. Это архитектура: плагин – отдельное приложение внутри профиля, со своим storage API и своими файлами. Для форензики это золото. Для тех, кто «просто почистил Chrome» – неприятный сюрприз.
Не повторяйте это дома, я серьезно: ниже – разбор своих профилей, лабораторных образов и кейсов с законным основанием. Чужой диск без мандата – уже не OSINT, а статья УК.
Почему плагин помнит больше браузера
Chromium и Firefox дают расширениям chrome.storage.local, chrome.storage.sync, IndexedDB, Cache Storage и (у старых) WebSQL. Браузер не считает это «историей». Поэтому:
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 |
| Локальный storage | Local Extension Settings\<extension_id>\ | LevelDB: *.ldb, *.log, CURRENT, MANIFEST-* |
| Синк | Sync Extension Settings\<extension_id>\ | то, что уехало в аккаунт Google/Microsoft |
| Состояние | Extension State\ | LevelDB, runtime-флаги |
| IndexedDB | IndexedDB\chrome-extension_<id>_0.indexeddb.leveldb | крупные объекты: кошельки, заметки, чаты |
| Cache Storage / Service Worker | Service 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 – только с копии, не с живого профиля).
Типичный улов:
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.json → path / id → storage. Пропустишь маппинг – получишь красивый дамп ни о чём.
Что именно доказывать
Расширение само по себе не преступление. Цепочка обычно такая:
update_url в манифесте: Chrome Web Store vs левый CDN – уже сюжет).<all_urls> + webRequest + debugger у «ускорителя PDF» – красный флаг, не диагноз.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. Расширения – четвёртый слой, который вообще не входил в «очистить».
storage\default, не LevelDB.Preferences, IndexedDB, Yandex-специфики (Ya Passman Data и т.п.).Не тащи «Inspect background page» на боевой машине подозреваемого, если задача – изъятие. Это изменение состояния. Для своего лаба – пожалуйста: DevTools → Application → Extension storage. Для суда – файл с диска.
Грязные зоны (и почему я не дам рецепт)
Криптокошельки в расширениях, менеджеры паролей, сессионные токены SaaS – это не «интересно посмотреть JSON». Это доступ к чужим деньгам и аккаунтам. Разбор формата vault’а, обход мастер-пароля, эксплуатация уязвимого плагина – за скобками. Если на образе лежит nkbihfbeogaeaoehlefnkodbefgpgknn и жирный LevelDB, фиксируешь факт, хеши, версию, permissions. Дальше – уполномоченные и политика кейса.
То же про вредоносные расширения из supply chain: анализируй манифест, сетевые IOC, persistence. Не пиши и не запускай эксплойт «чтобы проверить».
Короткий чеклист на изъятие
User Data / Firefox profile, не только Extensions.Local Extension Settings, Sync Extension Settings, IndexedDB, Extension State.Preferences, Secure Preferences, Local State, extensions.json.Маленький плагин с большой памятью – это не поэзия. Это каталог на диске, который пользователь не считает уликой. Ты – считаешь. И да, сначала свой профиль: открой Local Extension Settings и посмотри, сколько о тебе помнит «просто блокировщик рекламы». Спойлер: больше, чем тебе комфортно.