«Вирусы» в расширениях на примере FastProxy
JavaScript,
Расширения для браузеров,
Реверс-инжиниринг
В этой статье я покажу насколько опасны могут быть расширения в хроме, и чем
расширения в фаерфоксе безопаснее.
Речь пойдёт о расширении FastProxy.
Ни в коем случае не ставьте его в чистом виде в хроме.
Чтобы получить его исходный код — сначала надо поставить другое расширение Chrome extension source viewer.
После этого открыть страницу.
Иконка CRX при этом станет жётлой — кликнуть на неё и Выбрать "скачать как zip".
Теперь к анализу кода.
1. Manifest (manifest.json) — ядро любого расширения
Ограничения расширения задаются CSP (content security policy) и permissions:
"content_security_policy": "script-src 'self' 'unsafe-eval'
https://ssl.google-analytics.com; object-src 'self'",
"permissions": [ "proxy", "tabs", "webRequest", "webRequestBlocking", "management", "\u003Call_urls>", "storage" ],
CSP должна сразу насторожить, она позволяет unsafe-eval (подробнее об этом здесь).
Т.е. исполнять код из любой переданной строки.
Разрешение management позволяет управлять другмии расширениями.
Разрешение webRequestBlocking позволяет подменять абсолютно все запросы, проходящие через браузер.
Разрешение \u003Call_urls> это тоже самое что <all_urls> — позволяет действовать на любом сайте.
Подробнее о разрешениях можно узнать здесь.
Т.е. на базе лишь одного файла манифеста расширение уже имеет огромный уровень доступа ко всему.
Ключевые файлы кода перечислены в
"background": {
"scripts": [ "lib.js", "jquery.min.js", "background.js", "ga.js" ]
},
Выполняются по порядку в массиве сразу после установки расширения или сразу после запуска браузера.
2. Анализ файлов фонового процесса
Код минимифирован и запутан. Для распутывания будем использовать сайт
http://jsbeautifier.org/ с дефолтными настройками.
Файл jquery.min.js я сравнил с оригинальным кодом jquery 2.2.4 — они совпадают.
Файл ga.js это просто код Google Analytics.
Файл lib.js это CryptoJS.
Основной код сосредоточен в background.js.
Чтобы было намного легче читать код, я его немного переписал (переименовал функции, поменял запятые на отдельные блоки и т.п.).
Также можно использовать firefox-версию того же расширения, чтобы понять неосновную часть кода.
Использование proxy в фаерфоксе и хроме кардинально отличается.
Чтобы скачать firefox-версию расширения, нужно открыть в фаерфоксе ссылку.
Скопировать ссылку на "Добавить в Firefox" и открыть её в хроме.
Открывать также как zip-архив.
Переписанный код можно найти по этой ссылке.
3. Анализ background.js
Прежде всего нужно понимать что $.ajax выполненный на файле со скриптом внедряет этот скрипт в страницу (в данном случае не в страницу, а в фоновый процесс).
Настораживают строки
localStorage.C = JSON.stringify(
[
"U2FsdGVkX19b+rGRl3biafMC1rSMejJ/WYMKl4LQUJj9v6z/cHmXINDh2Ugh+q7jo0OGj1IBFtLC0v3Y23luKQ==",
"U2FsdGVkX1+poIEChHKgvzBELSP2+vHvotbMSAWxZT53njC5kQ7FzhtsuhRy4F7bHectHXiC6qQzfQEFT7tawQ=="
]
);
Они уже как бы говорят нам, что дело тут не чисто.
Добавляем console.log после CryptoJS.AES.decrypt( JSON.parse( localStorage.C)[cc], "config") и CryptoJS.AES.decrypt( JSON.parse(localStorage.P)[pc], "record"), запрещая выполнение самих аяксов.
При этом в строке JSON.parse( localStorage.C)[cc] (и аналогичной для record) cc меняем от 0 до 1 (в дальнейшем и до 2, когда увидим массивы из 3 элементов).
Получаем ссылки:
для config это
http://proxyrus.ru/proxy/config/config.txt...7&version=5.0.4 (1)
http://proxy-fast.ru/proxy/config/config.t...7&version=5.0.4 (2)
для record это
http://proxyrus.ru/proxy/config/data.txt?u...7&version=5.0.4 (3)
http://proxy-fast.ru/proxy/config/data.txt...7&version=5.0.4 (4)
Причём ссылки отдают данные только при использовании с обоими параметрами uid и version, а также только через $.ajax или fetch. Посмотреть просто открыв через браузер не получится — видимо стоят проверки на входящие заголовки.
А теперь перейдём к тому, что отдают эти аяксы. Если вы хотите прочитать их сами, лучше используйте просто fetch в каком-то ином проекте (потребуется поставить расширения, которые разблокируют CORS в браузере).
config_proxyrus.ru.js
Итак, первая ссылка отдает нам скрипт, который будет автоматически внедрён в фоновый процесс, т.к. 'unsafe-eval' присутствует, а ограничений по ссылкам нет в CSP.
Стоит отметить строку
function antiZapret (tabId, changeInfo, tab) {
if (typeof(tab.url) != 'undefined' && changeInfo.status == 'complete') {
chrome.tabs.executeScript(tabId,{code: "if (document.body.innerText.indexOf('Антизапрет: ОШИБКА') != -1) document.body.innerHTML = '<center style=\"margin-top: 50px; font-size:20px;\">Сайт временно не работает.<br><br>Повторите запрос позже.</center>'",runAt:"document_start"});
}
Вбиваем в поиске "антизапрет fastproxy" и открываем 4й результат поиска, раздел "Будьте осторожны".
Выясняется, что FastProxy использует не свои proxy сервера.
Читать дальше здесь:
https://habr.com/ru/post/421735/