안드로이드 장치 드라이버에 대한 효과적 취약점 탐지 기법
안드로이드 장치 드라이버에 대한 효과적 취약점 탐지 기법
해당 논문에서 정보를 얻을 만한 부분만 따로 추출하였음.
악의적인 공격을 사전에 방지하기 위해, US-CERT 혹은 ETSI standard별 시큐어 코딩(secure coding) 요 구조건[2,3]을 적용하거나 전통적인 취약점 탐지 기법인 모의해킹(penetration testing)을 적용하는 것은 Zero-day attack을 포함한 새로운 공격과 관련된 보안 취약점 검 출에 한계가 있다.
정적 취약점 분석에 관한 다양한 연구 사례가 있다. 방지호의 연구[5]에서는, JAVA언어로 쓰여진 어플리케 이션에 대한 보안 취약점을 탐지하기 위해, 표 1의 공개 용 정적 분석 도구를 사용했다.
정적 분석 도구들은 JAVA 어플리케이션/ 소스코 드에 대해 다음과 같은 항목들을 검사한다.
- 입력 데이터 검증 및 표현
- 보안성이 취약한 암호알고리즘 사용, 평문으로 기록된 비밀번호 등
- 시간 및 상태
- 에러처리
- 코드오류
- 캡슐화
- API오용
안드로이드 기반 모바일 시스템에 있어서 위협은, 여 러가지 요인과 연관되어 있다. 대표적인 요인은 공격표 면(attack surface)과 연관된 취약점이다. 안드로이드 시 스템에서 공격표면은
- 입력 값 처리
- 버퍼 오버플로우(buffer overflow)
- 정수 오버플로우(integer overflow)
- 경로 탐색(path traversal)
- 자원(파일 등의 대상 객체)에 대한 접근권한(access right = permission,또는 보안수준) 처리
- 프로세스간 통신(Inter-Process Communication, IPC)
전통적인 리눅스 시스템에 있어서 자원에 대한 비정 상적인 접근을 방지하기 위하여 임의 접근제어(Discretionary Access Control, DAC)모델[13]이 사용되고 있 고, 최근 시스템에는 강제 접근제어(Mandatory Access Control, MAC)[14] 등의 진보된 접근제어 기술이 도입 되어 적용되고 있다.
공격자가 루트 권한 혹은 시스템 권한 어플리케이션 의 데이터를 접근하기 위해서, 사용자 권한의 특정 어플 리케이션에 악성 코드를 포함시키는데, 이 경우 악성 코 드의 공격 방법은 다음과 같다. 예를 들어, 카메라 디바 이스가 일반 사용자 권한으로 접근할 수 있도록 설정되 어 있고, 해당 디바이스 드라이버 코드에 버퍼 오버플로 우 취약점이 있으며, 해당 디바이스 드라이버에서 이미 지 저장 시 시스템 권한으로 파일이 작성된다. 이때 버 퍼 오버플로우는 이미지 저장 시 해당 함수가 헤더의 정보를 보고 그 크기에 따라 메모리 공간을 할당할 때 발생될 수 있는 취약점이라고 가정한다면, 공격자의 악 성 코드는 비정상적 이미지 크기 정보와 함께 버퍼보다 더 큰 이미지를 할당하여 버퍼 오버플로우를 유도한다. 버퍼 오버플로우가 유도되었을 때의 권한은 시스템권한 이고, 복귀되는 주소는 SMS를 추출하는 코드의 주소일 경우 SMS메시지를 불법으로 추출 가능하다.
Vulnerabilities | Types of vulnerability related to privilege escalation |
---|---|
Buffer overflow | 1, 2, 3 |
Integer error | 3 |
Memory leaks | 3 |
Race condition | 3 |
MMU addressing error | 1, 2, 3 |
Files I/O error | 3 |
Inconsistent operation | 3 |
Syscall bridging | 3 |
Wrong exit condition | 3 |
Pointers error | 1, 2, 3 |
Group | Selection criteria | |
---|---|---|
0 | Vulnerabilities found both in static and dynamic analysis, and can be used as targets for immediate attacks | |
1 | Vulnerabilities found either in static or dynamic analysis, and can be used as targets for immediate attacks | |
2 | Vulnerabilities found either in static or dynamic analysis, but can’t be used as targets for immediate attacks. | But if combined with other vulnerabilities, permission can be upgraded for attacks |
3 | Vulnerabilities like in 2 Group, but permission can’t be upgraded for attacks |
보안 취약점 분석은 일반적으로 코드 기반의 정적 분 석 방법, 코드 기반+런타임 기반 혹은 런타임 기반의 동 적 분석 방법으로 나누어진다(표 5 참조).
- Static
- Code-based analysis
- Code-based + Target binary-based analysis
- Analysis of code that is reverse engineered
- Dynamic
- Virtual /images/ analysis
- Runtime analysis
- Runtime + Reverse engineered code analysis
정적 분석 방법
정적 분석 방법은 알려진 취약점 혹은 규칙에 따라서 소스 코드나 목적 코드를 분석한다. 효과적인 정적 분석 을 위하여 본 논문에서는 위협 분석을 CWE/CVE 기반 데이터로 구성하였으며, 실제 공격이 가능한 대상을 선 별하였다. US-CERT Secure Coding Guide에 따라서 분석 가능한 도구를 선정 및 개발 하였다. 도구 구성은 개발 코드의 언어별 종류, 사용하는 라이브러리, 시스템 에 따라서 다양하게 구분되며, 공격 대상이 되는 종류에 따라서 분석 도구를 선정한다. 선정된 도구를 기반으로 1차 분석하여 결과를 검토하며, 필요 시 몇몇 도구를 조 합하여 사용한다. 조합에 있어서는 분석해야 하는 코드 의 언어, 종류, 코드의 구현 방법이 다른 언어의 코드를 조합하여 사용하는 함수가 있는지, 그리고 해당 코드는 어떤 목적으로 사용되는지에 따라 다양하게 달라질 수 있으나, 본 논문에서는 ANSI표준 C 언어가 그 분석 대 상이고, C 언어로 된 코드에서 ASM코드가 포함이 되 어 있기 때문에 Flawfinder로 일반적인 C코드 취약점을 확인 하였다. 또한 AppScan이 근래 모바일 악성 코드 의 코드 구조를 모두 포함하고 있기 때문에 AppScan을 사용하였으며, Coverity의 결과와 비교 검토하였다.
동적 분석 방법
일반적인 동적 분석 방법은 런타임에 다양한 입력값 을 발생시켜서 특정 타깃 동작을 확인하는 방법을 모두 동적 분석 방법으로 분류한다면, 본 논문의 방법은 시스 템 콜을 입력값으로 발생시키고, 비정상적인 커널 크래 쉬를 특정 타깃 동작으로 확인하는 동적 분석 방법이다. 이는, 디바이스 드라이버의 입/출력은 모두 시스템 콜을 기반으로 커널 입/출력인 것이고, 발생되는 결과는 정상 적인 디바이스 드라이버 동작 혹은 커널의 대응 동작이 수행되거나, 혹은 커널의 비정상적인 동작이 발생하는 것이 예상된다. 따라서 본 논문의 실험에서는 그 중 디 바이스드라이버 함수에서 비정상적인 오버플로우 이슈 가 발생하고, 그 영향으로 커널 크래쉬가 발생하는 것을 확인하고, 보안 취약점으로 확인한다.
본 논문에서는 런타임 기반 분석 방법 중 다양한 입 력을 생성하여 비정상 입력 조합을 구성할 수 있는 dumb fuzzing을 적용하였다. Dumb fuzzing은 복잡한 공격의 탐지에는 효과적으로 적용하기 힘든 방법이지만, 오버플로우 등 주요 취약점들에 대해서는 빠른 시간 내 에 탐지할 수 있고, fuzzer 구성이 어렵지 않다는 장점 이 있다. 그러나 동적 분석 방법은 단일 디바이스 혹은 단일 시스템의 검증에서 빠른 취약점 확인 방법으로 유 용하지만, 시스템 혹은 디바이스(HW chip)에 따라 인 터페이스 및 생성 시스템 콜 등을 모두 최적화 및 수정 해야 하는 단점이 있다. 본 논문에서는 위협 분석의 대 상으로 선정된 디바이스 드라이버에 대해 각 fuzzer를 구성하여 공격 시험하였다. 동적 분석 방법에 있어서 UI에서는 필요한 파라미터 선정 및 대상 드라이버 선정/탐색 단계를 진행하며, Fuzzer core에서는 입력된 파라미터에 따라서 시스템 콜을 구성한다. Fuzzer driver에서는 정의된 시스템 콜 을 IOCTL로 생성하며, 생성된 시스템 콜의 응답이나 혹은 시스템 크래쉬 등을 확인하여 중요 취약 함수를 확인할 수 있다. 분석 대상 드라이버(Target driver)의 세부 호출 함수의 취약점을 확인하고 결과를 검토하였다.
그림 4 그림 5
나타난 코드에서 결국 “copy_from_user” 함수가 사용되는데, 이는 시스템 권한의 커널 모듈에서 사용자 권한의 파일이나 데이터를 읽어오기 위한 함수 이며, 읽어올 때에는 시스템권한으로 읽어온다. 위 코드 에서 data와 task 스트럭쳐(structure)가 사용되는데, task의 내용은 그림 5와 같이 정의되어 있다.
읽어온 데이터를 저장할 때에 배열의 인덱스와 데이 터를 복사하는 것은 위 그림 5 마지막 두 라인에 for 루프로 구성되어 있다. 해당 데이터는 잘못된 입력으로 인하여 예상되는 인덱스와 데이터 보다 큰 데이터의 입 력이 발생할 수 있기 때문에 버퍼 오버플로우 취약점이 된다. 분석으로 확인된 보안 취약점은 Exynos기반의 안 드로이드 기기에서 카메라 드라이버 관련 코드에 존재 하였다.
그림 6
해당 취약점에 대한 동적 분석에서는 IOCTL대상 디 바이스 드라이버 /dev/xxx만을 대상으로 하여 dumb fuzzing을 시행하였으며, IOCTL cmd“0xC0C0????”에 서 디바이스 및 시스템 크래쉬를 확인하였다. 동적 분석 에서 전달된 ARG의 비정상적인 호출로 인하여 해당 값 이 copy_from_user 함수에서 task 스트럭쳐로 구성되 며, 해당 값으로 인하여 시스템 크래쉬가 발생 한다는 내용을 정적 분석에서 확인된 코드에서 검토 하였다. 검 토된 내용을 바탕으로 오퍼플로우가 발생되는 주소를 확인하기 위하여 특정 패턴으로 구성된 ARG를 구성하 여 호출하였으며, 정확한 오버플로우 발생 주소를 이용 하여, 이후 exploit 코드를 작성하여 PC값이 의도된 “A”의 ASCII로 조작되는지 확인하였다. 확인된 결과는 그림 6과 같다.
그림 6에서 붉은색으로 표시된 내용이 PC 값이며 의 도된 것과 같이 “A”로 변경된 것을 확인할 수 있다. 정리하면, 그림 4와 같이 정적 분석에서 확인되는 내 용이 동적 분석에서 동시에 그림 6과 같이 확인 되었다. 이는 공격자가 실제 동적 분석으로 취약점을 찾고 해당 취약점을 이용하여 시스템 권한을 시도 한다면 즉시 권 한 획득이 가능한 취약점이라는 것이 증명되는 것이다.
strncpy의 경우 입력값 크기만을 고려하면 NULL termination 문자가누락될 수 있어 1byte의 해당 공간 이 반드시 필요하다. 그러나 많은 코드에서 위와 같이 단순히 strncpy로 변경되어 있기 때문에 잠재적 취약점 을 갖고 있다. 해당 코드의 경우 동적 분석에서는 버퍼 오버플로우 취약점이 확인되지 않고, 정적 분석에서만 확인 되었다. 검토 결과 해당 변수는 네트워크 장치의 작동이 시작되고 특정 함수가 요청되었을 때 발생하는 것으로서 본 실험에서 사용되지 않는 상황에서 동적 분 석이 시행되었기 때문에 함수가 호출되지 않았다.