Ein umfassender Browser-Erweiterungs-Malware-Scanner (.xpi), der nach vielen häufigen Malware-Tricks sucht, wie: Verschleierungstaktiken von Credential-Stealern, Steganografie, Base64-Payloads, Zip-Tricks, Remote-Codeausführung, Polyglot-Tricks und Metadaten-Tricks, um dem Analysten Informationen darüber zu geben, wo eine tiefere Analyse erforderlich ist.
Ein Kommandozeilen-Tool, das Firefox-Erweiterungsdateien (.xpi) auf Anzeichen von Malware, Verschleierung, versteckten Nutzdaten, Steganografie und andere Techniken untersucht, die verwendet werden, um bösartigen Code an Erweiterungs-Review-Teams vorbeizuschleusen.
extension-scanner.py öffnet eine Firefox-Erweiterung und führt eine Reihe von Sicherheitsprüfungen für jede darin enthaltene Datei durch. Anschließend wird ein farblich codierter Bericht mit nach Schweregrad geordneten Ergebnissen erstellt.
| Kategorie | Worauf geprüft wird |
|---|---|
| Berechtigungen | Gefährliche oder übermäßig weitreichende Berechtigungen (nativeMessaging, <all_urls>, debugger, desktopCapture usw.) |
| Content Security Policy | unsafe-inline, unsafe-eval, entfernte Skriptquellen in CSP |
| JavaScript-Verschleierung | eval(), atob(), Missbrauch des Function()-Konstruktors, Hex-Escape-Sequenzen, split/join/reverse-Zusammenbau, kodierte Stringliterale, setTimeout mit String-Argumenten |
| Verdächtige URLs | Hartcodierte externe Domains, klassifiziert als bekannt-schlecht (Blocklist-Treffer → HIGH), unbekannt (nicht auf Whitelist → MEDIUM) oder bekannt-gut (whitelisted → unterdrückt). Führen Sie --update-blocklist aus, um die Domain-Blocklist von URLhaus und Peter Lowes Liste zu aktualisieren. |
| Anmeldedaten & Geheimnisse | Hartcodierte API-Schlüssel, Tokens (AWS, GitHub, Slack, Google), Passwörter, private Schlüssel und IP-Adressen |
| Base64-Nutzlasten | Dekodiert eingebettete Base64-Blöcke und scannt sie nach ausführbaren Dateien, Skripten und Netzwerkcode |
| PNG-Steganografie | Erkennt Daten, die nach PNG IEND angehängt wurden, und dekodiert automatisch den Anhang (base64, zlib, gzip und Kombinationen); dekodierte Nutzlasten werden rekursiv nach JS-Verschleierung, Anmeldedaten und verdächtigen URLs durchsucht. Erkennt auch unbekannte Chunk-Typen, LSB-Kanalanomalien und ungewöhnlich hohe Pixelentropie |
| Dateimetadaten | Magic-Byte-Erkennung von ausführbaren Dateien (.exe, .elf, .dylib), doppelte Erweiterungen (z. B. photo.png.js), verdächtige Dateinamen (keylog, miner, wallet) |
| Polyglot-Dateien | Dateien, die gleichzeitig in zwei Formaten gültig sind (z. B. HTML + ZIP) |
| ZIP-Tricks |
CRITICAL — Fast sicher bösartig; sofortige Untersuchung erforderlichHIGH — Stark verdächtig; sorgfältige Überprüfung erforderlichMEDIUM — Potenziell riskant; im Kontext überprüfenLOW — Geringes Problem; informativINFO — Metadaten (Hash, Dateigröße usw.)python3.11, python3.12 oder python3.13**python3-venv** - Erforderlich, wenn Sie virtuelle Umgebungen verwendenVerwendung virtueller Umgebungen:
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** - Empfohlen für Steganografie, systemweite Installation (andernfalls 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
Wenn Pillow/NumPy nicht installiert sind, läuft das Tool trotzdem – LSB- und Pixelentropie-Prüfungen werden einfach übersprungen, und eine Warnung wird ausgegeben.
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 | Beschreibung |
|---|---|
--update-blocklist | Ruft frische Domainlisten von URLhaus und Peter Lowes Werbe-/Malware-Serverliste ab, führt sie mit der mitgelieferten Momentaufnahme zusammen und speichert sie in blocklist.json neben dem Skript. Beendet nach der Aktualisierung. |
targets | Eine oder mehrere .xpi-Dateien oder Verzeichnisse |
--min-severity | Ausgabe filtern: CRITICAL, HIGH, MEDIUM, LOW, INFO (Standard: INFO) |
--json | Ergebnisse als JSON-Dokument ausgeben anstelle des menschenlesbaren Berichts |
--verbose oder -v | Gibt den Inhalt von manifest.json aus und enthält auch etwa 5 Codezeilen um jedes verdächtige Muster herum |
--checks | Nur nach diesen spezifischen Prüfkategorien scannen (siehe unten) |
| Verfügbare Prüfkategorien | Beschreibung der Prüfungen in der Kategorie |
|---|---|
| permissions | Gefährliche/weitreichende Manifest-Berechtigungen und CSP-Probleme |
| remote-code | Hintergrundseiten oder Service Worker, die von entfernten URLs geladen werden |
| obfuscation | eval/atob/Kodierungstricks, verdächtige URLs, Zeichenfolgen mit hoher Entropie |
| payloads | Base64-kodierte Blöcke dekodiert und auf ausführbare Dateien/Skripte gescannt |
| steganography | An PNG angehängte Daten, unbekannte Chunks, LSB-Kanalanalyse |
| credentials | Hartcodierte API-Schlüssel, Tokens, Passwörter, private Schlüssel, IP-Adressen |
| file-meta | Magic Bytes, doppelte Erweiterungen, verdächtige Dateinamen, Dateientropie |
| polyglot | Dateien, die gleichzeitig in zwei Formaten gültig sind (z. B. HTML+ZIP) |
| zip-tricks | Path Traversal, Nullbytes, doppelte Einträge, ZIP-Kommentare |
| cross-file | HTML-Klasse-Token, die mit JS-localStorage-Schlüsseln kreuzreferenziert werden |
| api-abuse | Browser-API-Aufrufe, die auf Datendiebstahl oder -exfiltration hindeuten (Cookies, Tabs, Verlauf, Tastatur, Zwischenablage). KRITISCH, wenn Sammlung + Netzwerksenden in derselben Datei auftreten. |
| hidden-elements | Unsichtbare Iframe-Injektion und Tracking-Pixel. HOCH, wenn iframe versteckt + an DOM angehängt ist. |
| time-bomb | setTimeout mit langer Verzögerung, Date.now()-Arithmetik-Gatter, localStorage-Installationsdatum, Math.random()-Schwellenwert. |
| anti-analysis | navigator.webdriver, Fenster mit Nullgröße, nackte debugger-Anweisung, performance.now()-Arithmetik. |
════════════════════════════════════════════════════════════════════════════
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>']
…
Bei der Analyse mehrerer Dateien wird nach den einzelnen Berichten eine Vergleichstabelle ausgegeben, die alle Erweiterungen nebeneinander zeigt.
| Code | Bedeutung |
|---|---|
0 | Keine KRITISCHEN oder HOHEN Ergebnisse |
1 | Mindestens ein HOCH-Ergebnis |
2 | Mindestens ein KRITISCHES Ergebnis |
Dies macht die Verwendung in CI-Pipelines oder Shell-Skripten einfach:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "CRITICAL issues found!"; fi
HIGH-Ergebnisse erscheinen.Maximilian Cornett
GNU General Public License – Dieses Tool ist nur für Sicherheitsforschung und defensive Analysen bestimmt.
| Path-Traversal-Einträge, Nullbytes in Dateinamen, doppelte Einträge, die Parser täuschen könnten, Nutzlast-tragende ZIP-Kommentare |
| Remote-Code | Hintergrundseiten oder Service Worker, die von entfernten URLs geladen werden |
| Hohe Entropie | Dateien oder Stringliterale mit verdächtig hoher Entropie (wahrscheinlich verschlüsselte oder komprimierte Nutzlasten) |
| API-Missbrauch | API-Aufrufe von Browsererweiterungen, die auf Datendiebstahl oder -exfiltration hindeuten: cookies.getAll({}), tabs.query({}), history.search, Tastatur-Listener, Zwischenablage-Lesen, scripting.executeScript mit einer dynamischen Funktion. Wird auf KRITISCH hochgestuft, wenn ein Datensammlungsaufruf mit einem ausgehenden Netzwerksenden in derselben Datei gepaart ist. |
| Versteckte Elemente | Dynamisch erstellte unsichtbare Iframes (display:none, Nullabmessungen), die in das DOM injiziert werden – stille Affiliate-Pings oder C2-Kanäle. Tracking-Pixel über new Image().src, die auf externe URLs verweisen. |
| Zeitbombe | setTimeout/setInterval mit Verzögerungen ≥ 5 Minuten; Date.now()-Arithmetik-Gatter; localStorage-Installationsdatum-Prüfungen, die Verhalten Tage nach dem ersten Start aktivieren; Math.random()-Schwellenwertgatter, die nur bei einem Bruchteil der Seitenaufrufe auslösen. |
| Anti-Analyse | navigator.webdriver-Prüfungen; Fenstervergleiche mit Nullbreite/-höhe; nackte debugger-Anweisungen; performance.now()-Arithmetik zur zeitbasierten Sandbox-Erkennung. |