목 차
해시 비교 무결성 검증
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' 카테고리의 다른 글
[Android] 안드로이드 12 이상 루팅 및 초기화 (갤럭시 S10) (0) | 2024.05.08 |
---|---|
[Android] 안드로이드 루팅 & 순정 펌웨어 복구 (0) | 2023.05.31 |
[Android, iOS] OS변조(루팅/탈옥), 무결성 검증, 디버깅 탐지 프로젝트 파일 (0) | 2023.05.15 |
[Android] 안티 디버깅(Anti-Debugging) 코드 (2) | 2023.05.15 |
[Android] OS변조(루팅) 탐지 코드 (0) | 2023.05.15 |