
안드로이드 8-9를 위한 제로클릭 블루투스 RCE 익스플로잇 (CVE-2020-0022)으로, 힙 스프레이, 주소 누출 및 JOP 체인 실행을 통해 BlueFrag 취약점을 이용한 원격 코드 실행을 수행합니다.
Insinuator의 놀라운 블로그 게시물과 코드에 많은 감사를 전합니다!
Insinuator 게시물에 언급된 모든 단계가 완료되었으며, 그 이상도 수행되었습니다. 이러한 단계는 README.md 파일에 넣기에는 많으므로 위에서 언급한 Insinuator의 게시물을 확인해 주세요.
익스플로잇은 다음 지점까지 완전히 완료되었습니다:
이 익스플로잇은 다음 측면에서 Insinuator의 구현과 다릅니다:
libicuuc.so 대신 libandroid_runtime.so의 주소를 유출합니다execv를 직접 호출하고, 다른 하나는 fork를 호출한 후 execv를 호출합니다다음은 익스플로잇이 PC를 수정하여 사용자 지정 주소를 가리키도록 하는 비디오 데모입니다:

체인의 첫 번째 반복은 jop_experiment에서 볼 수 있습니다. 이 체인은 fork를 호출하지 않고 execv를 직접 호출합니다. 커밋 ca28fdf에서 찾을 수 있습니다. 이 체인을 사용할 때 발생하는 상황은 다음과 같습니다:

체인의 두 번째 반복은 fork를 호출한 다음 execv를 호출하는 것입니다. 이 체인의 전체 세부 정보는 여기에서 확인할 수 있습니다. 이 체인을 사용할 때 발생하는 상황은 다음과 같습니다:

다행히도 Pixel 3 XL에는 Bluetooth 프로세스가 fork 및/또는 execv를 호출하지 못하도록 하는 보호 기능이 있습니다. 지식 공유나 자랑 측면에서 제 작업은 여기까지입니다. 더 고급 기술을 작성하여 공유하면 블랙햇에게 너무 도움이 될 수 있습니다.
이 익스플로잇은 완전하다고 생각합니다. 향후 개선 사항은 다음과 같습니다:
dlsym을 호출한 다음 mprotect를 호출하는 JOP 체인 작성이 모든 것은 이 프로젝트를 재미있는 지식 공유 프로젝트에서 무기화될 수 있는 블랙햇 익스플로잇으로 바꾸므로, 지금으로서는 제 여정이 여기서 끝납니다.... 질문이 있으시면 언제든지 연락해 주세요.
익스플로잇을 실행하려면 다음을 실행하세요:
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
이 섹션에서는 이 익스플로잇 개발 중 관찰된 몇 가지 현상을 설명합니다:

get_message_loop을 통해 사용되는 base::MessageLoop 객체의 vtable을 수정하는 의도치 않은 오버플로로 인해 타겟이 충돌할 가능성을 줄이기 위해 힙 클리너 패킷을 스프레이하고 있습니다:
partial_packets unordered_map의 각 항목에 대해 하나의 연결 리스트 항목을 포함하는 32바이트 malloc 청크를 대상으로 하여 패킷의 주소를 유출하고 있었습니다. 이는 map_experiment를 통해 알아냈습니다.

