
Android kernel exploit для CVE-2019-2215, use-after-free в драйвере Binder, позволяющий повышение привилегий до root через повреждение памяти и исправление cred на уязвимых ARM64-устройствах.
CVE-2019-2215 — Android Binder Use-After-Free Privilege Escalation Описание
Эксплоит для уязвимости CVE-2019-2215 — use-after-free в драйвере binder ядра Android. Позволяет повысить привилегии до root на уязвимых устройствах. Уязвимость
CVE-2019-2215 — use-after-free в binder_thread при работе с epoll. Ошибка возникает из-за некорректной обработки wait-очереди в binder_poll(), что приводит к возможности перезаписи памяти ядра.
Принцип работы
Утечка указателя (leakTaskStruct)
Гонка между epoll и binder приводит к чтению указателя на task_struct текущего процесса через writev/pipe.
Перезапись addr_limit (clobberAddrLimit)
Используется та же гонка для записи 0xFFFFFFFFFFFFFFFE в поле addr_limit структуры task_struct, что открывает доступ ко всей памяти ядра.
Патч cred (patchCred)
Через pipe-канал (kernel_fd) читается и перезаписывается структура cred текущего процесса:
UID/GID = 0 (root)
Полные capabilities (CAP_FULL_SET)
Отключение SELinux (disableSELinuxEnforcing)
Через nsproxy вычисляется базовый адрес ядра, и флаг selinux_enforcing обнуляется.
Запуск оболочки с правами root: system("/bin/sh")
Требования
Устройство с уязвимой версией Android (до патча октября 2019)
Архитектура ARM64
Наличие /dev/binder
При компиляции требуется указать символы ядра:
init_nsproxy — для вычисления базы ядра
selinux_enforcing — для отключения SELinux
Символы можно получить из /proc/kallsyms на целевой системе.