인프런 - 강의/루팅탐지, 탐지우회, 방어방법

7 - 무결성 검사

개복치 개발자 2019. 12. 10. 01:31

무결성 검사에 대해 알아보겠습니다.

 

무결성이라는 것의 정의부터 알아보면

 

데이터 무결성(영어: data integrity)은 컴퓨팅 분야에서 완전한 수명 주기를 거치며 데이터의 정확성과 일관성을 유지하고 보증하는 것을 가리키며[1] 데이터베이스 RDBMS 시스템의 중요한 기능이다.

[출처 - https://ko.wikipedia.org/wiki/%EB%8D%B0%EC%9D%B4%ED%84%B0_%EB%AC%B4%EA%B2%B0%EC%84%B1]

 

라고 합니다. 

 

일관성을 유지한다고 하는데, 이 것을 앱에 적용해보면 APK파일이 변조되지 않고, 개발자가 개발한 그대로인가를 알아보면 되는 것 입니다.

 

위/변조된 앱이 동작하는 것을 막기위해 무결성 검사 로직이 추가됩니다.

 

1. 구글에서 다운받아 온 키가 맞는지 확인하기

 

매우 간단한 방법입니다. 얘가 구글 플레이스토어에서 다운받아 온 것이 맞나 확인해보면 됩니다.

 

구글 플레이스토어에서 다운받아온 애가 맞다면 "com.android.vending" 으로 패키지가 시작합니다.

 

구글에서 다운받아온게 아니라면 리패키징되었나 의심해볼 수 있겠죠?

 

private void getInstaller() {
        // 플레이 스토어에서 설치했을 경우, "com.android.vending" 으로 시작합니다.
        String installer = this.getPackageManager().getInstallerPackageName(this.getPackageName());
        TextView insInfoTxt = (TextView) findViewById(R.id.installer_text_view);
        insInfoTxt.setText("installer: "+installer );
        // installer.startsWith("com.android.vending"); 로 검사할 수 있습니다.
    }

 

다른 마켓에서 다운받아 온 것들을 보면 아래과 같습니다.

 

1) Google Play Store(구글 플레이스토어)

com.android.vending

 

 

2) ONE STORE(원스토어)

com.skt.skaf.A000Z00040

 

 

3) Galaxy Apps(갤럭시 앱스)

com.sec.android.app.samsungapps

 

 

4) Samsung Smart Switch

com.sec.android.easyMover.Agent

 

 

5) Android Package Installer

com.google.android.packageinstaller

 

 

6) Samsung Mate Agent

com.samsung.android.mateagent

 

 

2. 사이닝 키 알아보기

 

자, 얘가 배포한 인증서와 같은지 알아보는 방법이 있습니다.

 

저희는 배포용 apk파일을 만들 때, 이렇게 인정서로 사인된 APK를 만들라고 나오는 것을 보았습니다.

 

 

이 사인된 인증서를 이용하는 것인데, 얘가 배포될 때의 인증서와 같은지 비교해보면 됩니다.

 

private void getSignature()  {

        @SuppressLint("PackageManagerGetSignatures")
        PackageInfo packageInfo = null;
        TextView pkgInfoTxt = (TextView) findViewById(R.id.pkg_text_view);
        try {
            packageInfo = this.getPackageManager().getPackageInfo(this.getPackageName(), PackageManager.GET_SIGNATURES);
            String sigString = "";

            //안드로이드는 여러 키스토어로 Signing 가능, 일반적으로는 하나의 키스토어로만 Signing함.
            for (Signature sig : packageInfo.signatures) {
                MessageDigest md = MessageDigest.getInstance("SHA-512");
                md.update(sig.toByteArray());
                String currentSignature = Base64.encodeToString(md.digest(), Base64.DEFAULT);
                sigString += "["+currentSignature+"], ";
            }
            pkgInfoTxt.setText("sigs: "+sigString);

        } catch (PackageManager.NameNotFoundException | NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
    }

위의 코드를 통해서 singature 를 뽑아와서 비교하면 됩니다.

 

 

 

 

- 참조

 

https://j-a-l.tistory.com/98

http://dktfrmaster.blogspot.com/2017/02/apk.html

https://blog.soobinpark.com/152

https://dev.re.kr/70