
أداة بحث أمنية تحدد وتوضح ثغرة CVE-2025-36911: Fast Pair Pairing Mode Bypass
غوص عميق في CVE-2025-36911 والفجوات الأمنية في نظام Fast Pair من Google
صُمم Google Fast Pair لجعل الإقران عبر Bluetooth سلسًا: انقر على إشعار وستتصل. ولكن ماذا يحدث عندما تصبح هذه التجربة السلسة مسؤولية أمنية؟ WhisperPair-PoC-Tool هي أداة بحث أمني تكشف عن فئتين حرجتين من الثغرات تؤثران على ملايين ملحقات Bluetooth: تجاوز الإقران غير المصرح به واستغلال شبكة العثور على جهازي (Find My Device Network).
توضح هذه التدوينة التفاصيل الفنية الداخلية للأداة WhisperPair-PoC-Tool، ونقاط الضعف في البروتوكول التي تستغلها، وما يعنيه ذلك لنظام ملحقات Bluetooth.
تنص مواصفات Google Fast Pair صراحةً على:
"إذا كان حقل المفتاح العام الاختياري موجودًا: إذا لم يكن الجهاز في وضع الإقران، فتجاهل الكتابة واخرج."
هذه هي البوابة الأمنية الحرجة. يجب أن تستجيب الأجهزة فقط لطلبات الإقران القائمة على المفتاح عندما يضع المستخدم الجهاز صراحةً في وضع الإقران (عادةً بالضغط على زر). وهذا يضمن نية المستخدم، فلا يمكنك الإقران مع سماعات شخص ما أثناء ارتدائها.
المشكلة: يتجاهل العديد من المصنعين هذا الفحص بالكامل. فهم يعالجون طلبات الإقران بغض النظر عن حالة وضع الإقران، مما يتيح:
تسمح شبكة العثور على جهازي (FMDN) من Google بتتبع ملحقات Bluetooth عبر شبكة أجهزة Android الجماعية. وهذا يتطلب مفتاح حساب، وهو مفتاح متماثل بطول 16 بايت يربط الجهاز بحساب Google.
المشكلة: غالبًا ما تقبل خاصية مفتاح الحساب عمليات الكتابة دون مصادقة:
قبل الخوض في الاستغلال، دعنا نفهم تدفق Fast Pair الشرعي:
┌─────────────────────────────────────────────────────────────┐
│ BLE Advertisement │
├─────────────────────────────────────────────────────────────┤
│ Service UUID: 0xFE2C (Fast Pair) │
│ Service Data: │
│ [Pairing Mode] → 3 bytes: Model ID only │
│ [Not Pairing] → 4+ bytes: 0x00 + Account Key Filter │
└─────────────────────────────────────────────────────────────┘
يكشف تنسيق الإعلان عن حالة الإقران:
Seeker (Phone) Provider (Accessory)
│ │
│───── GATT Connect ──────────────────────────>│
│ │
│───── Discover Services ─────────────────────>│
│<──── Service: 0xFE2C ────────────────────────│
│ │
│───── Enable Notifications (0xFE2C1234) ─────>│
│ │
│───── Write Key-Based Pairing Request ───────>│
│ [16-byte encrypted block] │
│ [64-byte ECDH Public Key] (optional) │
│ │
│ ┌────────────────────────────────────┐ │
│ │ SECURITY CHECK: │ │
│ │ If Public Key present AND │ │
│ │ device NOT in pairing mode: │ │
│ │ → IGNORE and EXIT │ │
│ │ Else: │ │
│ │ → Process request │ │
│ └────────────────────────────────────┘ │
│ │
│<──── Notification: Encrypted Response ───────│
│ [Provider's BR/EDR Address] │
│ │
│═══════ Bluetooth Classic Pairing ═══════════>│
تحدث الثغرة عندما تتخطى الأجهزة مربع "الفحص الأمني" بالكامل.
WhisperPair-PoC-Tool هي أداة بحث أمني مبنية بلغة Python على مكتبة Bleak BLE. تعمل بعدة مراحل:
┌────────────────────────────────────────────────────────────────┐
│ WhisperPair-PoC-Tool │
├────────────────────────────────────────────────────────────────┤
│ CLI Layer │
│ ├── Argument parsing (--target-name, --scan-duration) │
│ ├── TargetPolicy construction │
│ └── REPL initialization │
├────────────────────────────────────────────────────────────────┤
│ Discovery Engine │
│ ├── BLE scanning via Bleak │
│ ├── Advertisement parsing │
│ ├── Protocol detection (Fast Pair, FMDN, Swift Pair) │
│ └── Device fingerprinting (Model ID, OUI lookup) │
├────────────────────────────────────────────────────────────────┤
│ Check Engines │
│ ├── FastPairCheckEngine (passive advertisement analysis) │
│ ├── FastPairBypass (active CVE-2025-36911 testing) │
│ ├── FindHubCheckEngine (Account Key status detection) │
│ └── RiskScorer (composite vulnerability assessment) │
├────────────────────────────────────────────────────────────────┤
│ Connection Manager │
│ ├── GATT connect with MTU negotiation │
│ ├── Service/characteristic discovery │
│ ├── Read/Write/Notify operations │
│ └── Error handling and retry logic │
├────────────────────────────────────────────────────────────────┤
│ Exploitation Modules │
│ ├── ring_device() - Trigger locator sound │
│ ├── set_account_key() - Write Account Key │
│ └── Response parsing (BR/EDR address extraction) │
└────────────────────────────────────────────────────────────────┘
discovery.py)يستخدم الماسح دوال الاسترجاع الخاصة بـ Bleak لالتقاط إعلانات BLE:
async def _detection_callback(
self, device: BLEDevice, advertisement_data: AdvertisementData
) -> None:
"""Process each detected BLE advertisement."""
discovered = DiscoveredDevice(
address=device.address,
name=device.name or advertisement_data.local_name,
rssi=advertisement_data.rssi,
advertisement=self._convert_advertisement(advertisement_data),
first_seen=datetime.now(UTC),
last_seen=datetime.now(UTC),
)
self._devices[device.address] = discovered
لكل جهاز، تستخرج الأداة:
0xFE2C، FMDN 0xFD44، إلخ)0x00E0، Apple 0x004C)fastpair.py)يتم تحديد وضع الإقران بتحليل إعلان الجهاز:
def _analyze_service_data(self, evidence: FastPairEvidence) -> None:
"""Analyze Fast Pair service data to infer pairing mode."""
data = evidence.service_data_bytes
# 3 bytes = Model ID only = Pairing Mode (discoverable)
if len(data) == 3:
evidence.inferred_pairing_mode = PairingModeState.IN_PAIRING_MODE
return
# 4+ bytes with version 0x00 = Not in pairing mode
if data[0] == 0x00:
akd_byte = data[1]
akd_type = akd_byte & 0x0F # Lower 4 bits
# Type 0x00 = Show UI, Type 0x02 = Hide UI
# Both indicate NOT in pairing mode
evidence.inferred_pairing_mode = PairingModeState.NOT_IN_PAIRING_MODE
هذا أمر حاسم: إذا تم تحديد أن الجهاز ليس في وضع الإقران، ومع ذلك استمر في الاستجابة لطلب الإقران، فهو ضعيف.
fastpair_attack.py)يرسل اختبار الثغرة الأساسي طلبات إقران قائمة على المفتاح ويراقب الاستجابات:
async def check_vulnerability(self, device: DiscoveredDevice) -> BypassCheckResult:
"""Test if device responds to pairing requests when not in pairing mode."""
# Enable notifications to receive response
await self.connection_manager.start_notify(
KEY_BASED_PAIRING_CHAR,
self._notification_handler,
)
# Build and send request (multiple strategies)
for strategy in self.strategies:
request, flags = self._build_strategy_request(device.address, strategy)
await self.connection_manager.write_characteristic(
KEY_BASED_PAIRING_CHAR,
request,
)
# Wait for response
try:
await asyncio.wait_for(
self._response_received.wait(),
timeout=self.response_timeout,
)
# Response received = VULNERABLE
return BypassCheckResult(result=BypassResult.VULNERABLE, ...)
except asyncio.TimeoutError:
# No response = Device correctly ignored request
continue
return BypassCheckResult(result=BypassResult.NOT_VULNERABLE, ...)
تنفذ الأداة استراتيجيات طلبات متعددة لأن الأجهزة المختلفة تستجيب لمجموعات أعلام مختلفة:
عندما يستجيب جهاز ضعيف، تستخرج الأداة عنوان BR/EDR (Bluetooth Classic):
def _parse_response(self, response_data: bytes) -> str | None:
"""Extract provider's BR/EDR address from response."""
# Strategy 1: Standard response (type 0x01)
if response_data[0] == 0x01:
return self._extract_address(response_data, offset=1)
# Strategy 2: Extended response (type 0x02)
if response_data[0] == 0x02:
addr_count = response_data[2]
return self._extract_address(response_data, offset=3)
# Strategy 3: Brute force pattern matching
for offset in range(len(response_data) - 5):
addr = self._extract_address(response_data, offset)
if self._is_valid_mac(addr):
return addr
يمكن استخدام عنوان BR/EDR هذا لبدء إقران Bluetooth Classic (على الرغم من أن الأداة تتوقف عند الكشف).
حدد البحث حالات فشل تنفيذ شائعة:
المشكلة الأكثر شيوعًا: المصنعون ببساطة لا ينفذون هذا الفحص:
// VULNERABLE: No pairing mode check
void handle_kbp_write(uint8_t* data, size_t len) {
if (len >= 80 && has_public_key(data)) {
// Should check: if (!is_in_pairing_mode()) return;
process_pairing_request(data); // Processes regardless
}
}
يجب أن تتطلب خاصية مفتاح الحساب مصادقة:
// VULNERABLE: No authentication required
void handle_account_key_write(uint8_t* key, size_t len) {
if (len == 16) {
store_account_key(key); // Accepts any key from anyone
}
}
// SECURE: Verify caller knows existing key
void handle_account_key_write_secure(uint8_t* encrypted_key, size_t len) {
if (!verify_encrypted_with_existing_key(encrypted_key)) {
return; // Reject unauthorized writes
}
store_account_key(decrypt(encrypted_key));
}
الأجهزة التي تعلن عن بيانات خدمة Fast Pair عندما تكون ليس في وضع الإقران تكشف عن:
تستخدم الأداة منهج اكتشاف متعدد الطبقات:
لا يتطلب اتصالاً. تحلل الأداة ما يبثه الجهاز:
┌─────────────────────────────────────────────────────────────┐
│ الفحوصات السلبية │
├─────────────────────────────────────────────────────────────┤
│ ✓ وجود معرّف خدمة Fast Pair (0xFE2C) │
│ ✓ وجود معرّف خدمة FMDN (0xFD44) │
│ ✓ استنتاج وضع الإقران من طول بيانات الخدمة │
│ ✓ استخراج Model ID (عندما يكون في وضع الإقران) │
│ ✓ اكتشاف مرشح مفتاح الحساب (عندما لا يكون في وضع الإقران) │
│ ✓ تحليل نوع العنوان (ثابت مقابل عشوائي) │
└─────────────────────────────────────────────────────────────┘
النتيجة: "جهاز يعلن عن بيانات Fast Pair بينما ليس في وضع الإقران"
→ انتهاك محتمل للبوابة (يحتاج اختبار نشط للتأكيد)
يتطلب اتصالاً. تتفاعل الأداة مع خدمات GATT:
┌─────────────────────────────────────────────────────────────┐
│ الفحوصات النشطة │
├─────────────────────────────────────────────────────────────┤
│ 1. الاتصال بالجهاز عبر BLE │
│ 2. اكتشاف خدمة Fast Pair (0xFE2C) │
│ 3. تحديد خاصية الإقران القائم على المفتاح (0xFE2C1234) │
│ 4. تفعيل الإشعارات │
│ 5. كتابة طلب الإقران القائم على المفتاح │
│ 6. انتظار الاستجابة (مع مهلة) │
│ 7. استقبال استجابة → ضعيف │
│ مهلة/رفض → ليس ضعيفًا │
└─────────────────────────────────────────────────────────────┘
يتم حساب درجة مخاطر مركبة:
مستويات المخاطر:
تتضمن الأداة ميزات استغلال خاضعة للتحكم لإظهار التأثير:
ring)يُشغّل خاصية إجراءات منارة FMDN لتشغيل صوت الموقع:
محذوف للإصدار
التأثير: يمكن للمهاجم مضايقة الضحية بتكرار تشغيل الصوت، أو استخدامه لتحديد موقع جهاز يريد سرقته.
set account-key)يكتب مفتاح حساب جديدًا إلى الجهاز:
محذوف للإصدار
التأثير:
تتوقف الأداة عمدًا قبل الاستغلال الكامل:
if (has_public_key(request) && !is_in_pairing_mode()) {
return; // تجاهل الطلب حسب المواصفات
}
اشتراط المصادقة على كتابات مفتاح الحساب:
تقليل التعرض للإعلان:
آلية تحديث البرامج الثابتة:
هذه الأداة مخصصة لما يلي:
توضح الأداة أن تجربة Fast Pair "السلسة" تأتي بمقايضات أمنية يفشل العديد من المصنعين في معالجتها. فحص وضع الإقران هو شرط واحد يفصل بين جهاز آمن وجهاز ضعيف، ومع ذلك يتم حذفه بشكل متكرر.
يفترض نموذج الثقة في Fast Pair أن الأجهزة ستفرض نية المستخدم. عندما لا تفعل، يحصل المهاجمون على إقران صامت، وقدرات تتبع، ونواقل حرمان من الخدمة ضد أجهزة الضحايا.
تهدف هذه الأداة إلى مساعدة النظام البيئي في تحديد هذه المشكلات ومعالجتها، مما يجعل ملحقات Bluetooth أكثر أمانًا للجميع.
تم إصدار WhisperPair-PoC-Tool لأغراض البحث الأمني المصرح به فقط. لا تتحمل أي مسؤولية عن سوء استخدام هذه الأداة.
| الاستراتيجية | الأعلام | الوصف |
|---|
RAW_KBP | 0x11 | INITIATE_BONDING | EXTENDED_RESPONSE |
WITH_PUBLIC_KEY | 0x11 | طلب بطول 80 بايت مع مفتاح عام ECDH |
RETROACTIVE | 0x0A | يتجاوز بعض فحوصات المصنعين |
EXTENDED | 0x10 | للبرامج الثابتة الأحدث للأجهزة |
| الإشارة | الدرجة | المعنى |
|---|
| انتهاك البوابة (سلبي) | +2 | الإعلان عن FP عندما لا يكون في وضع الإقران |
| تأكيد التجاوز (نشط) | +2 | استجابة لـ KBP عندما لا يكون في وضع الإقران |
| FMDN بدون مفتاح حساب | +2 | قابل للتتبع عبر شبكة Find My |
| عنوان BLE ثابت | +1 | الجهاز قابل للتتبع بشكل دائم |
| ملاحظة تدوير العنوان | -1 | سلوك يحافظ على الخصوصية |
| القدرة | تم التنفيذ | السبب |
|---|
| كشف الثغرة | ✅ نعم | الغرض الأساسي |
| استخراج عنوان BR/EDR | ✅ نعم | جمع الأدلة |
| إقران Bluetooth Classic | ❌ لا | يتطلب كودًا خاصًا بالمنصة |
| اختطاف صوت HFP | ❌ لا | خارج نطاق أداة BLE |
| زراعة دائمة | ❌ لا | قدرة خبيثة |