안드로이드 리눅스 커널 상에 구축 리눅스의 보안 기능 이용
설치된 앱마다 UID GID를 부여(리눅스 상의 기능) 데이터 각각 사용
$adb shell 
$cd /data/data/
$ls -al | grep com.advanced (uid,gid 확인)

UID, GID가 같으면 저장소 공유 가능 sharedUserId 서명이 같아야 함
매니페스트 android:sharedUserId="com.advanced_android.uid"도 같아야 함
sharedUserId 릴리즈 된 앱에서 추가되면 업데이트 불가 삭제후 재설치
그럴 경우는 contentprovider를 사용

adb shell ps 프로세스 확인 앱이 독립되어 있는지 보기 위해

퍼미션
ContextCompat.checkSelfPermission() 퍼미션 허용여부 검사
ActivityCompat.requestPermissions() 퍼미션 요청
ActivityCompat.shouldShowRequestPermissionRationale() 트루면 설명이 필요

앱 내에 퍼미션 사용 (같은 서명 사용 필요)
앱 A의 액티비티를 퍼미션으로 보호


...
앱 B에서 앱 A를 사용하기 위해 퍼미션을 사용

퍼미션 스틸링 대응
$keytool -list -v -keystore ~/.android/debug.keystore -storepass android 해시값
1. 출력된 Hash(sha1)에서 콜론(:)을 제거한 값을 검사

2. getCallingActivity().getPackageName() 호출원의 패키지명 확인 해시 검출
public static String hash(Context ctx, String pkgName){
if(pkgname==null)return null;
try{
PackageManager pm = ctx.getPackageManager();
PackageInfo pkginfo = pm.getPackageInfo(pkgname, PackageManager.GET_SIGNATURES);
if(pkginfo.signatures.length != 1) return null;
Signature sig = pkginfo.signatures[0];
byte[] cert = sig.toByteArray();
byte[] sha1 = computeSha1(cert);
return byte2hex(sha1);
}catch (NameNotFoundException e){} 
return null;}
1과 2의 해시값이 같을때만 허용

AES 암호화
public static byte[] cipherEncrypt(byte[] buf, String key, String iv){
try{ SecretKeySpec sksSpec = new SecretKeySpec(key.getBytes(), "AES");비밀키
IvParameterSpec ivSpec = new IvParameterSpec(iv.getBytes());초기화 벡터
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, sksSpec, ivSpec);
return cipher.doFinal(buf);
} catch(Exception e){} finally{} 
return null;
}
sharedPreference 난독화 키를 난독화하고 상수로 사용
네트워크에서 native라이브러리 로드X 앱내에서만O 자바 동적코드로딩X

자바스크립트 인터페이스 사용은 개발사, 협력사 도메인만
@JavascriptInterface 어노테이션을 붙여야 함(17이상 호출가능 4.2 없으면 에러)

https SSLHandshakeException 인증서 검증 오류 우회하지 말고 제대로 처리할 것

webview file:// 스킴 취약성 http 와 https만 허용하도록

시스템 취약성 해소는 SecureRandom
SecureRandom의 취약성은 아래 사이트에서 대처
https://android-developers.googleblog.com/2013/08/some-securerandom-thoughts.html

보안 팁 페이지 https://developer.android.com/training/articles/security-tips


블로그 이미지

dev김

안드로이드 개발자로 만 4년이 좀 안되게 근무했었고 그 이상의 공백을 가지고 있다. 다시 현업에 복귀하기 위한 노력의 흔적을 담으려고 한다.

,