모바일 취약점 점검/Android

[Android] 무결성(앱 위변조) 검증 코드

서쪽곰 2023. 5. 15. 16:24

목 차

     

    해시 비교 무결성 검증

    Android 해시 비교 무결성 확인은 Android 앱의 암호화 해시를 알려지고 신뢰할 수 있는 해시 값과 비교하여 앱의 무결성과 신뢰성을 보장하는 보안 메커니즘입니다. 이 메커니즘은 앱 개발자가 서명하고 게시한 이후 앱이 어떤 식으로든 변조되거나 수정되지 않았는지 확인합니다.

    Android 앱이 서명되면 앱의 APK 파일 콘텐츠를 기반으로 고유한 암호화 해시 값이 생성됩니다. 그런 다음 이 해시 값은 앱 개발자의 개인 키를 사용하여 암호화되어 앱의 진위와 무결성을 확인하는 디지털 서명을 생성합니다.

    해시 비교를 사용하여 앱의 무결성을 확인하기 위해 Android 시스템은 설치된 앱에 대한 해시 값을 생성하고 앱 개발자가 제공한 신뢰할 수 있는 해시 값과 비교합니다. 해시 값이 일치하면 앱을 신뢰할 수 있는 것으로 간주하고 기기에 설치 및 실행할 수 있습니다. 해시 값이 일치하지 않으면 앱을 신뢰할 수 없는 것으로 간주하여 설치 또는 실행이 차단될 수 있습니다.

    해시 비교는 개인 정보를 손상시키거나 데이터를 도용하거나 기기를 손상시킬 수 있는 잠재적으로 유해한 앱으로부터 사용자를 보호하는 데 도움이 되므로 Android 기기의 중요한 보안 기능입니다. 사용자는 신뢰할 수 있는 출처의 앱만 설치하고 해시 비교 또는 기타 보안 메커니즘을 사용하여 기기에 다운로드 및 설치한 앱의 ​​무결성을 확인하는 것이 좋습니다.

     

    솔루션을 통한 무결성 검증

    솔루션 무결성 검증

     

    솔루션의 경우 Random값을 통한 해시값 변조 방지 및 2차 인증을 위한 토큰 전송 등으로 무결성 검증의 프로세스 우회를 방지하고 있습니다.

     

    일반적인 무결성 검증

    모바일 전자정부서비스 앱 소스코드 검증 가이드라인 - 앱 위변조 탐지 프로세스

     

    일반적으로는 앱 바이너리의 해시값을 생성 후 서버에서 원본 해시값과 비교하는 간단한 로직으로 구현됩니다.

    아래의 코드는 일반적인 무결성 검증 코드로 해시값을 생성하는 코드 입니다.

    서명의 해시값 비교하는 무결성 검증 코드

        // PackageInfo 애플리케이션 속성을 통해 서명의 해시 값 비교
        public static String getAppHash(Context context) throws Exception {
            // 패키지 이름 (com.example.integrity)
            String packageName = context.getPackageName();
            // apk 파일 경로 획득 (/data/app/~~)
            String apkPath = context.getApplicationInfo().sourceDir;
            // 패키지 정보 획득
            PackageInfo packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
            // 서명 정보 획득
            Signature signature = packageInfo.signatures[0];
            // 서명의 SHA-256 해시값
            byte[] cert = signature.toByteArray();
            MessageDigest md = MessageDigest.getInstance("SHA-256");
            byte[] publicKey = md.digest(cert);
            // Base64 인코딩
            String hash = Base64.encodeToString(publicKey, Base64.NO_WRAP);
    
            return hash;
        }

    안드로이드 서명의 해시 값을 통해 무결성 검증을 수행합니다.

    일반적으로 안드로이드 코드 패치의 경우 디컴파일 > smali 코드수정 > 컴파일 > 서명 순서로 진행되며 임의 서명된 해시값과 원본 해시값을 비교하여 검증하는 소스코드

    바이너리의 체크섬 값을 비교하는 무결성 검증 코드

        // Zipfile 애플리케이션 속성을 통해 classes.dex의 CRC 체크섬 값 비교
        public static long getAppCRC(Context context) throws Exception {
            ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0);
            ZipFile zf = new ZipFile(ai.sourceDir);
            ZipEntry zen = zf.getEntry("classes.dex");
            long crc = zen.getCrc();
    
            return crc;
        }

    안드로이드의 zipfile api를 통해 classes.dex 값을 찾아 체크섬값을 추출하여 원본 체크섬값과 비교하는 소스코드

     

    2023.05.15 - [보안/모바일 취약점 점검] - [Android, iOS] OS변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일

     

    [Android, iOS] OS변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일

    1. 프로젝트 실행결과 Android_Integrity.zip - Android 프로젝트 파일 iOS_Integrity.zip - iOS 프로젝트 파일 Integrity.apk - Android 프로젝트 빌드 파일 Integrity.ipa - iOS 프로젝트 빌드 파일 1) Android Android 프로젝트

    seo-security.tistory.com

     

    반응형