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.
| 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. |
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