Расширение браузера (.xpi) для всестороннего сканирования вредоносного ПО, которое проверяет множество распространённых приёмов вредоносных программ, таких как: тактики обфускации похитителей учётных данных, стеганография, base64-полезные нагрузки, zip-уловки, удалённое выполнение кода, полиглот-приёмы и трюки с метаданными, чтобы предоставить аналитику информацию о том, где требуется более глубокий анализ.
Инструмент командной строки, анализирующий файлы расширений Firefox (.xpi) на наличие признаков вредоносного ПО, обфускации, скрытых полезных нагрузок, стеганографии и других методов, используемых для протаскивания вредоносного кода мимо групп проверки расширений.
extension-scanner.py вскрывает расширение Firefox и выполняет набор проверок безопасности для каждого файла внутри него. Затем он создает цветной отчет с результатами, отсортированными по степени серьезности.
| Категория | Что ищет |
|---|---|
| Разрешения | Опасные или чрезмерно широкие разрешения (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) |
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
| Флаг | Описание |
|---|---|
--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(). |
════════════════════════════════════════════════════════════════════════════
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
GNU General Public License — Этот инструмент предназначен только для исследования безопасности и защитного анализа.
| Трюки с 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(), используемая для обнаружения песочницы по времени. |