
Эксплойт удалённого выполнения кода (RCE) через Bluetooth без взаимодействия с пользователем для Android 8-9 (CVE-2020-0022) с использованием heap spraying, утечки адресов и выполнения цепочки JOP для удалённого выполнения кода через уязвимость BlueFrag.
Большое спасибо Insinuator за их замечательный пост в блоге и код!
Все шаги, упомянутые в посте Insinuator, были выполнены и даже больше. Это слишком много шагов, чтобы помещать их в файл README.md, поэтому смело обращайтесь к упомянутому выше посту Insinuator.
Эксплойт полностью завершён до момента, когда:
Этот эксплойт отличается от реализации Insinuator следующим образом:
libandroid_runtime.so, а не в libicuuc.so, потому что это лучше работало на данном телефоне/целиexecv напрямую, а другая вызывает fork, а затем execvlibandroid_runtime.so и извлекает смещения функций и гаджетов (чтобы упростить перенос эксплойта на другие цели)Это видеодемонстрация, показывающая, как эксплойт изменяет счётчик команд, чтобы указать на пользовательский адрес:

Первая итерация цепочки — та, которую можно увидеть в jop_experiment. Эта цепочка вызывает execv напрямую без вызова fork. Её можно найти в коммите ca28fdf. Вот что происходит при использовании этой цепочки:

Вторая итерация цепочки — та, которая вызывает fork, а затем execv. Полные детали этой цепочки можно найти здесь. Вот что происходит при использовании этой цепочки:

К счастью, Pixel 3 XL имеет защиту, которая предотвращает вызов fork и/или execv процессом Bluetooth. С точки зрения обмена знаниями или демонстрации, моя работа здесь завершена. Если я напишу и поделюсь чем-то более продвинутым, это может быть слишком полезно для чёрных шляп.
Я считаю этот эксплойт завершённым. Возможные будущие улучшения:
dlsym, а затем mprotect, чтобы запустить пользовательский шелл-кодВсе эти вещи превращают этот проект из весёлого проекта по обмену знаниями в эксплойт для чёрных шляп, который можно использовать в качестве оружия, так что на этом моё путешествие заканчивается, пока.... Если у вас есть вопросы, смело связывайтесь.
Чтобы запустить эксплойт, просто выполните:
make build run ARGS="00:00:00:00:00:00"
Где 00:00:00:00:00:00 — это MAC-адрес целевого устройства/жертвы. Кроме make clean, остальные цели сборки полезны только если вы пытаетесь модифицировать, улучшить или перереализовать эксплойт, поэтому нет необходимости подробно их описывать.
gdbserver для Android можно найти в папке NDK# На цели
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# На хосте
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# На хосте
adb push ./gdbinit /data/local/tmp/gdbinit
# На цели
su
/data/data/com.termux/files/usr/bin/gdb -q -x /data/local/tmp/gdbinit -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# ИЛИ
/data/data/com.termux/files/usr/bin/gdb -q -p $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
Вы можете перезапустить службу Bluetooth на машине атакующего, если она перестала работать:
sudo systemctl restart bluetooth.service
В этом разделе объясняются некоторые явления, которые наблюдались во время разработки этого эксплойта:

base::MessageLoop, используемого через get_message_loop:
unordered_map partial_packets. Это было выяснено с помощью map_experiment

