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