
تفاصيل CVE-2020-14292
في تطبيق COVIDSafe حتى الإصدار 1.0.21 لنظام Android، يؤدي الاستخدام غير الآمن لخيار نقل البلوتوث في اتصال GATT إلى السماح للمهاجمين بخداع التطبيق لإنشاء اتصال عبر ناقل Bluetooth BR/EDR، مما يكشف عنوان البلوتوث العام لهاتف الضحية دون إذن، متجاوزًا حماية عشوائية عنوان البلوتوث في هاتف المستخدم. يتم تتبع هذه المشكلة باستخدام CVE-2020-14292.
سبب المشكلة هو في الدالة startWork، حيث يتم إنشاء اتصال GATT باستخدام connectGatt، ولكن لم يتم تحديد خيار نقل.
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)؛ وقد يكون هذا بسبب التنفيذ التالي لعميل GATT في Android، انظر على سبيل المثال، هذا الكود (مقتطف الكود ذو الصلة مرفق أدناه):
// 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;
}
نظرًا لأن عشوائية عنوان MAC غير مدعومة في BR/EDR، فإن الجهاز المركزي سيكشف عنوان هويته للجهاز الطرفي.
لشن هجوم، يقوم المهاجم بالإعلان عن خادم GATT على جهاز ثنائي الوضع (BR/EDR + LE)، باستخدام العنوان العام (هذا الجزء مهم، وإلا فلن يحدث التخفيض وسيستخدم جهاز Android المركزي ناقل LE). سيؤدي هذا إلى جعل تطبيق COVIDSafe يستخدم ناقل BR/EDR بدلاً من ناقل LE للاتصال بالجهاز الطرفي، مما يؤدي إلى كشف العنوان العام للهاتف. يعمل هذا مع جميع الهواتف وإصدارات 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) على معرفة عنوان الهوية لشن هجمات إضافية، لذا هناك إمكانية لربط هذا الهجوم مع هجمات أخرى. انظر هذا المستند لبعض العواقب المترتبة على امتلاك المهاجم لعنوان الهوية.
يُنصح بشدة مستخدمو إصدار Android من تطبيق COVIDSafe بتحديث تطبيقهم. بالنسبة لأولئك الذين يستخدمون Android 5، يُنصح بإيقاف تشغيل البلوتوث عند التواجد في موقف لا تكون فيه وظيفة البلوتوث مطلوبة.
تم الإبلاغ عن هذه المشكلة لأول مرة إلى وكالة التحول الرقمي الحكومية الأسترالية في 2 يونيو 2020. تم إصدار الإصلاح الأول في 22 يونيو 2020 لنظام Android 6 وما فوق. وقد تم التأكد من أنه يعمل على Android 6 وما فوق. لكن المشكلة ما زالت تؤثر على Android 5.1. أما الإصلاح الثاني، الذي صدر في 30 يوليو 2020، فقد عالج المشكلة المتبقية مع Android 5.1.
شكرًا لـ Jim Mussared لتأكيد هذه المشكلة بشكل مستقل وللمناقشات المختلفة المتعلقة بهذه المشكلة.