
Исследовательский репозиторий, документирующий эксперименты с переполнением кучи Bluetooth в Android BlueFrag (CVE-2020-0022), включая анализ сбоев в GDB и попытки эксплуатации memcpy.
Похоже, что в Android 9-6 схожая подсистема Bluetooth, а Android 5 и 4 отличаются.
Android 9.0
Эксперименты с BlueFrag
Патч:
https://android.googlesource.com/platform/system/bt/+/3cb7149d8fed2d7d77ceaa95bf845224c4db3baf
Ниже я достиг пропатченного условия. ОК, кажется, я понял, но почему-то не могу обрушить процесс.
хмммм

Вообще-то, удалось передать знаковое значение длины в memcpy()```
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch reassemble_and_dispatch
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch partial_packet->offset 40 packet->len 304 HCI_ACL_PREAMBLE_SIZE 4
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch projected_offset 340 partial_packet->len 41
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch got packet which would exceed expected length of 41. Truncating.
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch memcpy packet->len 1 packet->offset 4 expr -3
02-16 01:44:49.096 6423 6471 W bt_hci_packet_fragmenter: reassemble_and_dispatch partial_packet->data 0xacb14580 partial_packet->data + partial_packet->offset 0xacb145a8 packet->data 0xa553e110 packet->data + packet->offset 0xa553e114
02-16 01:44:49.097 6423 6469 W bt_hci_packet_fragmenter: fragment_and_dispatch fragment_and_dispatch
Всё ещё нет краха, но должен быть.....
В приведённом выше примере при размере memcpy равном -3 это значение интерпретируется как беззнаковое целое (4294967293), и memcpy продолжается до возникновения ошибки страницы из-за немапированной памяти, после чего процесс должен завершиться.
Мой телефон 32-битный, возможно, поэтому. Мобильное устройство — Samsung S3 Neo+. Использую jemalloc как минимум в тестах на Android 9.0.```
¯\_(ツ)_/¯
Похоже, всё работает корректно

Я подозреваю, что нужно открыть много соединений (на некоторое время) и как-то выделить много памяти, прежде чем это упадёт.
Мы передаём здесь 4294967293, почти 4 ГБ``` ¯_(ツ)_/¯
Swing и leommxj обнаружили это странное поведение Android 8:
https://translate.google.com/translate?hl=en&sl=auto&tl=en&u=https%3A%2F%2Fbestwing.me%2FAndroid-8.1-memcpy-func.html
(Переведено с китайского)
Возможно, это также затрагивает Android 9. Проверим.
На самом деле, может быть, это выполняется не в контексте процесса, а, возможно, в контексте прерывания. Тогда, возможно, ошибку можно
скрыть.