취약점 개요
리눅스 커널 2.6을 기반으로 제작된 안드로이드는 리눅스에서 발생하는 취약점들을 내포하고 있습니다. 루트 노출 및 우회 취약점은 안드로이드 디바이스 시스템 권한을 얻는 것을 말합니다.
안드로이드의 경우 보안상의 이유로 루트 권한을 막아놓았습니다. 그리고 금융권 애플리케이션에서는 이렇게 루팅된 기기에서의 앱 실행을 차단하는 경우가 대다수입니다. 이번 글에서는 애플리케이션에서 어떤 방식으로 루팅을 탐지하는지 알아보고, 우회방법까지 공부해보겠습니다.
취약점 분석
루팅 체크가 필수적인 금융 앱이나 게임 앱에서는 다음과 같은 네 가지 경로를 주로 체크합니다.
- /system/bin/su
- /system/xbin/su/
- /system/app/superuser.apk
- /data/data/com.noshufou.android.su
인시큐어뱅크 앱을 통해 분석해보겠습니다.
로그인을 하면 다음과 같이 Rooted Device!! 라고 루팅된 기기를 탐지하는 안내문이 나옵니다.
먼저 디컴파일을 통해 루팅기기를 탐지하는 로직을 분석해보겠습니다.
아래 코드는 디컴파일한 PostLogin.class 소스코드에서 루팅을 탐지하는 부분만 골라 뽑은 것입니다.
코드에서 3개의 탐지 함수가 존재합니다. doesSUexist()는 su 프로세스가 존재하는지 검사하고 있고, doesSuperuserApkExist() 와 showRootStatus()는 superuser.apk 파일이 존재하는지 확인하고 있습니다.
superuser.apk 파일에 대한 검사는 파일 이름으로 이루어지고 있으므로, 파일 이름을 수정해야 우회가 가능합니다. 그러나 /system 디렉터리에 존재하는 파일을 수정하려면 only-read 상태로 마운트 되기 때문에 다시 마운트 해줘야 합니다.
adb shell로 쉘 접근 후 명령어로 다시 마운트 시키겠습니다.
< adb shell >
< su >
< mount -o remount,rw /system >
그다음 superuser.apk 가 존재하는 디렉터리로 이동 -> 이름을 바꿔주겠습니다.
< cd /system/app >
< ls Superuser.apk >
< mv Superuser.apk Superuser.apk1 >
그 다음 su 프로세스의 이름도 똑같이 변경하여 탐지를 우회하겠습니다.
< cd /system/xbin >
< ls -l su >
< mv su sx >
이제 다시 인시큐어뱅크 앱을 켜보면,
루팅은 그대로 루지되지만, 루팅 탐지는 우회가 가능합니다. Device not Rooted문구 출력.
취약점 대응 방안
우선적으로 루팅을 방지하는 소스 코드 로직이 노출되지 않도록 해야합니다. 이때 공격자들은 apk 파일을 디컴파일하여 소스 코드를 열람하는데, 문자열 난독화까지 적용시켜 어떤 명령어와 루팅 관련 파일을 검사하는지 모르게 해야 합니다.
apk 파일을 조작하여 루팅을 지속적으로 유지하는 것을 방지하기 위해서는 무결성 검증이 필요하며, 디컴파일의 위험도 존재하기 때문에 디컴파일 방지 솔루션을 세워야 합니다.
'Android' 카테고리의 다른 글
앱 취약점 - < 안전하지 않은 HTTP 통신 > 분석 (0) | 2021.08.19 |
---|---|
안드로이드 취약점 - < 메모리 내 민감한 정보 저장 > 분석 (0) | 2021.08.17 |
앱 취약점 - 로컬 암호화 이슈 분석 (0) | 2021.08.14 |
앱 취약점 - 취약한 인증 메커니즘 분석 및 대응 방안 (0) | 2021.08.13 |
앱 취약점 - 브로드캐스트 리시버(Broadcast Receiver) 결함 분석 (0) | 2021.08.12 |