Уязвимость в Bluetooth-стеке BlueZ, позволяющая удалённо выполнить код с правами ядра Linux

Инженеры из компании Google выявили серьёзную уязвимость (CVE-2020-12351) в свободном Bluetooth-стеке BlueZ, используемом в дистрибутивах Linux и Chrome OS. Уязвимость, которой присвоено кодовое имя BleedingTooth, позволяет неавторизированному атакующему без участия пользователя организовать выполнение своего кода на уровне ядра Linux через отправку специально оформленных Bluetooth-пакетов.

Проблема может быть эксплуатирована атакующим, находящимся в пределах досягаемости Bluetooth — предварительного сопряжения не требуется, но нужно чтобы на компьютере был активен Bluetooth. Для атаки достаточно знать MAC-адрес устройства жертвы, который может быть определён путём снифинга или на некоторых устройствах вычислен на основе MAC-адреса Wi-Fi. Для проверки наличия проблемы опубликован прототип эксплоита.

Уязвимость присутствует в компонентах, выполняющих обработку пакетов L2CAP (Logical link control and adaptation protocol) на уровне ядра Linux. Через отправку специально оформленного L2CAP-пакета с дополнительными данными для канала A2MP, атакующий может добиться перезаписи области за пределами выделенной памяти, что потенциально может использоваться для создания эксплоита для выполнения произвольного кода на уровне ядра.

При указании в пакете CID, отличающемся от L2CAP_CID_SIGNALING, L2CAP_CID_CONN_LESS и L2CAP_CID_LE_SIGNALING, в BlueZ вызывается обработчик 2cap_data_channel(), который для каналов в режимах L2CAP_MODE_ERTM и L2CAP_MODE_STREAMING вызывает функцию l2cap_data_rcv(). Если контрольная сумма совпадает далее выполняется вызов фильтра каналов sk_filter(). Для пакетов с CID L2CAP_CID_A2MP канал отсутствует, поэтому для его создания вызывается функция a2mp_channel_create(), которая использует при обработке поля chan->data тип «struct amp_mgr», но тип для данного поля должен быть «struct sock».

Уязвимость проявляется начиная с ядра Linux 4.8 и, несмотря на заявления Intel, не устранена в недавно опубликованном выпуске 5.9. В дистрибутивах проблема пока остаётся неисправленной (Debian, RHEL (уязвимость подтверждена в выпусках RHEL, начиная с 7.4), SUSE, Ubuntu, Fedora). Платформа Android проблеме не подвержена, так как в ней применяется свой Bluetooth-стек Fluoride, основанный на коде проекта BlueDroid от компании Broadcom.

Мэтью Гаррет (Matthew Garrett), известный разработчик ядра Linux, в своё время получивший от Фонда СПО премию за вклад в развитие свободного ПО, утверждает, что информация в отчёте Intel неверна и ядро 5.9 не включает должных исправлений для устранения уязвимости (патчи вошли в ветку linux-next, а не в ветку 5.9). Он также выразил возмущение политикой Intel по раскрытию уязвимостей — разработчики дистрибутивов Linux до публикации отчёта не были уведомлены о проблеме и не имели возможность заранее бэкпортировать патчи для своих пакетов с ядром.

Дополнительно сообщается о выявлении ещё двух уязвимостей в BlueZ:

  • CVE-2020-24490 — переполнение буфера в коде разбора пакетов HCI (hci_event.c). Удалённый атакующий через отправку широковещательных анонсов может добиться переполения буфера и выполнения кода на уровне ядра Linux. Атака возможна только на устройства, поддерживающие Bluetooth 5, в момент активности на них режима сканирования.
  • CVE-2020-12352 — утечка информации из стека при обработке пакетов A2MP. Проблема может быть использована атакующим, знающим MAC-адрес устройства, для получения данных из стека ядра, в котором потенциально может находиться конфиденциальная информация, такая как ключи для шифрования. В стеке также могут находиться указатели, поэтому проблема может использоваться для определения раскладки памяти и обхода защиты KASLR (рандомизация адресов) в эксплоитах для других уязвимостей.

Источник: http://www.opennet.ru/opennews/art.shtml?num=53892