
BlueFrag(CVE-2020-0022) Android Bluetooth 힙 오버플로 실험, 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+이다. 적어도 Android 9.0 테스트에서는 jemalloc을 사용한다.```
¯\_(ツ)_/¯
잘 보이는 것 같네요

충돌이 발생하기 전에 많은 연결을 (일정 시간 동안) 열고 어떻게든 많은 메모리를 할당해야 할 것 같습니다.
여기서 우리는 4294967293, 거의 4GB를 밀어넣고 있습니다``` ¯_(ツ)_/¯
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에도 영향을 미칠 가능성이 있다. 확인해 볼 것이다.
사실 이것이 프로세스 컨텍스트에서 실행되지 않고, 아마도 인터럽트 컨텍스트에서 실행될 수도 있다. 그렇다면 아마도 이 결함은
숨겨질 수 있을 것이다.