
Um scanner abrangente de malware para extensões de navegador (.xpi) que procura por muitos truques comuns de malware, como:, táticas de ofuscação de roubadores de credenciais, esteganografia, payloads base64, truques de zip, execução remota de código, truques poliglota, truques de metadados, na tentativa de fornecer ao analista informações sobre onde é necessária uma análise mais aprofundada.
Uma ferramenta de linha de comando que analisa arquivos de extensão do Firefox (.xpi) em busca de sinais de malware, ofuscação, payloads ocultos, esteganografia e outras técnicas usadas para inserir código malicioso sem ser detectado pelas equipes de revisão de extensões.
extension-scanner.py abre uma extensão do Firefox e realiza uma bateria de verificações de segurança em todos os arquivos dentro dela. Em seguida, produz um relatório colorido com os achados classificados por gravidade.
CRÍTICO — Quase certamente malicioso; requer investigação imediataALTO — Fortemente suspeito; merece revisão cuidadosaMÉDIO — Potencialmente arriscado; revisar no contextoBAIXO — Preocupação menor; informativoINFO — Metadados (hash, tamanho do arquivo, etc.)python3.11, python3.12 ou python3.13**python3-venv** - Necessário se usar ambientes virtuaisUsando ambientes virtuais:
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** - Recomendado para esteganografia, instalação em todo o sistema (caso contrário 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
# Required for LSB steganography analysis (optional but recommended)
pip install pillow numpy
# OPTION 1. Only for current user:
# Enable bash completions for simpler use (TAB for autocompleting commands)
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
# OPTION 2. Enable completions globally for all users (Should be auto-sourced from your .bashrc)
cp extension-scanner-completions /usr/share/bash-completion/completions
Se Pillow/NumPy não estiverem instalados, a ferramenta ainda funciona — as verificações de LSB e entropia de pixel são simplesmente ignoradas e um aviso é exibido.
usage: xpiscanner [-h] [--update-blocklist] [--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}] [--json] [--compact] [-v] [-m] [--scans CHECK [CHECK ...]]
[targets ...]
Firefox Extension Scanner - Scans XPI files for security risks and malware indicators
positional arguments:
targets One or more XPI files or directories containing XPIs to analyze
options:
-h, --help show this help message and exit
--update-blocklist, --update, -u
Fetch fresh domain blocklists from URLhaus and Peter Lowe's list, merge with the bundled snapshot, and saves to
/home/peb/projects/Firefox-Extensions/extension-scanner/blocklist.json. Exits after updating.
--min-severity {CRITICAL,HIGH,MEDIUM,LOW,INFO}
Minimum severity to display (CRITICAL, HIGH, MEDIUM, LOW, INFO; default: INFO)
--json Output results as JSON instead of formatted text
--compact, -c Print each finding on 1-2 lines instead of the default 3-line format
-v, --verbose Enable verbose output: show additional context for findings
-m, --manifest Show full extension manifest for each target
--scans, -s CHECK [CHECK ...]
Limit analysis to specific check types. Choices: anti-analysis, api-abuse, credentials, cross-file,
file-meta, hidden-elements, obfuscation, payloads, permissions, polyglot, remote-code,
signatures, steganography, time-bomb, zip-tricks. Omit to run all checks (default).
extension-scanner.py — Analyze Firefox (and other browsers) extension XPI files for security risks and malware indicators.
Read README.md for information on how to interpret findings, limitations, and best practices for use.
This tool is intended for security researchers, analysts, and advanced users who want to perform a
comprehensive static analysis of browser extensions. It should work well for other browsers as well,
but this has only been tested on firefox.
Usage:
python3 extension-scanner.py [OPTIONS] targets...
Targets can be individual .xpi files or directories containing .xpi files. Use glob patterns (e.g. *.xpi) for convenience.
Available check types:
permissions Dangerous/broad manifest permissions and CSP issues
remote-code Background pages or service workers loaded from remote URLs
obfuscation eval/atob/encoding tricks, suspicious URLs, high-entropy strings
payloads Base64-encoded blobs decoded and scanned for executables/scripts
steganography PNG appended data (auto-decoded via base64/zlib/gzip), unknown chunks, LSB channel analysis
credentials Hardcoded API keys, tokens, passwords, private keys, IP addresses
file-meta Magic bytes, double extensions, suspicious filenames, file entropy
polyglot Files valid in two formats simultaneously (e.g. HTML+ZIP)
zip-tricks Path traversal, null bytes, duplicate entries, ZIP comments
cross-file HTML class tokens cross-referenced against JS localStorage keys
signatures Known strings from confirmed malicious extension families (qingcaila, YTMP4, etc.)
api-abuse Browser API calls indicating data theft or exfiltration (cookies, tabs, history, keylogger, clipboard, executeScript)
hidden-elements Invisible iframes, zero-dimension element injection, tracking pixels (new Image().src)
time-bomb Long-delay setTimeout, Date.now() gates, localStorage install-date checks, Math.random() gates
anti-analysis navigator.webdriver, zero-size window, bare debugger statement, performance.now() timing
Examples:
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
Tips:
- Make sure to source scanner-completions.sh from your .bashrc or .zshrc to enable tab completion for --scans categories and target file paths.
- Use --min-severity to focus on the most critical findings first.
- Use --scans to limit the analysis to specific categories of checks if you're looking for something specific or want to speed up the scan.
- Review the full manifest with --manifest for context on permissions, content scripts, and other extension metadata that can help interpret findings.
- Regularly update the blocklist with --update-blocklist to ensure the latest malicious domains are included in the checks.
Credits:
Developed by Ernos @ https://www.yourdev.net
Email: max at yourdev.net
GitHub: https://www.github.com/ernos/extension-scanner
════════════════════════════════════════════════════════════════════════════
XPI ANALYZER — example.xpi
════════════════════════════════════════════════════════════════════════════
Overall verdict: HIGH RISK
Findings: 1 CRITICAL 3 HIGH 2 MEDIUM 1 LOW
── CRITICAL ────────────────────────────────────────────────────────────
[CRITICAL ] [JS_OBFUSCATION] content.js
eval() call — can execute arbitrary code from strings
Evidence: var x = eval(atob("dmFyIGE9MTs…"))
── HIGH ────────────────────────────────────────────────────────────────
[HIGH ] [PERMISSION] manifest.json
Dangerous permission: 'nativeMessaging' — Can spawn native OS …
Evidence: permissions: ['nativeMessaging', 'storage', '<all_urls>']
…
Ao analisar múltiplos arquivos, uma tabela de comparação é exibida após os relatórios individuais, mostrando todas as extensões lado a lado.
| Código | Significado |
|---|---|
0 | Nenhum achado CRÍTICO ou ALTO |
1 | Pelo menos um achado ALTO |
2 | Pelo menos um achado CRÍTICO |
Isso torna simples o uso em pipelines de CI ou scripts shell:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "CRITICAL issues found!"; fi
HIGH.Maximilian Cornett
https://www.yourdev.net https://www.github.com/ernos
GNU General Public License - Esta ferramenta é destinada apenas a pesquisa de segurança e análise defensiva.
| Categoria | O Que Procura |
|---|
| Permissões | Permissões perigosas ou excessivamente amplas (nativeMessaging, <all_urls>, debugger, desktopCapture, etc.) |
| Política de Segurança de Conteúdo | unsafe-inline, unsafe-eval, fontes de script remotas na CSP |
| Ofuscação de JavaScript | eval(), atob(), abuso do construtor Function(), sequências de escape hex, remontagem split/join/reverse, literais de string codificados, setTimeout com argumentos de string |
| URLs Suspeitas | Domínios externos codificados classificados como conhecido-ruim (acerto na blocklist → ALTO), desconhecido (não na whitelist → MÉDIO) ou conhecido-bom (na whitelist → suprimido). Execute --update-blocklist para atualizar a blocklist de domínios a partir de URLhaus e da lista de Peter Lowe. |
| Credenciais e Segredos | Chaves de API, tokens (AWS, GitHub, Slack, Google), senhas, chaves privadas e endereços IP codificados |
| Payloads Base64 | Decodifica blobs base64 incorporados e os escaneia em busca de executáveis, scripts e código de rede |
| Esteganografia PNG | Detecta dados anexados após IEND do PNG e decodifica automaticamente o trailer (base64, zlib, gzip e combinações); os payloads decodificados são escaneados recursivamente em busca de ofuscação JS, credenciais e URLs suspeitas. Também detecta tipos de chunk desconhecidos, anomalias no canal LSB e entropia de pixel anormalmente alta |
| Metadados de Arquivo | Detecção de bytes mágicos de executáveis (.exe, .elf, .dylib), extensões duplas (ex.: photo.png.js), nomes de arquivo suspeitos (keylog, miner, wallet) |
| Arquivos Poliglotas | Arquivos que são simultaneamente válidos em dois formatos (ex.: HTML + ZIP) |
| Truques ZIP | Entradas de path traversal, bytes nulos em nomes de arquivo, entradas duplicadas que podem enganar parsers, comentários ZIP carregando payloads |
| Código Remoto | Páginas de fundo ou service workers carregados de URLs remotas |
| Alta Entropia | Arquivos ou literais de string com entropia suspeitamente alta (provavelmente payloads criptografados ou comprimidos) |
| Abuso de API | Chamadas de API de extensão de navegador que indicam roubo de dados ou exfiltração: cookies.getAll({}), tabs.query({}), history.search, listeners de teclado, leituras de área de transferência, scripting.executeScript com uma função dinâmica. Escala para CRÍTICO quando uma chamada de coleta de dados é pareada com um envio de rede de saída no mesmo arquivo. |
| Elementos Ocultos | Iframes invisíveis criados dinamicamente (display:none, dimensões zero) injetados no DOM — pings de afiliados silenciosos ou canais C2. Pixels de rastreamento via new Image().src apontando para URLs externas. |
| Bomba-Relógio | setTimeout/setInterval com atrasos ≥ 5 minutos; portas aritméticas Date.now(); verificações de data de instalação localStorage que ativam comportamento dias após a primeira execução; portas de limite Math.random() que disparam em apenas uma fração dos carregamentos de página. |
| Anti-Análise | Verificações de navigator.webdriver; comparações de janela com largura/altura zero; instruções debugger simples; aritmética performance.now() usada para detecção de sandbox baseada em tempo. |
| Flag | Descrição |
|---|
--update-blocklist | Busca listas de domínios atualizadas de URLhaus e da lista de servidores de anúncios/malware de Peter Lowe, mescla com o snapshot incluído e salva em blocklist.json ao lado do script. Sai após a atualização. |
targets | Um ou mais arquivos .xpi ou diretórios |
--min-severity | Filtra a saída: CRITICAL, HIGH, MEDIUM, LOW, INFO (padrão: INFO) |
--json | Emite os achados como um documento JSON em vez do relatório legível |
--verbose ou -v | Exibe o conteúdo de manifest.json e também inclui ~5 linhas de código ao redor do padrão suspeito encontrado |
--checks | Escaneia apenas estas categorias de verificação específicas (veja abaixo) |
| Categorias de verificação disponíveis | Descrição das verificações na categoria |
|---|
| permissions | Permissões de manifesto perigosas/amplas e problemas de CSP |
| remote-code | Páginas de fundo ou service workers carregados de URLs remotas |
| obfuscation | Truques de eval/atob/codificação, URLs suspeitas, strings de alta entropia |
| payloads | Blobs codificados em Base64 decodificados e escaneados em busca de executáveis/scripts |
| steganography | Dados anexados a PNG, chunks desconhecidos, análise de canal LSB |
| credentials | Chaves de API, tokens, senhas, chaves privadas, endereços IP codificados |
| file-meta | Bytes mágicos, extensões duplas, nomes de arquivo suspeitos, entropia de arquivo |
| polyglot | Arquivos válidos em dois formatos simultaneamente (ex.: HTML+ZIP) |
| zip-tricks | Path traversal, bytes nulos, entradas duplicadas, comentários ZIP |
| cross-file | Tokens de classe HTML referenciados cruzadamente com chaves de localStorage JS |
| api-abuse | Chamadas de API do navegador que indicam roubo de dados ou exfiltração (cookies, tabs, history, teclado, área de transferência). CRÍTICO quando coleta + envio de rede aparecem no mesmo arquivo. |
| hidden-elements | Injeção de iframe invisível e pixels de rastreamento. ALTO quando iframe está oculto + anexado ao DOM. |
| time-bomb | setTimeout com atraso longo, portas aritméticas Date.now(), data de instalação localStorage, limite Math.random(). |
| anti-analysis | navigator.webdriver, janela de tamanho zero, instrução debugger simples, aritmética performance.now(). |