
راقب نشاط البلوتوث في حيك المحلي
جوار البلوتوث - تتبّع أجهزة BLE في منطقتك وحلّل أنماط حركة المرور.
تحذير: برنامج في مرحلة ألفا
هذا المشروع في مرحلة تطوير مبكرة وغير جاهز للاستخدام الإنتاجي. قد تتغير الميزات أو تتعطل أو تُزال دون إشعار. استخدمه على مسؤوليتك الخاصة. يجب التعامل مع البيانات المجمّعة على أنها تجريبية.
لوحة التحكم الرئيسية تعرض قائمة الأجهزة مع التصفية والبحث والإحصاءات الفورية
صفحة الإعدادات بتبويبات — التنبيهات، العمليات، المجموعات، والأمان
صفحة المعلومات مع تفاصيل المشروع ونظرة عامة على الإمكانات
استُلهم هذا المشروع من ثغرة WhisperPair (CVE-2025-36911)، التي أبرزت مخاطر الخصوصية في أجهزة البلوتوث.
تحيط بنا آلاف أجهزة البلوتوث في كل الأوقات: الهواتف، السيارات، أجهزة التلفاز، السماعات، المعينات السمعية، مركبات التوصيل، وغيرها. يوضّح Bluehood مدى سهولة الكشف السلبي عن هذه الأجهزة وملاحظة الأنماط في حضورها.
مع بيانات كافية، يمكنك نظريًا:
يمكن لهذه البيانات الوصفية أن تكشف معلومات شخصية بشكل مفاجئ دون أي تفاعل نشط مع الأجهزة.
Bluehood أداة تعليمية لرفع الوعي حول خصوصية البلوتوث. إنه مشروع نهاية أسبوع، لكن آثاره تستحق التفكير.
Bluehood هو ماسح بلوتوث يقوم بـ:
? للعرض)المتطلبات المسبقة — مضيفات Linux فقط
يتواصل Bluehood مع محوّل البلوتوث لديك عبر BlueZ، حزمة البلوتوث في Linux. يجب تثبيت BlueZ وتشغيله على المضيف قبل بدء الحاوية — صورة Docker نفسها لا تتضمنه.
# Debian / Ubuntu (including Ubuntu Server) sudo apt install bluez sudo systemctl enable --now bluetooth # Arch Linux sudo pacman -S bluez bluez-utils sudo systemctl enable --now bluetoothبدون BlueZ على المضيف سترى خطأً مثل:
BLE scan error: [org.freedesktop.DBus.Error.ServiceUnknown] The name org.bluez was not provided by any .service files
# Create a docker-compose.yml or download the one from this repo
# Then start with Docker Compose
docker compose up -d
# View logs
docker compose logs -f
صورة Docker متاحة على GitHub Container Registry:
ghcr.io/dannymcc/bluehood:latest
ستكون لوحة تحكم الويب متاحة على http://localhost:8080
sudo apt install bluez && sudo systemctl enable --now bluetooth)ملاحظة: المحوّلات الأقدم (Bluetooth 2.x/3.x) لا تدعم مسح BLE. إذا كان محوّلك يفتقر إلى دعم دور BLE Central، سترى:
No Bluetooth adapters with BLE 'central' role found.
ملاحظة: يعمل Docker في الوضع المميّز مع شبكات المضيف للوصول إلى البلوتوث. هذا مطلوب لمسح BLE.
يتطلب Bluehood محوّل بلوتوث يدعم BLE (Bluetooth 4.0 أو أحدث) مع دعم دور Central. محوّلات Bluetooth 2.x/3.x الأقدم لا تدعم مسح BLE ولن تعمل.
إذا كان محوّلك لا يدعم دور BLE Central، سيخرج Bluehood مع:
No Bluetooth adapters with BLE 'central' role found
يمكنك التحقق من إمكانات محوّلك باستخدام bluetoothctl show والبحث عن central في الأدوار المدعومة.
# Install system dependencies (Arch Linux)
sudo pacman -S bluez bluez-utils python-pip
# Install system dependencies (Debian/Ubuntu)
sudo apt install bluez python3-pip
# Clone and install
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
pip install -e .
يتطلب مسح البلوتوث صلاحيات مرتفعة. اختر أحد الخيارات:
التشغيل كـ root (الأبسط):
sudo bluehood
منح الصلاحيات لـ Python:
sudo setcap 'cap_net_admin,cap_net_raw+eip' $(readlink -f $(which python))
bluehood
استخدام خدمة systemd (موصى به للتشغيل الدائم):
sudo cp bluehood.service /etc/systemd/system/
sudo systemctl daemon-reload
sudo systemctl enable --now bluehood
يعمل Bluehood أصليًا على macOS دون Docker. يستخدم macOS مكتبة CoreBluetooth بدلًا من BlueZ، وهو ما تتعامل معه مكتبة bleak تلقائيًا.
# Clone the repository
git clone https://github.com/dannymcc/bluehood.git
cd bluehood
# Create a virtual environment
python3 -m venv .venv
source .venv/bin/activate
# Install
pip install -e .
# Run
python -m bluehood.daemon
ستكون لوحة تحكم الويب متاحة على http://localhost:8080
ملاحظة: عند التشغيل الأول، سيطالبك macOS بالسماح بالوصول إلى البلوتوث. يجب منح هذا الإذن ليعمل المسح.
# Start with web dashboard (default port 8080)
bluehood
# Specify a different port (or set BLUEHOOD_PORT)
bluehood --port 9000
# Use a specific Bluetooth adapter
bluehood --adapter hci1
# Use separate adapters for BLE and classic scanning (concurrent)
bluehood --adapter hci0 --classic-adapter hci1
# List available adapters
bluehood --list-adapters
# Disable web dashboard (scanning only)
bluehood --no-web
# Enable Prometheus metrics exporter on port 9199
bluehood --metrics-port 9199
توفّر لوحة التحكم:
/settings#operations)فعّل وضع لقطة الشاشة من الشريط الجانبي لإخفاء البيانات الحساسة قبل مشاركة لقطات الشاشة:
AA:BB:XX:XX:XX:XX)Da********)يمكن لـ Bluehood إرسال إشعارات فورية عبر ntfy، وهي خدمة إشعارات مجانية ومفتوحة المصدر. يمكنك استخدام خادم ntfy.sh العام أو نسختك المستضافة ذاتيًا.
bluehood-myname-alerts)، أو على خادم ntfy الخاص بكhttps://ntfy.sh)، واسم الموضوع، ورمز وصول إذا كان خادمك يتطلبه، ثم فعّل الإشعاراتتُخزَّن البيانات في ~/.local/share/bluehood/bluehood.db (SQLite).
تجاوز الموقع بمتغيرات البيئة:
BLUEHOOD_DATA_DIR - دليل ملفات البياناتBLUEHOOD_DB_PATH - مسار مباشر لملف قاعدة البياناتملاحظة: يمكن تهيئة إعدادات نبضة التحقق والتقليم من واجهة الويب (Settings > Operations) أو عبر متغيرات البيئة. قيم الواجهة الرسومية لها الأولوية على متغيرات البيئة.
يصنّف Bluehood الأجهزة باستخدام إشارات متعددة (بترتيب الأولوية):
تقوم الأجهزة الحديثة بتعشويم عناوين MAC لأغراض الخصوصية. يقوم Bluehood بـ:
يحلّل Bluehood الطوابع الزمنية للمشاهدات لكشف الأنماط:
أمثلة على الأنماط: "يومي، مساءً (5PM-9PM)"، "أيام الأسبوع، صباحًا (8AM-12PM)"
يكشف Bluehood الأجهزة التي تظهر معًا بشكل متكرر ضمن نافذة زمنية قابلة للتهيئة. يمكن أن يكشف هذا عن:
بناءً على قوة إشارة RSSI، تُصنَّف الأجهزة إلى مناطق قرب:
يتتبّع المدة التي تقضيها الأجهزة في النطاق من خلال تحليل الفجوات بين المشاهدات. يحدد عتبة فجوة قابلة للتهيئة (الافتراضي 15 دقيقة) متى تبدأ "جلسة" جديدة.
يمكن لـ Bluehood كشف المقاييس لجمع Prometheus. فعّلها بضبط متغير البيئة BLUEHOOD_METRICS_PORT أو علامة CLI --metrics-port.
# Via environment variable
export BLUEHOOD_METRICS_PORT=9199
# Via CLI
bluehood --metrics-port 9199
تُقدَّم المقاييس على http://host:9199/metrics.
تتضمن لوحة تحكم Grafana جاهزة للاستيراد في grafana/bluehood-dashboard.json. استوردها عبر واجهة Grafana (Dashboards > Import) أو الواجهة البرمجية:
curl -X POST "http://localhost:3000/api/dashboards/db" \
-H "Authorization: Bearer <your-api-key>" \
-H "Content-Type: application/json" \
-d "{\"dashboard\": $(cat grafana/bluehood-dashboard.json), \"overwrite\": true}"
bluetoothctl power onbluehood --list-adaptersBLE scan error: org.freedesktop.DBus.Error.ServiceUnknown / The name org.bluez was not provided
BlueZ غير مثبّت أو لا يعمل على المضيف. الإصلاح:
sudo apt install bluez # Debian/Ubuntu
sudo systemctl enable --now bluetooth
docker compose restart
قائمة التحقق العامة:
systemctl status bluetoothbluetoothctl listالمساهمات مرحّب بها! يرجى فتح issue أو PR على GitHub.
رخصة MIT - راجع LICENSE للتفاصيل.
هذه الأداة لأغراض تعليمية فقط. كن مراعيًا لقوانين الخصوصية في نطاق اختصاصك عند مراقبة أجهزة البلوتوث. المؤلف غير مسؤول عن أي إساءة استخدام لهذا البرنامج.
أنشأه Danny McClelland
| Variable | Default | Description |
|---|
PUID | 1000 | UID لمستخدم الحاوية — اضبطه ليطابق مستخدم المضيف لديك (id -u) عند استخدام bind mounts |
PGID | 1000 | GID لمستخدم الحاوية — اضبطه ليطابق مجموعة المضيف لديك (id -g) عند استخدام bind mounts |
TZ | UTC | المنطقة الزمنية للحاوية (مثل Europe/London) |
BLUEHOOD_ADAPTER | auto | محوّل البلوتوث لمسح BLE (مثل hci0) |
BLUEHOOD_CLASSIC_ADAPTER | same as BLUEHOOD_ADAPTER | محوّل منفصل لمسح Classic Bluetooth (مثل hci1). عند ضبطه على محوّل مختلف، يعمل مسح BLE و Classic بشكل متزامن. |
BLUEHOOD_DATA_DIR | /data | دليل تخزين قاعدة البيانات |
BLUEHOOD_PORT | 8080 | منفذ لوحة تحكم الويب. تستخدم الحاوية شبكات المضيف، لذا غيّر هذا (بدلًا من تعيين منفذ) إذا كان 8080 مشغولًا |
BLUEHOOD_NTFY_SERVER | https://ntfy.sh | عنوان URL الأساسي لخادم ntfy للإشعارات الفورية؛ وجّهه إلى نسخة مستضافة ذاتيًا. القيمة المحفوظة في صفحة الإعدادات لها الأولوية |
BLUEHOOD_METRICS_PORT | disabled | منفذ مقاييس Prometheus (مثل 9199) |
BLUEHOOD_HEARTBEAT_URL | disabled | عنوان URL لإرسال نبضات التحقق عبر POST (مثل عنوان URL للدفع من healthchecks.io أو uptime-kuma) |
BLUEHOOD_HEARTBEAT_INTERVAL | 300 | الثواني بين نبضات التحقق |
BLUEHOOD_PRUNE_DAYS | 0 (disabled) | حذف تلقائي للمشاهدات الأقدم من N يوم لتحرير التخزين |
BLUEHOOD_PRUNE_MIN_SIGHTINGS | 0 (disabled) | عند >0، قلّم الأجهزة القديمة بالكامل (الأقدم من BLUEHOOD_PRUNE_DAYS وبإجمالي مشاهدات أقل من N) بدلًا من تقليم صفوف المشاهدات القديمة فقط؛ الأجهزة المراقَبة لا تُقلَّم أبدًا |
| Key | Action |
|---|
/ | Focus search bar |
r | Refresh device list |
c | Toggle compact view |
w | Toggle watch on selected device |
Esc | Close modal |
? | Show keyboard shortcuts |
| Metric | Type | Description |
|---|
bluehood_scans_total | Counter | إجمالي دورات المسح المكتملة |
bluehood_scan_errors_total | Counter | أخطاء المسح (التسمية: scan_type) |
bluehood_sightings_total | Counter | إجمالي مشاهدات الأجهزة المسجّلة |
bluehood_new_devices_total | Counter | الأجهزة الفريدة الجديدة المكتشفة |
bluehood_last_scan_devices | Gauge | الأجهزة في آخر مسح (التسمية: scan_type) |
bluehood_devices_total | Gauge | الأجهزة الفريدة في قاعدة البيانات (التسمية: bt_type) |
bluehood_devices_active | Gauge | الأجهزة التي شوهدت في آخر 5 دقائق |
bluehood_devices_watched | Gauge | عدد الأجهزة المراقَبة |
bluehood_devices_ignored | Gauge | عدد الأجهزة المتجاهَلة |
bluehood_scan_duration_seconds | Histogram | مدة دورة المسح |
bluehood_device_rssi_dbm | Histogram | توزيع RSSI لأجهزة BLE |
bluehood_build_info | Info | معلومات الإصدار |