-->

[인시큐어뱅크] 앱 위변조, 리패키징 (Repackaging) 취약점

앱 위변조, 리패치징 (Repackaging) 취약점

인시큐어뱅크(InsecureBanckv2) 깃허브에 기재되어 있는 취약점 리스트의 취약점 명명은 '어플리케이션 패칭 (Application Patching)'인데 우리나라에서는 앱 위변조나 리패치징이라는 말을 더 많이 쓰는 것 같아서 이걸 사용했다.

 

리패키징 취약점이 되려면 앱 위변조 뿐 아니라 설치 시 서명검증에 사용되는 서명키가 노출되어있거나 하는 방식으로 서명키를 알고있어야 한다. 그래야 재배포가 가능하기 때문인데 (플레이스토어에서 서명검증을 하기 때문) 인시큐어뱅크에서는 서명키 노출 취약점이 따로 있지는 않다. 따라서 안드로이드 스튜디오에서 생성한 서명키 파일(jks)로 변조한 앱에 직접 서명해주는 방식을 사용하도록 하겠다.

 

안드로이드 스튜디오에서 인시큐어뱅크 apk에 서명을 하고 서명키 파일을 얻는 방법은 아래 포스팅을 참고하길 바란다. (키스토어 파일, jks, 서명키 파일, 인증서 등 용어의 차이가 아직 명확하지 않아 여러 용어를 혼용해서 쓰고있는데 정확한 용어를 파악한 후 나중에 틀린 부분은 수정하려 한다)

 


[안드로이드 스튜디오] 키스토어 생성 / 앱에 서명 / 서명된 apk 획득

 

[안드로이드 스튜디오] 키스토어 생성 / 앱에 서명 / 서명된 apk 획득

앱을 배포하기 위해선 (플레이스토어에 등록하기 위해선) apk 에 꼭 서명을 해야한다. 키스토어를 생성, 앱에 서명을 해 서명된 apk와 jks 파일을 획득하는 과정과 keytool을 사용해 서명된 앱과 키스토어 파일에..

liveyourit.tistory.com

 

 

인시큐어뱅크 리패키징

apk 리패키징을 위해선 apktool과 jarsigner 툴이 필요하다.

 

 

apk 디컴파일

먼저 apktool을 사용해 원본 인시큐어뱅크 apk 파일을 디컴파일 해준다.

 

 

 

그러면 apktool 이 위치한 곳에 디컴파일된 인시큐어뱅크 폴더가 생성된다. 해당 폴더를 살펴보면, 아래와 같이 3개의 폴더와 2개의 파일로 이루어져 있다. 이 중 리소스 폴더인 것으로 추측되는 res 폴더를 살펴본다.

 

 

 

.png로 검색하다 보니, res 폴더 안의 아래 5개의 폴더에 아이콘 및 메인화면의 이미지가 들어있는 것을 확인했다. 

 

 

 

그래서 뭐 하나는 바뀌겠거니 싶어... 위 폴더에 들어있는 이미지 전부를 내 블로그 메인페이지의 이미지로 변경해주었다. 

 

 

apk 리컴파일

apktool을 사용해 변조된 리소스 파일이 포함된 채로 다시 컴파일해준다. 

 

 


> java -jar apktool.jar b InsecureBankv2

 

 

 

컴파일해준 apk 파일은 디컴파일 시 생성된 폴더 내부의 dist 폴더에 생성된다.

 

 

 

apk 파일에 서명하기

앱을 위변조한 후 무작정 다시 설치하려고 하면 아래와 같이 INSTALL_PARSE_FAILED_NO_CERTIFICATES 에러가 뜨게된다. 앱에 서명이 되어있지 않기 때문이다.

 

 

 

%JAVA_HOME%bin의 jarsigner을 사용해 아래와 같이 변조한 apk 파일에 서명을 해준다. 서명을 하기 위해선 키스토어 파일인 jks 파일이 필요하며 키스토어 파일 생성 시 썼던 인증서 이름?별칭?을 알고있어야 한다. 서명 방법은 링크를 참조했다.

 


> jarsigner.exe -verbose -sigalg MD5withRSA -digestalg SHA1

-keystore [jks] [apk] [인증서별칭]

 

 

 

서명을 성공적으로 마치고 녹스 에뮬레이터에 위변조한 앱을 설치하려는데 아래와 같은 INSTALL_FAILED_UPDATE_INCOMPATIBLE 에러가 발생했다. 해당 에러는 같은 서명값을 가진 apk 파일이 충돌하기 때문에 발생하는 것으로 그냥 원래 설치되어있는 인시큐어뱅크 앱을 삭제해주면 된다.

 

 

 

adb uninstall [패키지명] 으로 삭제해준다.

 


> adb unistall com.android.insecurebankv2

 

 

 

apk 재설치 및 위변조 확인

apk 파일을 녹스 에뮬레이터에 다시 설치해준다.

 


> adb install InsecureBankv2\dist\InsecureBankv2.apk

 

 

 

그럼 아래와 같이 변조된 아이콘 이미지를 확인할 수 있다.

 

 

 

+) 다른 위변조

추가적으로 다른 분의 방식을 참고해 메인페이지에 admin일 경우 발생하는 버튼을 생성해보는 것도 해보기로 했다. res\values 폴더를 보면 strings.xml이 있는데 사용되는 문자열이 들어있다.

 

 

 

값들을 살펴보면, is_admin 이 있는데 값이 no 이다.

 

 

 

dex2jar로 디컴파일한 jar 파일을 JD-GUI로 봐보자. R.class 를 보면 is_admin 값이 아래 숫자와 같음을 알 수 있다. (자바는 정말이지... 모르겠땋ㅎㅎ)

 

 

 

그리고 JD-GUI도 전체 검색이 안되어 슬슬 불편해지기 시작했다. jar 뷰어를 조만간 바꿔야겠다. 어쨌든 로그인 클래스쪽 코드를 살펴보면 해당 문자열 값이 no인지를 확인하고 있고 그 경우 setVisbility(8)을 수행하고 있는데 setVisbility에서 값이 8인 경우 GONE으로 표시를 하지 않는 것이라고 한다.

 

 

 

findViewById 내부의 숫자코드를 R.class에서 검색해보면 button_CreateUser 이다.

 

 

 

is_admin 값을 yes로 변경해주었다.

 

 

 

그리고 위에서 했던 것처럼 컴파일->사인->설치를 해주면 아래와 같이 로그인 버튼 위에 Create User 버튼이 활성화된 것을 볼 수 있다.

 

 

 

 

앱 위변조, 리패키징 취약점 진단결과 및 대응방안

 

(KISA, 모바일 대민서비스 보안취약점 점검 가이드 참고)

  • 안드로이드 앱은 이식성이 높은 자바언어로 개발되어 난독화가 적용되어있지 않은 경우 역공학 및 디컴파일이 매우 쉬움
  • 인시큐어뱅크(InsecureBankv2) 앱의 경우 난독화가 적용되어있지 않았고 디컴파일 툴로 클래스명, 리소스파일 등 식별이 가능했으므로 난독화에 취약한 것으로 판단됨
  • KISA가 제공한 앱 위변조 취약점 진단 기중의 경우 '앱 위변조 후 리패키칭을 통해 앱 재배포가 가능하면 취약한 것으로 판단'하는데 (인시큐어뱅크의 경우 직접 서명키를 생성한다는 가정사항이 있긴했지만) 리패키징 후 앱의 실행이 가능했으므로 앱 위변조에 취약한 것으로 판단됨
  • 따라서 디컴파일 후 앱 위변조하는 것을 방지하기 위해 난독화 도구 (예: Proguard)를 사용해 앱을 패키징하여 배포하는 방안이 필요함

댓글

Designed by JB FACTORY