
Sweyntooth ब्लूटूथ लो एनर्जी (BLE) भेद्यताओं का प्रूफ ऑफ कॉन्सेप्ट।
यह रिपॉजिटरी ASSET Research Group की शोध उपलब्धि का हिस्सा है।

SweynTooth में छह प्रमुख सिस्टम-ऑन-चिप (SoC) विक्रेताओं के विभिन्न ब्लूटूथ लो एनर्जी (BLE) सॉफ़्टवेयर डेवलपमेंट किट्स (SDKs) में 18 भेद्यताओं का एक परिवार शामिल है। ये भेद्यताएँ विशिष्ट BLE SoC कार्यान्वयनों में ऐसी कमज़ोरियाँ उजागर करती हैं जो परिस्थितियों के आधार पर रेडियो रेंज में मौजूद हमलावर को डेडलॉक, क्रैश और बफर ओवरफ्लो ट्रिगर करने या सुरक्षा को पूरी तरह से बायपास करने की अनुमति देती हैं। (अपडेट) हमने BLE KNOB वेरिएंट के विरुद्ध उपकरणों की जाँच के लिए एक परीक्षण स्क्रिप्ट भी शामिल की है।
आप ASSET Research Group SweynTooth disclosure website पर भेद्यताओं, उपलब्ध पैच और प्रभावित उपकरणों के बारे में अधिक जानकारी देख सकते हैं।
Fitbit, August Smart Lock, Eve Energy, CubiTag और अन्य "स्मार्ट" चीज़ें प्रभावित हैं।
इस PoC में Scapy और Colorama जैसी अच्छी तरह से अनुरक्षित लाइब्रेरीज़ का उपयोग किया गया है। BLE पैकेट निर्माण और विच्छेदन कस्टमाइज़्ड Scapy प्रोटोकॉल लेयर्स (bluetooth4LE और bluetooth.py) के माध्यम से किया जाता है। हमारे परिवर्धन को Scapy की मुख्य रिपॉजिटरी में शामिल करने हेतु एक मर्ज प्रगति पर है।
सबसे पहले, आपको यह सुनिश्चित करना होगा कि आपके सिस्टम पर Python2.7 और requirements.txt फ़ाइल में सूचीबद्ध पायथन पैकेज मौजूद हैं। यदि आप Ubuntu उपयोग कर रहे हैं, तो निम्नलिखित चलाएँ:
sudo apt-get install python2.7
sudo pip install -r requirements.txt
दूसरे, SweynTooth Nordic nRF52840 Dongle का उपयोग करके कमजोर पेरिफेरल के साथ हवा से कच्चे लिंक लेयर पैकेट भेजने/प्राप्त करने का कार्य करता है। Python 2.7 स्क्रिप्ट शुरू करने से पहले बोर्ड में ड्राइवर फ़र्मवेयर फ्लैश करना आवश्यक है।
हमारे फ़र्मवेयर कोड का बाइनरी nRF52_driver_firmware.zip फ़ाइल में है। बोर्ड पर फ़र्मवेयर फ्लैश करने के लिए आपको nrfutil टूल इंस्टॉल करना होगा। याद रखें कि फ्लैश करने से पहले nRF52840 को DFU मोड में रखें (अपने PC से कनेक्टेड USB डोंगल को छोटे रीसेट बटन को दबाकर रीसेट करें)।
आप पायथन निर्भरताएँ इंस्टॉल करने और फ़र्मवेयर फ्लैश करने के लिए निम्नलिखित कमांड चला सकते हैं:
python -m pip install nrfutil pyserial pycryptodome
nrfutil dfu usb-serial -p COM_PORT -pkg nRF52_driver_firmware.zip
स्क्रिप्ट Linux या Windows पर काम करती हैं। आपको केवल nRF52840 पोर्ट नाम से मेल खाने के लिए COM_PORT पैरामीटर बदलने की आवश्यकता है।
यदि पिछली फ्लैशिंग विधि काम नहीं करती है, तो आप nRF Connect App for Desktop का उपयोग करके भी फ़र्मवेयर फ्लैश कर सकते हैं, जो हेक्स फ़र्मवेयर (nRF52_driver_firmware.hex) को फ्लैश करने के लिए एक अच्छा इंटरफ़ेस प्रदान करता है।
आवश्यकताएँ स्थापित हो जाने के बाद, आप निम्नलिखित कमांड निष्पादित करके एक एक्सप्लॉइट स्क्रिप्ट चला सकते हैं:
python Telink_key_size_overflow.py COM7 A4:C1:38:D8:AD:A9
पहला तर्क सीरियल पोर्ट नाम है (सामान्यतः Linux पर /dev/ttyACM0) और दूसरा कमजोर BLE डिवाइस का पता है। आप इस पते का पता लगाने के लिए किसी भी BLE स्कैनर या nRF Connect App का उपयोग कर सकते हैं।
Key Size Overflow भेद्यता को उदाहरण के रूप में लेते हुए, यदि कमजोर डिवाइस क्रैश के बाद हैंग हो जाता है तो स्क्रिप्ट द्वारा निम्नलिखित आउटपुट दिया जाता है:

यदि आप Python निर्भरताएँ इंस्टॉल करने से बचने के लिए Docker इमेज के माध्यम से SweynTooth का उपयोग करना चाहते हैं, तो आप Docker इंस्टेंस को बिल्ड और रन करने के लिए docker.sh हेल्पर स्क्रिप्ट का उपयोग कर सकते हैं या रिलीज़ पेज पर उपलब्ध प्रीबिल्ट Docker इमेज (link) डाउनलोड कर सकते हैं। docker.sh का उपयोग नीचे वर्णित है।
--------- HELP -------------
sudo ./docker run <script_name> <serial_port> <ble_target_address> - Start any sweyntooth script by its name (<script_name>)
sudo ./docker build - Build docker container
sudo ./docker build release - Build docker container and create compressed image for release
sudo ./docker shell - Start docker container shell
---------- EXAMPLE ----------
./docker.sh run extras/Microchip_and_others_non_compliant_connection.py /dev/ttyACM0 f0:f8:f2:da:09:63
प्रत्येक एक्सप्लॉइट स्क्रिप्ट एक कमज़ोरी के अनुरूप है। निम्न सारांश तालिका भेद्यता और प्रभावित SoCs पर भेद्यता का शोषण करने के लिए स्क्रिप्ट के बीच पत्राचार दर्शाती है।
सामान्यतः, प्रभावित SoCs का उपयोग करने वाले उत्पाद किसी खराबी की स्थिति में BLE SoC को स्वचालित रूप से पुनरारंभ करने के लिए वॉचडॉग नियोजित करते हैं, इसलिए सभी उत्पादों को डेडलॉक नहीं किया जा सकता। फिर भी, यदि उत्पाद क्रैश और पुनरारंभ होता है तो उससे कुछ दृश्य या श्रव्य संकेत प्राप्त करना संभव होना चाहिए।
सबसे गंभीर SweynTooth भेद्यता Zero LTK Installation है, जो एक हमलावर को शून्य-भरे LTK के साथ एन्क्रिप्शन सेटअप प्रक्रिया को बलपूर्वक लागू करके नवीनतम ब्लूटूथ पेयरिंग प्रक्रिया (सुरक्षित कनेक्शन) को पूरी तरह से बायपास करने की अनुमति देती है। इस भेद्यता के विरुद्ध अपने डिवाइस का परीक्षण करने के लिए, डिवाइस को पेयरिंग विधि के रूप में सुरक्षित कनेक्शन स्वीकार या समर्थन करना चाहिए। आप PoC को निम्नानुसार चला सकते हैं:
python Telink_zero_ltk_installation.py COM7 A4:C1:38:D8:AD:A9
ध्यान दें कि तर्क COM7 और A4:C1:38:D8:AD:A9 आपके सेटअप के आधार पर भिन्न हैं। यदि डिवाइस कमजोर है, तो PoC निम्नलिखित आउटपुट देता है:

LLID डेडलॉक स्क्रिप्ट पेरिफेरल के साथ प्रत्येक पुनः-कनेक्शन पर बारी-बारी से संस्करण अनुरोध या पेयरिंग अनुरोध दोनों भेजते समय LLID फ़ील्ड को साफ़ करती है। यह NXP और Cypress दोनों कमजोर SoCs में भेद्यता को ट्रिगर करने के लिए किया जाता है। कमजोर KW41Z के विरुद्ध स्क्रिप्ट चलाते समय, स्टैक डेडलॉक हो जाता है और क्रम से बाहर लिंक लेयर पैकेट भेजने चाहिए। स्क्रिप्ट यह पता लगाने की कोशिश करती है कि स्टैक डेडलॉक है या नहीं और कमजोर KW41Z उपकरणों के लिए निम्नलिखित आउटपुट देती है:

कमजोर Cypress डिवाइस आमतौर पर हमले के बाद विज्ञापन अक्षम कर देते हैं। इसलिए आपको एक त्रुटि संदेश दिखाई देना चाहिए जो दर्शाता है कि क्रैश का पता चला है। कमजोर Fitbit Inspire के विरुद्ध इस स्क्रिप्ट का परीक्षण करते समय, स्मार्टवॉच या तो तुरंत क्रैश हो जाती है या अस्थायी रूप से अपने विज्ञापन अक्षम कर देती है। इस डिवाइस के विरुद्ध आंतरायिक हमलों से स्थायी BLE खराबी होनी चाहिए, जिसके लिए उपयोगकर्ता को Fitbit Inspire को मैन्युअल रूप से रीबूट करना आवश्यक हो जाता है।
जबकि KNOB ने मुख्य रूप से ब्लूटूथ क्लासिक उपकरणों को प्रभावित किया क्योंकि कुंजी का आकार घटाकर 1 बाइट कर दिया गया था, फिर भी SMP पेयरिंग प्रक्रिया के दौरान ब्लूटूथ लो एनर्जी उपकरणों की कुंजी एंट्रॉपी को 7 बाइट्स (न्यूनतम कंप्लाइंट कुंजी आकार) तक कम करना संभव है। इस तरह की कंप्लाइंट BLE एंट्रॉपी कमी के निहितार्थ पर "Low Entropy Key Negotiation Attacks on Bluetooth and Bluetooth Low Energy" by Antonioli, Daniele et. al में चर्चा की गई थी।
हमने यह जाँचने के लिए एक सरल स्क्रिप्ट उपलब्ध कराई है कि BLE पेरिफेरल डिवाइस द्वारा कौन से कुंजी आकार स्वीकार्य हैं। आप BLE KNOB टेस्टर को निम्नानुसार चला सकते हैं:
# Windows
python extras\knob_tester_ble.py COM6 a4:c1:38:d8:ad:a9
# Linux
python extras/knob_tester_ble.py /dev/ttyACM0 a4:c1:38:d8:ad:a9
COM6 और a4:c1:38:d8:ad:a9 को nRF52 डोंगल सीरियल पोर्ट (सामान्यतः Linux पर /dev/ttyACM0) और परीक्षणाधीन BLE डिवाइस के पते के अनुसार अन्य मानों में बदलना न भूलें। यदि टूल पेरिफेरल को 16 बाइट्स के अलावा अन्य कुंजी आकार स्वीकार करते हुए पहचानता है, तो यह उन्हें नीचे दिखाए अनुसार सूचीबद्ध करेगा:

captures फ़ोल्डर में प्रत्येक भेद्यता के कुछ नमूना कैप्चर शामिल हैं। हमने कुछ SoCs में पाए गए कुछ नॉन-कंप्लायंस मामले भी जोड़े हैं।
extras folder में कुछ अतिरिक्त स्क्रिप्ट शामिल हैं जो नॉन-कंप्लायंस और कुछ SweynTooth वेरिएंट से संबंधित हैं। अधिक जानकारी के लिए extras/README.md पर एक्स्ट्रा स्क्रिप्ट की तालिका देखें।
यह शोध आंशिक रूप से Keysight Technologies द्वारा समर्थित था।
| Vulnerability | CVE(s) | Vendor | Script file |
|---|