5. 루팅 탐지 및 우회
[개 요]
루팅(Rooting)은 안드로이드 기기에서 사용자가 시스템 파일 및 설정에 대한 관리자 권한을 얻는 과정을 의미합니다. 루팅 된 기기는 보안 제한을 우회할 수 있어 많은 앱이 이를 탐지하려고 합니다. 루팅 탐지가 필수적인 금융 앱이나 게임 앱에서는 다음 네 가지 경로를 주로 체크합니다:
/system/bin/su
/system/xbin/su
/system/app/superuser.apk
/data/data/com.noshufou.android.su
[진단 과정]
1) 인시큐어뱅크 앱 로그인 시 "Rooted Device!!"라는 메시지가 화면 하단에 출력됩니다. 이를 통해 해당 앱에서는 루팅 탐지 로직이 존재함을 알 수 있는데 해당 로직을 자세히 확인하기 위해 Jadx를 통해 소스코드를 확인해 보겠습니다.
2) jadx에서 "Rooted Device!!"라는 문자열을 검색, 해당 문자열이 PostLogin.showRootStatus() 내 출력되는 것을 확인하였습니다. 해당 메서드로 이동해 보겠습니다.
3) showRootStatus() 메서드는 기기의 루팅 여부를 확인하여 doesSuperuserApkExist("/system/app/Superuser.apk") 또는 doesSUexist() 중 하나라도 참일 시 "Rooted Device!!"라는 메시지를 출력하고 그렇지 않을 경우 "Device not Rooted!!"라는 메시지를 출력합니다. 먼저 doesSuperuserApkExist() 메서드를 확인해 보겠습니다.
4) doesSuperuserApkExist() 메서드는 /system/app/Superuser.apk 파일이 존재하는지 확인 후 있으며 true, 없으면 false 값을 반환합니다. adb를 통하여 해당 경로 확인 시 Superuser.apk 파일이 존재하지 않음을 확인하였다. 따라서 해당 메서드의 반환값은 무조건 'false'입니다.
5) doesSUexit() 메서드는 /system/xbin/which su 명령어를 실행해 'su' 명령어가 존재하는지 확인하고 있습니다. adb를 통하여 명령어 입력 시 /system/bin/su가 존재하는 것을 확인하였습니다.
6) 즉 우리가 루팅을 우회하기 위해서는 doesSUexit() 의 결과를 false로 만들어야 하는데 해당 방법은 두 가지가 있습니다.
ㄱ) Frida를 사용하여 후킹을 통한 루팅 우회 시도
ㄴ) su파일의 이름을 변경하여 루팅 우회 시도
[Frida를 통한 루팅 우회 실습]
1) 위에서도 확인했지만 결론적으로 doesSuperuserApkExist() 메서드와 doesSUexist() 메서드 모두 false값을 반환하면 루팅 탐지를 우회할 수 있습니다. Frida를 통해 해당 클래스를 후킹 후 반환값을 false로 변환해 보겠습니다.
2) PostLoing.doesSUexist메서드에 implementation을 사용하여 return 값을 강제로 false로 변경한 후 성공 시 'doesSUexist() called'라는 메시지가 출력되게 스크립트를 작성 후 프리다를 통해 해당 스크립트를 로드합니다.
setImmediate(function(){
Java.perform(function () {
var PostLogin = Java.use('com.android.insecurebankv2.PostLogin');
PostLogin.doesSUexist.implementation = function() {
console.log('doesSUexist() called');
return false;
};
});
});
- 명령어: frida -U 3940 [PID] -I rootbypass.js [파일명]
3) 인시큐어뱅크 앱 접속 후 로그인 시 기존과는 달리 'Device not Rooted!!'라는 메시지가 출력되며 프리다 콘솔 확인 시에도 'doesSUexist() called'라는 메시지가 정상적으로 출력됨을 확인하였습니다.
[파일 수정을 통한 루팅 우회 실습]
1) mount를 통해 권한을 획득하고 'su'를 'susu'로 변경합니다.
2) 변경 후 인시큐어뱅크 앱 재 로그인 시 역시 'Device not Rooted!!' 메시지가 출력됩니다.
[대응 방안]
o 루팅 된 디바이스로 앱 구동 시 탐지 팝업과 함께 앱이 종료되거나 기능을 제한하는 로직 구현이 필요합니다.