
초기 삼성 휴대폰에 도입된 /dev/exynos-mem 취약점에 대한 익스플로잇
이전 삼성 휴대폰에 도입된 /dev/exynos-mem 취약점을 악용하기 위한 POC입니다.
커널 취약점 연구에 대한 관심과 CTF 챌린지의 일환으로 만들어졌습니다.
이 휴대폰들에 도입된 취약점은 exynos-mem 장치에 대한 권한입니다. 비루트 사용자조차도 R/W를 모두 허용했습니다!
exynos-mem 장치는 /dev/mem에 직접 읽기/쓰기를 할 수 있게 해주는 장치로, 커널 코드/데이터에 직접 쓸 수 있음을 의미합니다.
/proc/iomem을 활용하면 운영 체제에서 어떤 물리 주소가 어떤 메모리에 해당하는지 빠르게 알아낼 수 있고, Kernel Code / Data 메모리가 어디에 있는지도 찾을 수 있습니다.
이 익스플로잇은 이를 이용해 루트 권한을 얻기 위해 몇 가지 작업을 수행합니다:
/proc/kallsyms에 접근할 수 없으며, 이는 우리를 불리하게 만듭니다. 따라서 커널 메모리를 스캔하여 kallsyms에서 사용되는 형식 문자열(seq_printf(m, "%pK %c %s\n", (void *)iter->value, iter->type, iter->name);)을 찾고
이를 %pK 대신 %p로 패치하여 사용자에게 심볼 주소가 출력되도록 합니다./proc/kallsyms를 읽어 setuid()를 호출하는 사용자에게 권한이 있는지 확인하는 데 사용되는 심볼 nsown_capable의 주소를 찾습니다.nsown_capable의 함수 코드를 그냥 return true;로 덮어써서, 어떤 사용자든 원하는 uid로 setuid()를 호출할 수 있게 합니다.setuid(0)을 호출하고 system(/bin/sh)를 실행합니다.이 파일의 상수는 시스템에 맞게 조금 변경해야 할 수 있습니다. 필요에 따라 설정하십시오.