
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
以下でパッチ済みの条件に到達した。OK、理解できたと思うが、なぜかプロセスをクラッシュさせることができない。
うーん

実際には、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にも影響します。確認します。
実際には、これはプロセスコンテキストではなく、おそらく割り込みコンテキストで実行される可能性があります。そうであれば、フォールトは隠蔽されるかもしれません。