
एक सुरक्षा अनुसंधान उपकरण जो CVE-2025-36911: Fast Pair Pairing Mode Bypass भेद्यता की पहचान और प्रदर्शन करता है
CVE-2025-36911 और Google के Fast Pair पारिस्थितिकी तंत्र में सुरक्षा अंतरालों की गहन जांच
Google Fast Pair को Bluetooth युग्मन को सहज बनाने के लिए डिज़ाइन किया गया था: एक सूचना पर टैप करें और आप कनेक्ट हो जाते हैं। लेकिन क्या होता है जब वह सहज अनुभव एक सुरक्षा देयता बन जाता है? WhisperPair-PoC-Tool एक सुरक्षा अनुसंधान उपकरण है जो लाखों Bluetooth सहायक उपकरणों को प्रभावित करने वाली दो महत्वपूर्ण भेद्यता श्रेणियों को उजागर करता है: अनधिकृत युग्मन बाइपास और Find My Device Network ट्रैकिंग शोषण।
यह पोस्ट WhisperPair-PoC-Tool की तकनीकी आंतरिक संरचना, इसके द्वारा शोषित प्रोटोकॉल कमजोरियों और Bluetooth सहायक उपकरण पारिस्थितिकी तंत्र के लिए इसका क्या अर्थ है, का विवरण देता है।
Google Fast Pair विनिर्देश स्पष्ट रूप से बताता है:
"यदि वैकल्पिक सार्वजनिक कुंजी फ़ील्ड मौजूद है: यदि उपकरण युग्मन मोड में नहीं है, तो लिखने को अनदेखा करें और बाहर निकलें।"
यह महत्वपूर्ण सुरक्षा गेट है। उपकरणों को केवल तभी कुंजी-आधारित युग्मन (Key-Based Pairing) अनुरोधों का जवाब देना चाहिए जब उपयोगकर्ता ने स्पष्ट रूप से उपकरण को युग्मन मोड (आमतौर पर एक बटन दबाकर) में डाल दिया हो। यह उपयोगकर्ता की मंशा सुनिश्चित करता है, ताकि आप किसी के ईयरबड्स को तब युग्मित न कर सकें जब वे उन्हें पहने हुए हों।
समस्या: कई निर्माता इस जाँच को पूरी तरह से छोड़ देते हैं। वे युग्मन मोड स्थिति की परवाह किए बिना युग्मन अनुरोधों को संसाधित करते हैं, जिससे निम्न सक्षम होता है:
Google का Find My Device Network (FMDN) भीड़-स्रोत Android उपकरण नेटवर्क के माध्यम से Bluetooth सहायक उपकरणों को ट्रैक करने की अनुमति देता है। इसके लिए एक खाता कुंजी (Account Key) की आवश्यकता होती है, जो उपकरण को Google खाते से जोड़ने वाली 16-बाइट सममित कुंजी है।
समस्या: खाता कुंजी विशेषता (Account Key characteristic) प्रायः प्रमाणीकरण के बिना लेखन स्वीकार करती है:
शोषण में गोता लगाने से पहले, आइए वैध 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 Bleak BLE लाइब्रेरी के ऊपर बनाया गया एक Python-आधारित सुरक्षा अनुसंधान उपकरण है। यह कई चरणों में काम करता है:
┌────────────────────────────────────────────────────────────────┐
│ 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)स्कैनर BLE विज्ञापनों को कैप्चर करने के लिए Bleak का डिटेक्शन कॉलबैक उपयोग करता है:
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)मुख्य भेद्यता परीक्षण कुंजी-आधारित युग्मन (Key-Based Pairing) अनुरोध भेजता है और प्रतिक्रियाओं की निगरानी करता है:
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 युग्मन आरंभ करने के लिए किया जा सकता है (हालाँकि WhisperPair-PoC-Tool पता लगाने पर रुक जाता है)।
अनुसंधान ने सामान्य कार्यान्वयन विफलताओं की पहचान की:
सबसे सामान्य मुद्दा: निर्माता बस जाँच लागू नहीं करते:
// 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
}
}
खाता कुंजी विशेषता (Account Key characteristic) को प्रमाणीकरण की आवश्यकता होनी चाहिए:
// 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 सेवा डेटा का विज्ञापन करने वाले उपकरण प्रकट करते हैं:
WhisperPair-PoC-Tool एक स्तरित पता लगाने का दृष्टिकोण उपयोग करता है:
कोई कनेक्शन आवश्यक नहीं। उपकरण विश्लेषण करता है कि उपकरण क्या प्रसारित करता है:
┌─────────────────────────────────────────────────────────────┐
│ Passive Checks │
├─────────────────────────────────────────────────────────────┤
│ ✓ Fast Pair service UUID present (0xFE2C) │
│ ✓ FMDN service UUID present (0xFD44) │
│ ✓ Pairing mode inferred from service data length │
│ ✓ Model ID extracted (when in pairing mode) │
│ ✓ Account Key Filter detected (when not in pairing mode) │
│ ✓ Address type analysis (static vs. random) │
└─────────────────────────────────────────────────────────────┘
Result: "Device advertising Fast Pair data while NOT in pairing mode"
→ Potential gating violation (needs active test to confirm)
कनेक्शन की आवश्यकता है। उपकरण GATT सेवाओं से संपर्क करता है:
┌─────────────────────────────────────────────────────────────┐
│ Active Checks │
├─────────────────────────────────────────────────────────────┤
│ 1. Connect to device via BLE │
│ 2. Discover Fast Pair service (0xFE2C) │
│ 3. Locate Key-Based Pairing characteristic (0xFE2C1234) │
│ 4. Enable notifications │
│ 5. Write Key-Based Pairing request │
│ 6. Wait for response (with timeout) │
│ 7. Response received → VULNERABLE │
│ Timeout/Rejected → NOT VULNERABLE │
└─────────────────────────────────────────────────────────────┘
एक संयुक्त जोखिम स्कोर की गणना की जाती है:
जोखिम स्तर:
WhisperPair-PoC-Tool में प्रभाव प्रदर्शित करने के लिए नियंत्रित शोषण सुविधाएँ शामिल हैं:
ring कमांड)लोकेटर ध्वनि चलाने के लिए FMDN Beacon Actions विशेषता को ट्रिगर करता है:
रिलीज़ के लिए संशोधित
प्रभाव: हमलावर बार-बार ध्वनि चलाकर पीड़ित को परेशान कर सकता है, या उस उपकरण का पता लगाने के लिए इसका उपयोग कर सकता है जिसे वह चुराना चाहता है।
set account-key कमांड)उपकरण में एक नई खाता कुंजी लिखता है:
रिलीज़ के लिए संशोधित
प्रभाव:
WhisperPair-PoC-Tool जानबूझकर पूर्ण शोषण से पहले रुक जाता है:
if (has_public_key(request) && !is_in_pairing_mode()) {
return; // Ignore request per spec
}
खाता कुंजी लेखन के लिए प्रमाणीकरण की आवश्यकता है:
विज्ञापन जोखिम को कम करें:
फर्मवेयर अद्यतन तंत्र:
यह उपकरण निम्न के लिए है:
WhisperPair-PoC-Tool दर्शाता है कि "सहज" Fast Pair अनुभव सुरक्षा व्यापार-बंद के साथ आता है जिसे कई निर्माता संबोधित करने में विफल रहते हैं। युग्मन मोड जाँच एक एकल सशर्त है जो एक सुरक्षित उपकरण को एक असुरक्षित उपकरण से अलग करती है, फिर भी इसे अक्सर छोड़ दिया जाता है।
Fast Pair का विश्वास मॉडल मानता है कि उपकरण उपयोगकर्ता की मंशा लागू करेंगे। जब वे ऐसा नहीं करते हैं, तो हमलावरों को मूक युग्मन, ट्रैकिंग क्षमताएँ और पीड़ितों के उपकरणों के खिलाफ सेवा से इनकार वैक्टर मिलते हैं।
इस उपकरण का उद्देश्य पारिस्थितिकी तंत्र को इन मुद्दों की पहचान करने और उन्हें ठीक करने में मदद करना है, जिससे Bluetooth सहायक उपकरण सभी के लिए सुरक्षित हो जाएँ।
WhisperPair-PoC-Tool केवल अधिकृत सुरक्षा अनुसंधान के लिए जारी किया गया है। इस उपकरण के दुरुपयोग के लिए कोई जिम्मेदारी नहीं ली जाती है।
| रणनीति | ध्वज | विवरण |
|---|
RAW_KBP | 0x11 | INITIATE_BONDING | EXTENDED_RESPONSE |
WITH_PUBLIC_KEY | 0x11 | ECDH सार्वजनिक कुंजी के साथ 80-बाइट अनुरोध |
RETROACTIVE | 0x0A | कुछ निर्माता जाँचों को बायपास करता है |
EXTENDED | 0x10 | नए उपकरण फर्मवेयर के लिए |
| संकेत | स्कोर | अर्थ |
|---|
| गेटिंग उल्लंघन (निष्क्रिय) | +2 | युग्मन मोड में नहीं होने पर FP का विज्ञापन करना |
| बाइपास की पुष्टि (सक्रिय) | +2 | युग्मन मोड में नहीं होने पर KBP का जवाब दिया |
| खाता कुंजी के बिना FMDN | +2 | Find My नेटवर्क के माध्यम से ट्रैक करने योग्य |
| स्थिर BLE पता | +1 | उपकरण स्थायी रूप से ट्रैक करने योग्य है |
| पता घूर्णन देखा गया | -1 | गोपनीयता-संरक्षण व्यवहार |
| क्षमता | कार्यान्वित | कारण |
|---|
| भेद्यता का पता लगाना | ✅ हाँ | मुख्य उद्देश्य |
| BR/EDR पता निष्कर्षण | ✅ हाँ | साक्ष्य संग्रह |
| Bluetooth Classic युग्मन | ❌ नहीं | प्लेटफ़ॉर्म-विशिष्ट कोड की आवश्यकता है |
| HFP ऑडियो अपहरण | ❌ नहीं | BLE उपकरण के दायरे से परे |
| स्थायी इम्प्लांट | ❌ नहीं | दुर्भावनापूर्ण क्षमता |