
A comprehensive browser extension (.xpi) malware scanner which checks for many common malware tricks like:, credential-stealers obfuscation tactics, steganography, base64 payloads, zip-tricks, remote-code execution, polyglot tricks, meta data tricks in an attempt to give the analysist information about where deeper analysis is needed.
Инструмент командной строки, анализирующий файлы расширений Firefox (.xpi) на наличие признаков вредоносного ПО, обфускации, скрытых полезных нагрузок, стеганографии и других методов, используемых для протаскивания вредоносного кода мимо групп проверки расширений.
extension-scanner.py вскрывает расширение Firefox и выполняет набор проверок безопасности для каждого файла внутри него. Затем он создает цветной отчет с результатами, отсортированными по степени серьезности.
CRITICAL — Почти наверняка вредоносное; требуется немедленное расследованиеHIGH — Сильно подозрительно; требует тщательной проверкиMEDIUM — Потенциально рискованно; проверять в контекстеLOW — Незначительное беспокойство; информационноINFO — Метаданные (хэш, размер файла и т.д.)python3.11, python3.12 или python3.13**python3-venv** — Требуется при использовании виртуальных окруженийИспользование виртуальных окружений:
sudo apt install python3 python3-venv
git clone https://github.com/ernos/extension-scanner.git
cd extension-scanner
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
**python3-numpy** — Рекомендуется для стеганографии, системная установка (иначе pip install -r requirements.txt)git clone https://github.com/ernos/extension-scanner.git
cd extension-scanner
chmod +x extension-scanner.py
mkdir -p ~/.local/share/bin
ln -s $PWD/extension-scanner.py ~/.local/share/bin/extension-scanner
# Требуется для анализа стеганографии LSB (необязательно, но рекомендуется)
pip install pillow numpy
# ВАРИАНТ 1. Только для текущего пользователя:
# Включить автодополнение bash для удобства (TAB для автодополнения команд)
mkdir -p ~/.local/share/bash-completion/completions
cp extension-scanner-completions ~/.local/share/bash-completion/completions
echo "source ~/.local/share/bash-completion/completions/extension-scanner-completions" >> ~/.bashrc
# ВАРИАНТ 2. Включить автодополнение глобально для всех пользователей (должно автоматически загружаться из вашего .bashrc)
cp extension-scanner-completions /usr/share/bash-completion/completions
Если Pillow/NumPy не установлены, инструмент всё равно работает — проверки LSB и энтропии пикселей просто пропускаются, выводится предупреждение.
usage: xpiscanner [-h] [--update-blocklist] [--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}] [--json] [--compact] [-v] [-m] [--scans CHECK [CHECK ...]]
[targets ...]
Firefox Extension Scanner - Сканирует XPI-файлы на наличие рисков безопасности и индикаторов вредоносного ПО
positional arguments:
targets Один или несколько XPI-файлов или каталогов, содержащих XPI для анализа
options:
-h, --help показать это справочное сообщение и выйти
--update-blocklist, --update, -u
Загрузить свежие черные списки доменов из URLhaus и списка Питера Лоу, объединить с встроенным снимком и сохранить в
/home/peb/projects/Firefox-Extensions/extension-scanner/blocklist.json. Завершается после обновления.
--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}
Минимальный уровень серьезности для отображения (CRITICAL, HIGH, MEDIUM, LOW, INFO; по умолчанию: INFO)
--json Вывод результатов в формате JSON вместо форматированного текста
--compact, -c Печатать каждое обнаружение в 1–2 строки вместо формата по умолчанию в 3 строки
-v, --verbose Включить подробный вывод: показывать дополнительный контекст для обнаружений
-m, --manifest Показать полный манифест расширения для каждой цели
--scans, -s CHECK [CHECK ...]
Ограничить анализ определенными типами проверок. Варианты: anti-analysis, api-abuse, credentials, cross-file,
file-meta, hidden-elements, obfuscation, payloads, permissions, polyglot, remote-code,
signatures, steganography, time-bomb, zip-tricks. Опустите для выполнения всех проверок (по умолчанию).
extension-scanner.py — Анализ файлов расширений XPI для Firefox (и других браузеров) на наличие рисков безопасности и индикаторов вредоносного ПО.
Прочтите README.md для получения информации о том, как интерпретировать результаты, ограничениях и рекомендациях по использованию.
Этот инструмент предназначен для исследователей безопасности, аналитиков и продвинутых пользователей, желающих провести
всесторонний статический анализ расширений браузера. Он должен хорошо работать и для других браузеров,
но тестировался только на Firefox.
Usage:
python3 extension-scanner.py [OPTIONS] targets...
Цели могут быть отдельными файлами .xpi или каталогами, содержащими файлы .xpi. Используйте шаблоны glob (например, *.xpi) для удобства.
Доступные типы проверок:
permissions Опасные/широкие разрешения манифеста и проблемы CSP
remote-code Фоновые страницы или сервис-воркеры, загружаемые с удаленных URL
obfuscation Приемы eval/atob/кодирования, подозрительные URL, строки с высокой энтропией
payloads Блоки, закодированные в Base64, декодированные и просканированные на наличие исполняемых файлов/скриптов
steganography Добавленные данные PNG (автоматически декодированные через base64/zlib/gzip), неизвестные чанки, анализ канала LSB
credentials Жестко заданные ключи API, токены, пароли, закрытые ключи, IP-адреса
file-meta Магические байты, двойные расширения, подозрительные имена файлов, энтропия файлов
polyglot Файлы, валидные в двух форматах одновременно (например, HTML+ZIP)
zip-tricks Обход пути (path traversal), нулевые байты, дублирующиеся записи, ZIP-комментарии
cross-file Токены классов HTML, перекрестно связанные с ключами localStorage в JS
signatures Известные строки из подтвержденных семейств вредоносных расширений (qingcaila, YTMP4 и т.д.)
api-abuse Вызовы API браузера, указывающие на кражу данных или эксфильтрацию (cookies, tabs, history, keylogger, clipboard, executeScript)
hidden-elements Невидимые iframe, внедрение элементов с нулевыми размерами, отслеживающие пиксели (new Image().src)
time-bomb setTimeout с большой задержкой, ворота Date.now(), проверки даты установки в localStorage, ворота Math.random()
anti-analysis navigator.webdriver, окно нулевого размера, голый оператор debugger, тайминг performance.now()
Примеры:
python3 extension-scanner.py extension.xpi
python3 extension-scanner.py *.xpi
python3 extension-scanner.py /path/to/extensions/
python3 extension-scanner.py a.xpi b.xpi --min-severity HIGH
python3 extension-scanner.py ext.xpi --scans obfuscation payloads
python3 extension-scanner.py ext.xpi --s steganography zip-tricks file-meta
python3 extension-scanner.py ext.xpi --verbose
python3 extension-scanner.py --update-blocklist
python3 extension-scanner.py --manifest
Советы:
- Убедитесь, что файл scanner-completions.sh подгружается из вашего .bashrc или .zshrc, чтобы включить автодополнение по TAB для категорий --scans и путей к целевым файлам.
- Используйте --min-severity, чтобы сначала сосредоточиться на самых критичных обнаружениях.
- Используйте --scans, чтобы ограничить анализ определенными категориями проверок, если вы ищете что-то конкретное или хотите ускорить сканирование.
- Просмотрите полный манифест с помощью --manifest для контекста о разрешениях, контентных скриптах и других метаданных расширения, которые могут помочь интерпретировать результаты.
- Регулярно обновляйте черный список с помощью --update-blocklist, чтобы последние вредоносные домены были включены в проверки.
Благодарности:
Разработано Ernos @ https://www.yourdev.net
Email: max at yourdev.net
GitHub: https://www.github.com/ernos/extension-scanner
════════════════════════════════════════════════════════════════════════════
XPI АНАЛИЗАТОР — example.xpi
════════════════════════════════════════════════════════════════════════════
Общий вердикт: ВЫСОКИЙ РИСК
Обнаружено: 1 CRITICAL 3 HIGH 2 MEDIUM 1 LOW
── CRITICAL ────────────────────────────────────────────────────────────
[CRITICAL ] [JS_OBFUSCATION] content.js
Вызов eval() — может выполнять произвольный код из строк
Доказательство: var x = eval(atob("dmFyIGE9MTs…"))
── HIGH ────────────────────────────────────────────────────────────────
[HIGH ] [PERMISSION] manifest.json
Опасное разрешение: 'nativeMessaging' — может запускать нативные ОС…
Доказательство: permissions: ['nativeMessaging', 'storage', '<all_urls>']
…
При анализе нескольких файлов после индивидуальных отчетов выводится сравнительная таблица, показывающая все расширения бок о бок.
| Код | Значение |
|---|---|
0 | Нет находок CRITICAL или HIGH |
1 | Как минимум одна находка HIGH |
2 | Как минимум одна находка CRITICAL |
Это позволяет легко использовать инструмент в конвейерах CI или shell-скриптах:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "Найдены CRITICAL проблемы!"; fi
HIGH.Maximilian Cornett
https://www.yourdev.net https://www.github.com/ernos
GNU General Public License — Этот инструмент предназначен только для исследования безопасности и защитного анализа.
| Категория | Что ищет |
|---|
| Разрешения | Опасные или чрезмерно широкие разрешения (nativeMessaging, <all_urls>, debugger, desktopCapture и т.д.) |
| Политика безопасности контента | unsafe-inline, unsafe-eval, внешние источники скриптов в CSP |
| Обфускация JavaScript | eval(), atob(), злоупотребление конструктором Function(), шестнадцатеричные escape-последовательности, сборка через split/join/reverse, закодированные строковые литералы, setTimeout с строковыми аргументами |
| Подозрительные URL | Жестко заданные внешние домены, классифицированные как известно-вредоносные (попадание в черный список → HIGH), неизвестные (не в белом списке → MEDIUM) или известно-безопасные (в белом списке → подавлено). Выполните --update-blocklist для обновления черного списка доменов из URLhaus и списка Питера Лоу. |
| Учетные данные и секреты | Жестко заданные ключи API, токены (AWS, GitHub, Slack, Google), пароли, закрытые ключи и IP-адреса |
| Полезные нагрузки Base64 | Декодирует встроенные base64-блоки и сканирует их на наличие исполняемых файлов, скриптов и сетевого кода |
| Стеганография PNG | Обнаруживает данные, добавленные после маркера IEND PNG, и автоматически декодирует трейлер (base64, zlib, gzip и их комбинации); декодированные полезные нагрузки рекурсивно сканируются на обфускацию JS, учетные данные и подозрительные URL. Также обнаруживает неизвестные типы чанков, аномалии в канале LSB и необычно высокую энтропию пикселей |
| Метаданные файлов | Определение магических байт исполняемых файлов (.exe, .elf, .dylib), двойные расширения (например, photo.png.js), подозрительные имена файлов (keylog, miner, wallet) |
| Полиглот-файлы | Файлы, которые одновременно являются валидными в двух форматах (например, HTML + ZIP) |
| Трюки с ZIP | Записи с обходом пути (path traversal), нулевые байты в именах файлов, дублирующиеся записи, которые могут обмануть парсеры, ZIP-комментарии с полезной нагрузкой |
| Удаленный код | Фоновые страницы или сервис-воркеры, загружаемые с удаленных URL |
| Высокая энтропия | Файлы или строковые литералы с подозрительно высокой энтропией (вероятно, зашифрованные или сжатые полезные нагрузки) |
| Злоупотребление API | Вызовы API расширений браузера, указывающие на кражу данных или эксфильтрацию: cookies.getAll({}), tabs.query({}), history.search, клавиатурные слушатели, чтение буфера обмена, scripting.executeScript с динамической функцией. Повышается до CRITICAL, когда вызов сбора данных сочетается с исходящей сетевой отправкой в одном файле. |
| Скрытые элементы | Динамически созданные невидимые iframe (display:none, нулевые размеры), внедренные в DOM — тихие партнерские пинги или каналы C2. Отслеживающие пиксели через new Image().src, указывающие на внешние URL. |
| Бомба замедленного действия | setTimeout/setInterval с задержками ≥ 5 минут; арифметические ворота Date.now(); проверки даты установки через localStorage, активирующие поведение через несколько дней после первого запуска; пороговые ворота Math.random(), срабатывающие только на доле загрузок страниц. |
| Анти-анализ | Проверки navigator.webdriver; сравнения нулевой ширины/высоты окна; голые операторы debugger; арифметика performance.now(), используемая для обнаружения песочницы по времени. |
| Флаг | Описание |
|---|
--update-blocklist | Загрузить свежие списки доменов из URLhaus и списка серверов рекламы/вредоносного ПО Питера Лоу, объединить с встроенным снимком и сохранить в blocklist.json рядом со скриптом. Завершается после обновления. |
targets | Один или несколько файлов .xpi или каталогов |
--min-severity | Фильтр вывода: CRITICAL, HIGH, MEDIUM, LOW, INFO (по умолчанию: INFO) |
--json | Вывод результатов в виде документа JSON вместо человекочитаемого отчета |
--verbose или -v | Выводит содержимое manifest.json, а также включает ~5 строк кода вокруг обнаруженной подозрительной конструкции |
--checks | Сканировать только эти конкретные категории проверок (см. ниже) |
| Доступные категории проверок | Описание проверок в категории |
|---|
| permissions | Опасные/широкие разрешения манифеста и проблемы CSP |
| remote-code | Фоновые страницы или сервис-воркеры, загружаемые с удаленных URL |
| obfuscation | Приемы eval/atob/кодирования, подозрительные URL, строки с высокой энтропией |
| payloads | Блоки, закодированные в Base64, декодированные и просканированные на наличие исполняемых файлов/скриптов |
| steganography | Добавленные данные PNG, неизвестные чанки, анализ канала LSB |
| credentials | Жестко заданные ключи API, токены, пароли, закрытые ключи, IP-адреса |
| file-meta | Магические байты, двойные расширения, подозрительные имена файлов, энтропия файлов |
| polyglot | Файлы, валидные в двух форматах одновременно (например, HTML+ZIP) |
| zip-tricks | Обход пути (path traversal), нулевые байты, дублирующиеся записи, ZIP-комментарии |
| cross-file | Токены классов HTML, перекрестно связанные с ключами localStorage в JS |
| api-abuse | Вызовы API браузера, указывающие на кражу данных или эксфильтрацию (cookies, tabs, history, keyboard, clipboard). CRITICAL, когда сбор данных и сетевая отправка появляются в одном файле. |
| hidden-elements | Внедрение невидимых iframe и отслеживающие пиксели. HIGH, когда iframe скрыт и добавлен в DOM. |
| time-bomb | setTimeout с большой задержкой, арифметические ворота Date.now(), дата установки в localStorage, порог Math.random(). |
| anti-analysis | navigator.webdriver, окно нулевого размера, голый оператор debugger, арифметика performance.now(). |