Una extensión integral de navegador (.xpi) para escanear malware que detecta muchas tácticas comunes de malware, como: robadores de credenciales, tácticas de ofuscación, esteganografía, payloads base64, trucos con zip, ejecución remota de código, trucos poliglotas y trucos de metadatos, con el objetivo de brindar al analista información sobre dónde se necesita un análisis más profundo.
Una herramienta de línea de comandos que analiza archivos de extensión de Firefox (.xpi) en busca de signos de malware, ofuscación, cargas ocultas, esteganografía y otras técnicas utilizadas para colar código malicioso más allá de los equipos de revisión de extensiones.
extension-scanner.py abre una extensión de Firefox y realiza una batería de comprobaciones de seguridad en cada archivo que contiene. Luego produce un informe codificado por colores con los hallazgos clasificados por gravedad.
| Categoría | Qué Busca |
|---|---|
| Permisos | Permisos peligrosos o excesivamente amplios (nativeMessaging, <all_urls>, debugger, desktopCapture, etc.) |
| Política de Seguridad de Contenido | unsafe-inline, unsafe-eval, fuentes de scripts remotos en CSP |
| Ofuscación de JavaScript | eval(), atob(), abuso del constructor Function(), secuencias de escape hexadecimal, reensamblaje split/join/reverse, literales de cadena codificados, setTimeout con argumentos de cadena |
| URLs sospechosas | Dominios externos codificados clasificados como conocidos-malos (coincidencia en lista de bloqueo → ALTO), desconocidos (no en lista blanca → MEDIO), o conocidos-buenos (en lista blanca → suprimido). Ejecute --update-blocklist para actualizar la lista de bloqueo de dominios desde URLhaus y la lista de Peter Lowe. |
| Credenciales y Secretos | Claves API, tokens (AWS, GitHub, Slack, Google), contraseñas, claves privadas y direcciones IP codificados |
| Cargas Base64 | Decodifica blobs base64 incrustados y los escanea en busca de ejecutables, scripts y código de red |
| Esteganografía PNG | Detecta datos adjuntos después de IEND de PNG y decodifica automáticamente el remolque (base64, zlib, gzip y combinaciones); las cargas decodificadas se escanean recursivamente en busca de ofuscación JS, credenciales y URL sospechosas. También detecta tipos de fragmentos desconocidos, anomalías en el canal LSB y entropía de píxeles inusualmente alta |
| Metadatos de Archivo | Detección de bytes mágicos de ejecutables (.exe, .elf, .dylib), extensiones dobles (ej. photo.png.js), nombres de archivo sospechosos (keylog, miner, wallet) |
| Archivos Políglotas | Archivos que son válidos simultáneamente en dos formatos (ej. HTML + ZIP) |
CRITICAL — Casi con certeza malicioso; se requiere investigación inmediataHIGH — Fuertemente sospechoso; merece una revisión cuidadosaMEDIUM — Potencialmente riesgoso; revisar en contextoLOW — Preocupación menor; informativoINFO — Metadatos (hash, tamaño de archivo, etc.)python3.11, python3.12 o python3.13**python3-venv** - Requerido si usas entornos virtualesUsando entornos virtuales:
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 esteganografía, instalación a nivel de sistema (de lo contrario 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
# Requerido para análisis de esteganografía LSB (opcional pero recomendado)
pip install pillow numpy
# OPCIÓN 1. Solo para el usuario actual:
# Habilita autocompletado de bash para un uso más sencillo (TAB para autocompletar comandos)
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
# OPCIÓN 2. Habilita autocompletado globalmente para todos los usuarios (Debería cargarse automáticamente desde tu .bashrc)
cp extension-scanner-completions /usr/share/bash-completion/completions
Si Pillow/NumPy no están instalados, la herramienta aún se ejecuta: las comprobaciones de LSB y entropía de píxeles simplemente se omiten y se imprime una advertencia.
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
| Bandera | Descripción |
|---|---|
--update-blocklist | Obtiene listas de dominios frescas de URLhaus y la lista de servidores de anuncios/malware de Peter Lowe, las fusiona con la instantánea incluida y las guarda en blocklist.json junto al script. Sale después de actualizar. |
targets | Uno o más archivos .xpi o directorios |
--min-severity | Filtrar salida: CRITICAL, HIGH, MEDIUM, LOW, INFO (por defecto: INFO) |
--json | Emitir hallazgos como un documento JSON en lugar del informe legible |
--verbose o -v | Imprime el contenido de manifest.json y también incluye aproximadamente 5 líneas de código alrededor del patrón sospechoso encontrado |
--checks | Escanear solo estas categorías de comprobación específicas (ver más abajo) |
| Categorías de comprobación disponibles | Descripción de las comprobaciones en la categoría |
|---|---|
| permissions | Permisos de manifiesto peligrosos/amplios y problemas de CSP |
| remote-code | Páginas de fondo o service workers cargados desde URL remotas |
| obfuscation | Trucos de eval/atob/codificación, URL sospechosas, cadenas de alta entropía |
| payloads | Blobs codificados en base64 decodificados y escaneados en busca de ejecutables/scripts |
| steganography | Datos adjuntos a PNG, fragmentos desconocidos, análisis de canal LSB |
| credentials | Claves API, tokens, contraseñas, claves privadas, direcciones IP codificados |
| file-meta | Bytes mágicos, extensiones dobles, nombres de archivo sospechosos, entropía de archivo |
| polyglot | Archivos válidos en dos formatos simultáneamente (ej. HTML+ZIP) |
| zip-tricks | Path traversal, bytes nulos, entradas duplicadas, comentarios ZIP |
| cross-file | Tokens de clase HTML referenciados cruzadamente con claves de localStorage JS |
| api-abuse | Llamadas a la API del navegador que indican robo o exfiltración de datos (cookies, pestañas, historial, teclado, portapapeles). CRÍTICO cuando la recolección y el envío de red aparecen en el mismo archivo. |
| hidden-elements | Inyección de iframes invisibles y píxeles de seguimiento. ALTO cuando el iframe está oculto y se añade al DOM. |
| time-bomb | setTimeout de retardo largo, compuertas aritméticas Date.now(), fecha de instalación en localStorage, umbral Math.random(). |
| anti-analysis | navigator.webdriver, ventana de tamaño cero, sentencia debugger simple, aritmética de performance.now(). |
════════════════════════════════════════════════════════════════════════════
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>']
…
Al analizar múltiples archivos, se imprime una tabla de comparación después de los informes individuales mostrando todas las extensiones lado a lado.
| Código | Significado |
|---|---|
0 | Sin hallazgos CRÍTICOS o ALTOS |
1 | Al menos un hallazgo ALTO |
2 | Al menos un hallazgo CRÍTICO |
Esto facilita su uso en tuberías CI o scripts de shell:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "CRITICAL issues found!"; fi
HIGH.Maximilian Cornett
GNU General Public License - Esta herramienta está destinada únicamente a la investigación de seguridad y análisis defensivo.
| Trucos ZIP |
| Entradas de path traversal, bytes nulos en nombres de archivo, entradas duplicadas que podrían engañar a los analizadores, comentarios ZIP con cargas |
| Código Remoto | Páginas en segundo plano o service workers cargados desde URL remotas |
| Alta Entropía | Archivos o literales de cadena con entropía sospechosamente alta (probables cargas cifradas o comprimidas) |
| Abuso de API | Llamadas a la API de extensiones del navegador que indican robo o exfiltración de datos: cookies.getAll({}), tabs.query({}), history.search, listeners de teclado, lecturas de portapapeles, scripting.executeScript con una función dinámica. Se eleva a CRÍTICO cuando una llamada de recolección de datos se combina con un envío de red saliente en el mismo archivo. |
| Elementos Ocultos | Iframes invisibles creados dinámicamente (display:none, dimensiones cero) inyectados en el DOM — pings de afiliados silenciosos o canales C2. Píxeles de seguimiento mediante new Image().src apuntando a URL externas. |
| Bomba de Tiempo | setTimeout/setInterval con retrasos ≥ 5 minutos; compuertas aritméticas Date.now(); comprobaciones de fecha de instalación en localStorage que activan comportamiento días después de la primera ejecución; compuertas de umbral Math.random() que se activan solo en una fracción de las cargas de página. |
| Anti-Análisis | Comprobaciones de navigator.webdriver; comparaciones de ventanas de ancho/alto cero; sentencias debugger simples; aritmética de performance.now() utilizada para detección de sandbox basada en tiempos. |