
BLURtooth: Exploiting Cross-Transport Key Derivation in Bluetooth Classic and Bluetooth Low Energy [CVE-2020-15802] [CVE-2022-20361]
Репозиторий об атаках BLUR, представленных на AsiaCCS'22 в статье под названием: BLURtooth: Exploiting Cross-Transport Key Derivation in Bluetooth Classic and Bluetooth Low Energy.
Полезные ссылки: pdf, видео, слайды, веб-сайт.
Запись BibTex:
@inproceedings{antonioli22blur,
author={Antonioli, Daniele and Tippenhauer, Nils Ole and Rasmussen, Kasper
and Payer, Mathias},
title={{BLURtooth: Exploiting Cross-Transport Key Derivation in
Bluetooth Classic and Bluetooth Low Energy}},
booktitle={Proceedings of the Asia conference on computer and
communications security (ASIACCS)},
month={May},
year={2022}
}
Атакам BLUR были присвоены CVE-2020-15802 и CVE-2022-20361.
В оставшейся части README мы обозначаем Bluetooth Classic (также известный как BR/EDR) как BT, Bluetooth Low Energy как BLE, а также Cross-Transport Key Derivation как CTKD. Мы также предполагаем, что атакующее устройство и жертвы поддерживают BT, BLE и CTKD. Это означает, что устройства поддерживают Bluetooth 4.2+ и BT/BLE Secure Connections (безопасные соединения).
Самый простой способ выполнить атаки — использовать одно устройство одновременно в качестве жертвы и атакующего устройства. Например, мы рекомендуем использовать ноутбук с Linux в качестве жертвы/атакующего устройства, а любое другое устройство — в качестве другой жертвы.
Мы используем машину с Linux, работающую с bluez
и bluez tools. Мы
полагаемся на инструмент btmgmt, и может быть полезно просмотреть его
исходный код. В
частности, мы используем его подкоманду pair, которая, помимо прочего, позволяет отправлять
произвольные запросы на сопряжение через BT/BLE, объявляя произвольные возможности
ввода-вывода.
Usage: pair [-c cap] [-t type] <remote address>
Если вы хотите воспроизвести точный сценарий атаки, представленный в нашей статье, вам необходимо проделать дополнительную работу. В частности, вам нужно воспроизвести настройку, представленную в атаке BIAS. Когда ваша настройка будет готова, вы сможете использовать плату разработки в качестве вашего BT/BLE-контроллера, а ноутбук с Linux — в качестве хоста. Более того, вы сможете перехватывать пакеты канального уровня от хоста (например, трафик BT LMP) и динамически патчить прошивку платы разработки во время выполнения с помощью internalblue.
Этот шаг является опциональным и требует патча вашего собственного ядра Linux.
При использовании btmgmt -c 3 bluez автоматически снимает флаг защиты MitM,
например, устанавливает байт AuthReq в 0x02 вместо 0x03.
Однако атаки BLUR не требуют снятия этого флага, а только требуют
объявления возможностей NoInputNoOutput, когда удаленное устройство поддерживает
возможности ввода-вывода. Выполняя этот трюк, процедура сопряжения понижается
до Just Works без снятия флага MitM.
Реализация этой настройки требует минимальной модификации ядра Linux. В
частности, в /net/bluetooth/hci_event.c мы меняем:
cp.authentication = conn->auth_type;
на:
cp.authentication = 0x03;
Таким образом, мы жестко задаем наш флаг AuthReq равным 0x03 независимо от
объявляемых возможностей ввода-вывода.
Сопрягите устройства-жертвы как обычно. Например, если вы нацелились на смартфон, сопрягите его с вашим ноутбуком (выступающим одновременно в роли жертвы и атакующего устройства). Для сопряжения может потребоваться взаимодействие с пользователем (например, Numeric Comparison).
REMOTE-BTADDhciconfig и запомните ваш индекс hci, например 0sudo btmgmt -i 0[hci0] #Здесь я предполагаю, что жертва использует публичный BLE-адрес. Если используется
случайный, измените опцию -t на 2
Из CLI btmgmt выполните:
pair -t 1 REMOTE-BTADD
Если вам также нужно понизить ассоциацию до Just Works, выполните:
pair -c 3 -t 1 REMOTE-BTADD
Флаг -c устанавливает возможности ввода-вывода атакующего, при этом значение
0x3 соответствует NoInputNoOutput, тогда как значение по умолчанию для
ноутбука/смартфона — 0x1, соответствующее Display Yes/No.
В этом случае, даже если мы выдаем себя за BLE-периферийное устройство, мы выполняем сопряжение через BT в качестве центрального.
Из CLI btmgmt выполните:
pair -t 0 REMOTE-BTADD
Если вам также нужно понизить ассоциацию до Just Works, выполните:
pair -c 3 -t 0 REMOTE-BTADD
Повторите описанные выше атаки, выдавая себя за устройство, которое в настоящее время неизвестно (т.е. не сопряжено) жертве.
Из CLI bluetoothctl вы можете установить
discoverable в on или off и pairable. Из CLI btmgmt вы также
можете установить флаг connectable.
Из bluetoothctl
вы можете контролировать тайм-аут обнаруживаемости с помощью discoverable-timeout,
например, если установить его в 0, устройство будет всегда обнаруживаемым.
Для BT, во время сопряжения с удаленным устройством в качестве центрального или
периферийного, вы получите следующий LMP-пакет: LMP not accepted ext (opcode: 0x02) с кодом ошибки «сопряжение не разрешено» (error code: 0x18)
Для BLE, во время сопряжения с удаленным устройством в качестве центрального или
периферийного, вы получите следующий SMP-пакет: SMP Pairing Failed Command
(opcode 0x05) с Pairing Not Supported (reason 0x05).
Для BT, во время сопряжения с удаленным устройством проверьте поддержку Secure Connections
для хоста и контроллера в пакетах функций LMP, например, используя
следующий фильтр отображения Wireshark: btbrlmp.efeat.scc or btbrlmp.efeat.sch.
Для BLE, во время сопряжения с удаленным устройством в SMP Pairing Request или
Response проверьте байт AuthReq, содержащий флаг Secure Connection,
например, используя следующий фильтр отображения Wireshark: btsmp.sc_flag == 1.
Для BT, во время сопряжения с удаленным устройством трафик BLE SMP туннелируется
через L2CAP. Поэтому, используя фильтр Wireshark btl2cap.payload, вы должны увидеть один
пакет от центрального к периферийному устройству, содержащий полезную нагрузку,
начинающуюся с 0x01 (SMP Pairing Request), и другой пакет в обратном направлении с
полезной нагрузкой, начинающейся с 0x02 (SMP Pairing Response). Затем вы также должны
увидеть другие сырые L2CAP-пакеты, кодирующие фазу распространения SMP-ключей.
Для BLE, во время сопряжения с удаленным устройством в SMP Pairing Request или
Response проверьте, что и центральное, и периферийное устройство готовы отправлять
и получать ключ связи во время распространения SMP-ключей, например, используйте
следующий фильтр Wireshark: btsmp.key_dist_linkkey or btsmp.key_dist_linkkey.