
CVE-2019-2215에 대한 Android 커널 익스플로잇으로, Binder 드라이버의 use-after-free 취약점을 이용하여 취약한 ARM64 장치에서 메모리 손상 및 cred 패칭을 통해 루트로 권한 상승을 가능하게 합니다.
CVE-2019-2215 — Android Binder Use-After-Free 권한 상승 설명
CVE-2019-2215 취약점을 위한 익스플로잇 — Android 커널의 binder 드라이버에서 use-after-free. 취약한 기기에서 권한을 root까지 상승시킬 수 있습니다. 취약점
CVE-2019-2215 — epoll 작업 중 binder_thread에서 발생하는 use-after-free. binder_poll()의 wait 큐 처리 오류로 인해 커널 메모리 덮어쓰기가 가능해집니다.
작동 원리
포인터 유출 (leakTaskStruct)
epoll과 binder 간의 경쟁 상태로 인해 writev/pipe를 통해 현재 프로세스의 task_struct 포인터를 읽습니다.
addr_limit 덮어쓰기 (clobberAddrLimit)
동일한 경쟁 상태를 이용해 task_struct 구조체의 addr_limit 필드에 0xFFFFFFFFFFFFFFFE를 기록하여 전체 커널 메모리에 접근 가능하게 합니다.
cred 패치 (patchCred)
pipe 채널(kernel_fd)을 통해 현재 프로세스의 cred 구조체를 읽고 덮어씁니다:
UID/GID = 0 (root)
전체 capabilities (CAP_FULL_SET)
SELinux 비활성화 (disableSELinuxEnforcing)
nsproxy를 통해 커널 베이스 주소를 계산하고 selinux_enforcing 플래그를 0으로 설정합니다.
root 권한의 셸 실행: system("/bin/sh")
요구 사항
취약한 Android 버전(2019년 10월 패치 이전)이 설치된 기기
ARM64 아키텍처
/dev/binder 존재
컴파일 시 다음 커널 심볼 지정 필요:
init_nsproxy — 커널 베이스 계산용
selinux_enforcing — SELinux 비활성화용
심볼은 대상 시스템의 /proc/kallsyms에서 얻을 수 있습니다.