Согласно отчетам, представленным Cyber Security News, BLE используется для передачи больших объемов данных за короткие периоды с использованием протоколов BLE. С другой стороны, реклама используется устройствами, совместимыми с BLE, для передачи данных с различными целями, включая возможность сканирования устройств для обнаружения этих совместимых устройств.
Рекламная информация, передаваемая устройствами, включает несколько частей информации, таких как имя устройства, ID производителя, тип и возможности устройства, а также индикаторы, информирующие принимающее устройство о возможностях подключения. Эта передача данных осуществляется в три этапа: на первом этапе рекламный хост настраивает параметры рекламы, одним из которых являются рекламные данные. Второй этап включает передачу пакета BLE, содержащего эти рекламные данные, между контроллерами. Третий этап заключается в отправке принимающим устройством события HCI (Host Controller Interface), содержащего рекламные данные, хосту.
Анализ уязвимости
Стек Bluetooth Windows состоит из множества различных драйверов, сервисов и библиотек пользовательского режима, которые довольно сложны по своей архитектуре. Однако рекламные данные с несколькими частями информации принимаются устройством, совместимым с BLE, и анализируются в разных местах. Для этого Microsoft реализовала статическую библиотеку, которая связывается с модулями. В этой библиотеке есть две функции, которые играют важную роль в анализе рекламных данных: BTHLELibADValidateEx и BthLeLibADValidateBasic.
BTHLELib_ADValidateEx - это функция, которую внешние модули вызывают для преобразования рекламных данных в более подходящий формат. BthLeLib_ADValidateBasic обеспечивает правильную длину каждого рекламного раздела и не позволяет ему выходить за пределы данных. Кроме того, она подсчитывает общее количество разделов в данных, которые затем используются BthLELib_ADValidateEx для выделения памяти для массива выходных разделов.
Именно здесь и кроется уязвимость, которая возникает, когда 8-битное беззнаковое целое число имеет более 255 разделов в данных, что приводит к переполнению переменной. Это в конечном итоге приводит к значению счетчика ниже фактического количества разделов, что также вызывает выделение меньшего объема памяти для массива разделов, чем ожидалось. Это приведет к уязвимости записи за пределами допустимого диапазона, когда данные из отдельных разделов копируются в память, которая должна принадлежать массиву разделов.
Исполнение этой уязвимости с 257 пустыми рекламными данными отправляется на уязвимую систему, что приведет к тому, что BthLeLibADValidateBasic установит numsections равным 1, а объем выделенной памяти для массива разделов будет 0x153 байта. Далее 257 итераций приведут к длине переменной больше выделенного буфера.