Uno scanner completo di malware per estensioni del browser (.xpi) che controlla molti trucchi comuni dei malware come:, tattiche di offuscamento dei furti di credenziali, steganografia, payload in base64, trucchi zip, esecuzione remota di codice, trucchi poliglotti, trucchi dei metadati, nel tentativo di fornire all'analista informazioni su dove è necessaria un'analisi più approfondita.
Uno strumento da riga di comando che analizza i file di estensione di Firefox (.xpi) alla ricerca di segni di malware, offuscamento, payload nascosti, steganografia e altre tecniche utilizzate per introdurre codice malevolo oltre i team di revisione delle estensioni.
extension-scanner.py apre un'estensione di Firefox ed esegue una batteria di controlli di sicurezza su ogni file al suo interno. Quindi produce un report con codice colore con i risultati classificati per gravità.
| Categoria | Cosa Cerca |
|---|---|
| Permessi | Permessi pericolosi o eccessivamente ampi (nativeMessaging, <all_urls>, debugger, desktopCapture, ecc.) |
| Content Security Policy | unsafe-inline, unsafe-eval, sorgenti di script remoti nel CSP |
| Offuscamento JavaScript | eval(), atob(), abuso del costruttore Function(), sequenze di escape hex, riassemblaggio split/join/reverse, stringhe letterali codificate, setTimeout con argomenti stringa |
| URL Sospetti | Domini esterni hardcoded classificati come noti-cattivi (hit nella blocklist → ALTO), sconosciuti (non nella allowlist → MEDIO), o noti-buoni (in allowlist → soppressi). Esegui --update-blocklist per aggiornare la blocklist dei domini da URLhaus e dalla lista di Peter Lowe. |
| Credenziali e Segreti | Chiavi API hardcoded, token (AWS, GitHub, Slack, Google), password, chiavi private e indirizzi IP |
| Payload Base64 | Decodifica blob base64 incorporati e li scannerizza per eseguibili, script e codice di rete |
| Steganografia PNG | Rileva dati aggiunti dopo il marker PNG IEND e decodifica automaticamente il trailer (base64, zlib, gzip e combinazioni); i payload decodificati vengono scansionati ricorsivamente per offuscamento JS, credenziali e URL sospetti. Rileva anche tipi di chunk sconosciuti, anomalie nei canali LSB ed entropia dei pixel insolitamente alta |
| Metadati File | Rilevamento dei magic byte di eseguibili (.exe, .elf, .dylib), doppie estensioni (es. photo.png.js), nomi di file sospetti (keylog, miner, wallet) |
| File Poliglotti | File validi contemporaneamente in due formati (es. HTML + ZIP) |
| Trucchi ZIP | Voci con path traversal, byte nulli nei nomi file, voci duplicate che potrebbero ingannare i parser, commenti ZIP contenenti payload |
CRITICO — Quasi certamente malevolo; indagine immediata richiestaALTO — Fortemente sospetto; merita un'attenta revisioneMEDIO — Potenzialmente rischioso; rivedere nel contestoBASSO — Preoccupazione minore; informativoINFO — Metadati (hash, dimensione file, ecc.)python3.11, python3.12 o python3.13python3-venv - Richiesto se si utilizzano ambienti virtualiUtilizzo di ambienti virtuali:
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 - Raccomandato per la steganografia, installazione a livello di sistema (altrimenti 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
# Richiesto per l'analisi della steganografia LSB (opzionale ma raccomandato)
pip install pillow numpy
# OPZIONE 1. Solo per l'utente corrente:
# Abilita i completamenti bash per un uso più semplice (TAB per completamento automatico dei comandi)
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
# OPZIONE 2. Abilita i completamenti globalmente per tutti gli utenti (dovrebbe essere auto-sourced dal tuo .bashrc)
cp extension-scanner-completions /usr/share/bash-completion/completions
Se Pillow/NumPy non sono installati, lo strumento funziona comunque: i controlli LSB e di entropia dei pixel vengono semplicemente saltati e viene stampato un avviso.
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
| Flag | Descrizione |
|---|---|
--update-blocklist | Recupera elenchi di domini freschi da URLhaus e dalla lista di server pubblicitari/malware di Peter Lowe, li unisce con lo snapshot incluso e li salva in blocklist.json accanto allo script. Esce dopo l'aggiornamento. |
targets | Uno o più file .xpi o directory |
--min-severity | Filtra l'output: CRITICAL, HIGH, MEDIUM, LOW, INFO (default: INFO) |
--json | Emette i risultati come documento JSON invece del report leggibile |
--verbose o -v | Stampa il contenuto di manifest.json e include anche circa 5 righe di codice intorno allo schema sospetto trovato |
--checks | Esegue la scansione solo per queste categorie di controlli specifiche (vedi sotto) |
| Categorie di controlli disponibili | Descrizione dei controlli nella categoria |
|---|---|
| permissions | Permessi del manifest pericolosi/ampi e problemi CSP |
| remote-code | Pagine di background o service worker caricati da URL remoti |
| obfuscation | Trucchi eval/atob/codifica, URL sospetti, stringhe ad alta entropia |
| payloads | Blob codificati in Base64 decodificati e scansionati per eseguibili/script |
| steganography | Dati aggiunti PNG, chunk sconosciuti, analisi canale LSB |
| credentials | Chiavi API hardcoded, token, password, chiavi private, indirizzi IP |
| file-meta | Magic byte, doppie estensioni, nomi file sospetti, entropia file |
| polyglot | File validi in due formati contemporaneamente (es. HTML+ZIP) |
| zip-tricks | Path traversal, byte nulli, voci duplicate, commenti ZIP |
| cross-file | Token di classe HTML incrociati con chiavi localStorage JS |
| api-abuse | Chiamate API del browser che indicano furto o esfiltrazione di dati (cookies, tabs, history, tastiera, clipboard). CRITICO quando raccolta + invio di rete appaiono nello stesso file. |
| hidden-elements | Iniezione di iframe invisibili e pixel di tracciamento. ALTO quando iframe è nascosto + aggiunto al DOM. |
| time-bomb | setTimeout con lungo ritardo, gate aritmetici Date.now(), data di installazione localStorage, soglia Math.random(). |
| anti-analysis | navigator.webdriver, finestra di dimensione zero, dichiarazione debugger nuda, aritmetica performance.now(). |
════════════════════════════════════════════════════════════════════════════
XPI ANALYZER — example.xpi
════════════════════════════════════════════════════════════════════════════
Verdetto complessivo: ALTO RISCHIO
Risultati: 1 CRITICO 3 ALTO 2 MEDIO 1 BASSO
── CRITICO ────────────────────────────────────────────────────────────
[CRITICO ] [JS_OBFUSCATION] content.js
Chiamata eval() — può eseguire codice arbitrario da stringhe
Evidenza: var x = eval(atob("dmFyIGE9MTs…"))
── ALTO ────────────────────────────────────────────────────────────────
[ALTO ] [PERMISSION] manifest.json
Permesso pericoloso: 'nativeMessaging' — Può avviare OS nativo …
Evidenza: permissions: ['nativeMessaging', 'storage', '<all_urls>']
…
Quando si analizzano più file, dopo i report individuali viene stampata una tabella di confronto che mostra tutte le estensioni affiancate.
| Codice | Significato |
|---|---|
0 | Nessun risultato CRITICO o ALTO |
1 | Almeno un risultato ALTO |
2 | Almeno un risultato CRITICO |
Ciò rende semplice l'uso in pipeline CI o script shell:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "Trovati problemi CRITICI!"; fi
ALTO.Maximilian Cornett
GNU General Public License - Questo strumento è destinato esclusivamente alla ricerca sulla sicurezza e all'analisi difensiva.
| Codice Remoto | Pagine di background o service worker caricati da URL remoti |
| Alta Entropia | File o stringhe letterali con entropia sospettosamente alta (payload probabilmente crittografati o compressi) |
| Abuso API | Chiamate API delle estensioni browser che indicano furto di dati o esfiltrazione: cookies.getAll({}), tabs.query({}), history.search, listener di tastiera, letture clipboard, scripting.executeScript con funzione dinamica. Viene elevato a CRITICO quando una chiamata di raccolta dati è abbinata a un invio di rete in uscita nello stesso file. |
| Elementi Nascosti | Iframe invisibili creati dinamicamente (display:none, dimensioni zero) iniettati nel DOM — ping silenziosi di affiliazione o canali C2. Pixel di tracciamento tramite new Image().src che puntano a URL esterni. |
| Bomba a Tempo | setTimeout/setInterval con ritardi ≥ 5 minuti; gate aritmetici Date.now(); controlli di data di installazione in localStorage che attivano comportamenti giorni dopo la prima esecuzione; gate di soglia Math.random() che si attivano solo su una frazione dei caricamenti pagina. |
| Anti-Analisi | Controlli navigator.webdriver; confronti di finestre con larghezza/altezza zero; dichiarazioni debugger nude; aritmetica performance.now() utilizzata per rilevamento sandbox basato su temporizzazione. |