
إضافة متصفح شاملة لفحص البرمجيات الخبيثة لنوع الملفات (.xpi)، والتي تتحقق من العديد من الحيل الضارة الشائعة مثل: أساليب إخفاء سرقة بيانات الاعتماد، الإخفاء التقني (steganography)، حمولات base64، حيل الملفات المضغوطة (zip-tricks)، تنفيذ الأكواد عن بُعد، الحيل متعددة الأشكال (polyglot tricks)، وحيل البيانات الوصفية (meta data tricks)، في محاولة لتزويد المحلل بمعلومات حول المكان الذي يحتاج إلى تحليل أعمق.
أداة سطر أوامر تحلل ملفات إضافات Firefox (.xpi) بحثًا عن علامات البرامج الضارة، التعتيم، الحمولات المخفية، إخفاء المعلومات، وغيرها من التقنيات المستخدمة لتسلل الأكواد الضارة عبر فرق مراجعة الإضافات.
يقوم extension-scanner.py بفتح إضافة Firefox وتنفيذ سلسلة من فحوصات الأمان عبر كل ملف بداخلها. ثم ينتج تقريرًا ملونًا مع النتائج مرتبة حسب الخطورة.
CRITICAL — شبه مؤكد أنه ضار؛ يتطلب تحقيقًا فوريًاHIGH — مشبوه بقوة؛ يستدعي مراجعة دقيقةMEDIUM — يحتمل أن يكون خطيرًا؛ راجع في السياقLOW — شأن ثانوي؛ للمعلوماتINFO — بيانات وصفية (الرمز التجزئي، حجم الملف، إلخ)python3.11, python3.12 أو python3.13**python3-venv** - مطلوب إذا كنت تستخدم بيئات افتراضيةباستخدام البيئات الافتراضية:
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** - موصى به لإخفاء المعلومات، تثبيت على مستوى النظام (وإلا 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
إذا لم يتم تثبيت Pillow/NumPy تظل الأداة تعمل — يتم تخطي فحوصات LSB وانتروبيا البيكسل فقط، وتُطبع رسالة تحذير.
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
════════════════════════════════════════════════════════════════════════════
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>']
…
عند تحليل ملفات متعددة، يُطبع جدول مقارنة بعد التقارير الفردية يظهر جميع الإضافات جنبًا إلى جنب.
| الكود | المعنى |
|---|---|
0 | لا توجد نتائج CRITICAL أو HIGH |
1 | وجود نتيجة HIGH واحدة على الأقل |
2 | وجود نتيجة CRITICAL واحدة على الأقل |
هذا يجعل استخدامها في مسارات CI أو سكريبتات الصدفة مباشرًا:
python3 extension-scanner.py extension.xpi --min-severity HIGH
if [ $? -eq 2 ]; then echo "CRITICAL issues found!"; fi
HIGH.Maximilian Cornett
https://www.yourdev.net https://www.github.com/ernos
رخصة جنو العمومية العامة - هذه الأداة مخصصة فقط للبحث الأمني والتحليل الدفاعي.
| الفئة | ما تبحث عنه |
|---|
| الأذونات | أذونات خطيرة أو واسعة النطاق (nativeMessaging, <all_urls>, debugger, desktopCapture, إلخ) |
| سياسة أمان المحتوى | unsafe-inline, unsafe-eval, مصادر سكريبتات عن بُعد في CSP |
| تعتيم الجافاسكريبت | استخدام eval(), atob(), Function() منشئ الدوال، متتاليات هروب سداسية عشرية، إعادة تجميع split/join/reverse، حروف سلسلة مشفرة، setTimeout مع وسائط سلسلة نصية |
| عناوين URL مشبوهة | نطاقات خارجية مشفرة تصنف كـ معروفة-سيئة (إصابة بقائمة الحظر ← HIGH)، غير معروفة (ليست في القائمة البيضاء ← MEDIUM)، أو معروفة-جيدة (في القائمة البيضاء ← مكبوتة). قم بتشغيل --update-blocklist لتحديث قائمة حظر النطاقات من URLhaus وقائمة Peter Lowe. |
| بيانات الاعتماد والأسرار | مفاتيح API مشفرة، رموز (AWS، GitHub، Slack، Google)، كلمات مرور، مفاتيح خاصة، وعناوين IP |
| حمولات Base64 | فك تشفير قواعد base64 المضمنة وفحصها بحثًا عن ملفات تنفيذية، نصوص برمجية، وأكواد شبكة |
| إخفاء المعلومات في PNG | اكتشاف البيانات المضافة بعد IEND في PNG وفك تشفير الذيل تلقائيًا (base64, zlib, gzip ومزيجها)؛ يتم فحص الحمولات المفكوكة بشكل متكرر بحثًا عن تعتيم JS، بيانات اعتماد، وعناوين URL مشبوهة. يكشف أيضًا عن أنواع أجزاء غير معروفة، شذوذات قناة LSB، وانتروبيا بيكسل عالية بشكل غير طبيعي |
| بيانات الملفات الوصفية | اكتشاف بايتات سحرية للملفات التنفيذية (.exe, .elf, .dylib)، امتدادات مزدوجة (مثل photo.png.js)، أسماء ملفات مشبوهة (keylog, miner, wallet) |
| ملفات متعددة الصيغ | ملفات صالحة في صيغتين في نفس الوقت (مثل HTML + ZIP) |
| حيل ZIP | إدخالات تجتاز المسار، بايتات خالية في أسماء الملفات، إدخالات مكررة قد تخدع المحللات، تعليقات ZIP تحمل حمولات |
| كود عن بعد | صفحات الخلفية أو العاملات الخدمية المحملة من عناوين URL عن بعد |
| انتروبيا عالية | ملفات أو حروف سلسلة عالية الانتروبيا بشكل مريب (على الأرجح حمولات مشفرة أو مضغوطة) |
| إساءة استخدام واجهة برمجة التطبيقات | استدعاءات API لإضافات المتصفح تشير إلى سرقة البيانات أو تسريبها: cookies.getAll({}), tabs.query({}), history.search, مستقبلات لوحة المفاتيح، قراءات الحافظة، scripting.executeScript مع دالة ديناميكية. ترتفع إلى CRITICAL عندما يقترن استدعاء جمع البيانات بإرسال شبكة خارجية في نفس الملف. |
| عناصر مخفية | iframes غير مرئية (مثل display:none، أبعاد صفرية) تُنشأ ديناميكيًا وتُحقن في DOM — إشارات تابعة صامتة أو قنوات تحكم. بيكسلات تتبع عبر new Image().src تشير إلى عناوين URL خارجية. |
| قنبلة زمنية | setTimeout/setInterval مع تأخير ≥ 5 دقائق؛ بوابات حسابية Date.now()؛ فحوصات تاريخ التثبيت في localStorage تنشط السلوك بعد أيام من التشغيل الأول؛ بوابات عتبة Math.random() تُشغل على جزء فقط من تحميلات الصفحات. |
| مكافحة التحليل | فحوصات navigator.webdriver؛ مقارنات نافذة بعرض/ارتفاع صفري؛ تعليمات debugger عارية؛ حساب performance.now() المستخدم لاكتشاف الصندوق الرملي بالاعتماد على التوقيت. |
| العلامة | الوصف |
|---|
--update-blocklist | جلب قوائم النطاقات الجديدة من URLhaus وقائمة خوادم الإعلانات/البرامج الضارة لـ Peter Lowe، دمجها مع اللقطة المجمعة، وحفظها في blocklist.json بجوار السكريبت. يخرج بعد التحديث. |
targets | ملف أو أكثر من ملفات .xpi أو أدلة |
--min-severity | تصفية المخرجات: CRITICAL, HIGH, MEDIUM, LOW, INFO (الافتراضي: INFO) |
--json | إخراج النتائج كمستند JSON بدلاً من التقرير المقروء |
--verbose أو -v | طباعة محتويات manifest.json وكذلك تضمين ~5 أسطر من الكود حول النمط المشبوه الذي تم العثور عليه |
--checks | المسح فقط لفئات الفحص المحددة هذه (انظر أدناه) |
| فئات الفحص المتاحة | وصف الفحوصات في الفئة |
|---|
| permissions | أذونات بيان خطيرة/واسعة ومشكلات CSP |
| remote-code | صفحات الخلفية أو العاملات الخدمية المحملة من عناوين URL عن بعد |
| obfuscation | حيل eval/atob/تشفير، عناوين URL مشبوهة، سلاسل عالية الانتروبيا |
| payloads | كتل مشفرة بـ Base64 يتم فكها وفحصها بحثًا عن ملفات تنفيذية/نصوص برمجية |
| steganography | بيانات مضافة في PNG، أجزاء غير معروفة، تحليل قناة LSB |
| credentials | مفاتيح API مشفرة، رموز، كلمات مرور، مفاتيح خاصة، عناوين IP |
| file-meta | بايتات سحرية، امتدادات مزدوجة، أسماء ملفات مشبوهة، انتروبيا الملف |
| polyglot | ملفات صالحة في صيغتين في وقت واحد (مثل HTML+ZIP) |
| zip-tricks | تجاوز المسار، بايتات خالية، إدخالات مكررة، تعليقات ZIP |
| cross-file | رموز فئة HTML مترابطة مع مفاتيح localStorage في JS |
| api-abuse | استدعاءات API للمتصفح تشير إلى سرقة بيانات أو تسريب (cookies, tabs, history, keyboard, clipboard). تُرفع إلى CRITICAL عندما يظهر الجمع + الإرسال الشبكي في نفس الملف. |
| hidden-elements | حقن iframe غير مرئي وبيكسلات تتبع. تُرفع إلى HIGH عندما يكون iframe مخفيًا + ملحق بـ DOM. |
| time-bomb | setTimeout بتأخير طويل، بوابات Date.now() حسابية، تاريخ تثبيت localStorage، عتبة Math.random(). |
| anti-analysis | navigator.webdriver، نافذة بحجم صفري، تعليمة debugger عارية، حساب performance.now(). |