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

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

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

К счастью, в Pixel 3 XL есть защиты, которые не позволяют Bluetooth-процессу вызывать fork и/или execv. С точки зрения обмена знаниями или демонстрации возможностей, моя работа здесь завершена. Если я напишу и опубликую что-то более продвинутое, это может оказаться слишком полезным для блэкхэтов.
Я считаю этот эксплойт завершённым. Возможные будущие улучшения:
dlsym, а затем mprotect, чтобы выполнить собственный шеллкод;Все эти вещи превращают этот проект из увлекательного проекта по обмену знаниями в блэкхэт-эксплойт, который можно использовать как оружие, поэтому здесь мой путь заканчивается, пока что.... Если у вас есть вопросы, смело свяжитесь со мной.
Чтобы запустить эксплойт, просто выполните:
make build run ARGS="00:00:00:00:00:00"
Здесь 00:00:00:00:00:00 — это MAC-адрес целевого устройства/жертвы. Помимо make clean, остальные цели сборки полезны только в том случае, если вы пытаетесь модифицировать, улучшить или перереализовать эксплойт, так что нет необходимости подробно их описывать.
gdbserver можно найти в папке NDK# On target
/data/local/tmp/gdbserver 0.0.0.0:1234 --attach $(ps -A | grep -i "com.android.bluetooth" | awk '{print $2}')
# On host
adb forward tcp:1234 tcp:1234
gdb-multiarch -q -x ./gdbinit
# On host
adb push ./gdbinit /data/local/tmp/gdbinit
# On target
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}')
# OR
/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

