FlawOpen

flawopen.com/Teardowns/cve-2026-55269-android-snooplogger-heap-write

● CVE-2026-55269 · CVSS 7.8 · Высокий
Исследования · FlawOpen

CVE-2026-55269: запись за границы буфера Android Bluetooth SnoopLogger

CVE-2026-55269 — ошибка безопасности памяти в Android Bluetooth SnoopLogger, способная привести к локальному повышению привилегий. При особой конфигурации журнала короткий пакет контроллера мог дойти до записи фиксированной строки без достаточного места. Google исправил инвертированное условие расширения буфера и ограничил разобранную длину.

💡 Простыми словами (ELI5)

Представьте служащего, который ставит штамп «PROHIBITED» на узкую посылку. Сначала к ней нужно добавить упаковку, но перевёрнутая табличка заставляла пропускать этот шаг для самых маленьких посылок. Исправление добавляет место до штампа и ограничивает записанную длину размером доступной посылки.

Ключевые понятия и термины

SnoopLogger
Код Bluetooth в Android, который фильтрует и записывает захваченные HCI-пакеты. Уязвимый путь требует указанной конфигурации фильтрованного журнала.
Пакет HCI ACL
Пакет данных между хостом Bluetooth и контроллером. Согласно upstream-изменению, необычно короткий пакет может выявить недостаточную ёмкость буфера при активном фильтре.
EXTRA_BUF_SIZE
Дополнительная ёмкость перед записью фиксированной метки «PROHIBITED» в отфильтрованный пакет. Исправление добавляет её для коротких пакетов.
CWE-20
Недостаточная проверка входных данных. CISA ADP указывает эту слабость; конкретная ошибка состояла в инвертированном условии размера при работе с буфером.

Связи со стандартами

  • Концептуальное соответствие FlawOpen для MITRE CWE; ни поставщик, ни запись CVE не присваивали этот идентификатор слабого места данной исследовательской демонстрации. CWE-20

Анализ первопричины

В бюллетене Android за октябрь 2026 года CVE-2026-55269 относится к Android 16, 16 QPR2 и 17. В NVD сейчас указана оценка CISA ADP CVSS 3.1 7,8 (Высокая), тогда как Google помечает запись System как Критическую; это разные оценки. В upstream-коммите Bluetooth SnoopLogger::FilterCapturedPacket переходит в фильтрованный путь PBAP/MAP, где PayloadStrip может записать фиксированную метку PROHIBITED. Уязвимое условие packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE пропускало дополнение буфера для коротких пакетов, оставляя недостаточную ёмкость. Исправление меняет оператор на <= и ограничивает length значением packet.size() + PACKET_TYPE_LENGTH. В коммите описан вредоносный Bluetooth-контроллер, отправляющий короткий HCI ACL-пакет; при этом должны быть включены соответствующие параметры разработчика и фильтр SnoopLogger. Это не Android-служба, доступная из интернета. Эксплойт-payload не приводится. Срок выпуска обновления зависит от производителя устройства.

Пошаговый сценарий атаки

Шаг 1

Активна особая конфигурация журнала

В коммите описаны включённая фильтрация Bluetooth SnoopLogger в параметрах разработчика и профиль PBAP/MAP magic. Не переносите эти условия на все устройства Android и настройки по умолчанию.

Шаг 2

Контроллер передаёт необычно короткий пакет

Вредоносный Bluetooth-контроллер может отправить короткий пакет HCI ACL в фильтрованный путь захвата. Байты пакета и инструкции запуска опущены.

Шаг 3

Инвертированное условие пропускает расширение

FilterCapturedPacket использовал > вместо <=. Короткие пакеты не получали EXTRA_BUF_SIZE, но фильтрация могла записать метку PROHIBITED в недостаточный буфер.

Шаг 4

Upstream-исправление восстанавливает границу буфера

Исправление дополняет подходящие короткие пакеты и ограничивает длину доступными данными. Установите обновление производителя с уровнем патча 2026-10-01 или выше, когда оно станет доступно.

Исходный код: Уязвимый vs Защищённый вариант

Этот фрагмент соответствует общедоступному исправлению Google: условие меняется так, чтобы короткий пакет получил дополнительную ёмкость для метки, а разобранная длина ограничивалась доступным размером. В коммите также добавлены тесты коротких пакетов. Это сокращённая иллюстрация upstream-исправления, а не самостоятельный патч для устройства; установите обновление производителя с уровнем 2026-10-01 или новее.

Фрагмент исходного кода: snoop_logger.cc

УЯЗВИМАЯ РЕАЛИЗАЦИЯ
if (packet.size() + EXTRA_BUF_SIZE > DEFAULT_PACKET_SIZE) {
  // В коротких пакетах нужно предусмотреть место для маркера фильтра.
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// Затем PayloadStrip записывает фиксированный маркер PROHIBITED.
БЕЗОПАСНЫЙ ИСПРАВЛЕННЫЙ ВАРИАНТ
if (packet.size() + EXTRA_BUF_SIZE <= DEFAULT_PACKET_SIZE) {
  // Дополните подходящие короткие пакеты до фильтрации.
  packet.resize(packet.size() + EXTRA_BUF_SIZE);
}

// Ограничьте разобранную длину размером увеличенного пакета.
length = std::min(
    length, static_cast<uint32_t>(packet.size() + PACKET_TYPE_LENGTH));

Чек-лист по защите системы для инженеров

Источники