
CVE-2020-14292 का विवरण
COVIDSafe एप्लिकेशन (Android के लिए संस्करण 1.0.21 तक) में, GATT कनेक्शन में ब्लूटूथ ट्रांसपोर्ट विकल्प के असुरक्षित उपयोग से हमलावर एप्लिकेशन को ब्लूटूथ BR/EDR ट्रांसपोर्ट पर कनेक्शन स्थापित करने के लिए धोखा दे सकते हैं, जो पीड़ित के फोन का सार्वजनिक ब्लूटूथ पता बिना अधिकार के प्रकट करता है, और उपयोगकर्ता के फोन में ब्लूटूथ पता यादृच्छिकरण सुरक्षा को बायपास करता है। इस समस्या को CVE-2020-14292. के रूप में ट्रैक किया गया है।
समस्या का कारण फ़ंक्शन startWork में है, जहाँ connectGatt का उपयोग करके GATT कनेक्शन बनाया जाता है, लेकिन कोई ट्रांसपोर्ट विकल्प निर्दिष्ट नहीं किया गया था।
fun startWork(
context: Context,
gattCallback: StreetPassWorker.StreetPassGattCallback
) {
gatt = device.connectGatt(context, false, gattCallback)
if (gatt == null) {
CentralLog.e(TAG, "Unable to connect to ${device.address}")
}
}
यह Android को ब्लूटूथ कनेक्शन शुरू करने में ट्रांसपोर्ट के लिए TRANSPORT_AUTO विकल्प का उपयोग करने का कारण बनेगा। ऐसा प्रतीत होता है कि Android में कार्यान्वयन में, यह BR/EDR पर डिफ़ॉल्ट होगा यदि यह जिस परिधीय से जुड़ रहा है वह एक डुअल मोड डिवाइस (BR/EDR और LE दोनों का समर्थन करने वाला) है; यह Android में GATT क्लाइंट के निम्नलिखित कार्यान्वयन के कारण हो सकता है, उदाहरण के लिए, यह कोड (प्रासंगिक कोड स्निपेट नीचे शामिल है):
// Determine transport
if (transport_p != BT_TRANSPORT_AUTO) {
transport = transport_p;
} else {
switch (device_type) {
case BT_DEVICE_TYPE_BREDR:
transport = BT_TRANSPORT_BR_EDR;
break;
case BT_DEVICE_TYPE_BLE:
transport = BT_TRANSPORT_LE;
break;
case BT_DEVICE_TYPE_DUMO:
if (transport_p == BT_TRANSPORT_LE)
transport = BT_TRANSPORT_LE;
else
transport = BT_TRANSPORT_BR_EDR;
break;
}
चूंकि BR/EDR में MAC पता यादृच्छिकरण समर्थित नहीं है, केंद्रीय परिधीय को अपनी पहचान पता प्रकट करेगा।
हमले को शुरू करने के लिए, हमलावर एक डुअल मोड डिवाइस (BR/EDR + LE) पर GATT सर्वर का विज्ञापन करता है, सार्वजनिक पते का उपयोग करते हुए (यह भाग महत्वपूर्ण है, अन्यथा डाउनग्रेड नहीं होगा और Android केंद्रीय LE ट्रांसपोर्ट का उपयोग करेगा)। यह COVIDSafe ऐप को LE ट्रांसपोर्ट के बजाय BR/EDR ट्रांसपोर्ट का उपयोग करने का कारण बनेगा, जिससे फोन का सार्वजनिक पता प्रकट हो जाता है। यह परीक्षण किए गए सभी फोन और Android संस्करणों के लिए काम करता है।
Android 6 और बाद के लिए, सुधार सरल है: बस ट्रांसपोर्ट विकल्प स्पष्ट रूप से निर्दिष्ट करें।
gatt = device.connectGatt(context, false, gattCallback, BluetoothDevice.TRANSPORT_LE)
हालाँकि, यह Android 5.1 (API स्तर 22) के लिए काम नहीं करता है, क्योंकि वह विधि API में उजागर नहीं है। यह वास्तव में वहाँ है लेकिन यह छिपा हुआ है। इसलिए Android 5.1 के लिए, एक संभावित सुधार में उस छिपी विधि को कॉल करने के लिए रिफ्लेक्शन का उपयोग करना शामिल है। ये सुधार COVIDSafe (Android) v1.0.48 में लागू किए गए हैं।
हालाँकि, Android 5.1 के लिए सुधार 100% समय काम नहीं कर सकता है; मेरे परीक्षणों ने संकेत दिया कि अभी भी पहचान पते का रिसाव था। यह रनटाइम पर रिफ्लेक्शन तकनीक की विफलता के कारण हो सकता है; आगे की जांच की आवश्यकता होगी।
किसी फोन के पहचान पते का अधिकार हमलावर को फोन को ट्रैक करने की अनुमति देगा जब उसका ब्लूटूथ चालू हो और वह हमलावर की ब्लूटूथ रेंज में हो। कुछ ब्लूटूथ-संबंधित कमजोरियाँ (जैसे, CVE-2020-0022) आगे के हमलों को माउंट करने के लिए पहचान पते के ज्ञान पर निर्भर करती हैं, इसलिए इस हमले को दूसरों के साथ श्रृंखलित करने की संभावना है। हमलावर के पास पहचान पते के होने के कुछ परिणामों के लिए यह दस्तावेज़ देखें।
COVIDSafe ऐप के Android संस्करण के उपयोगकर्ताओं को दृढ़ता से अपने ऐप को अपडेट करने की सलाह दी जाती है। Android 5 चलाने वालों के लिए, उन स्थितियों में ब्लूटूथ बंद करने की सिफारिश की जाती है जहाँ ब्लूटूथ कार्यक्षमता की आवश्यकता नहीं है।
यह समस्या पहली बार 2 जून, 2020 को ऑस्ट्रेलियाई सरकार की डिजिटल परिवर्तन एजेंसी को सूचित की गई थी। पहला सुधार 22 जून, 2020 को Android 6 और उससे ऊपर के लिए जारी किया गया था। इसकी पुष्टि की गई है कि यह Android 6 और उससे ऊपर के लिए काम करता है। लेकिन यह समस्या अभी भी Android 5.1 को प्रभावित करती है। दूसरा सुधार, 30 जुलाई, 2020 को जारी किया गया, जिसने Android 5.1 के साथ शेष समस्या का समाधान किया।
इस समस्या की स्वतंत्र रूप से पुष्टि करने और इससे संबंधित विभिन्न चर्चाओं के लिए जिम मुसार्ड को धन्यवाद।