[android] Secure Coding Guide |
-
Android Secure Coding Guide 라는 간략한 세미나를 듣고 왔다.
새로운 내용은 없지만, 그냥 Remind 하는 차원에서 정리해본다.
최소 권한 : 불필요한 퍼미션 사용하지 말자.
안드로이드 6.0(MOS) 부터 Runtime Permission 이 되면서 문제가 적어지지만, 이전에는 과도한 권한을 사용하는 문제가 있었다.
꼭 필요한 권한만 정의해서 사용하라.
위치정보를 사용할 때는 국내 위치정보법에 따라 필수 5대항목 고지 등의 의무사항이 있으니 확인해야 한다. (기획적인 내용)
소스코드 보안 : 난독화 여부
Proguard 난독화를 사용해라.
기본 Proguard 말고도 난독화를 해주는 보안강화 솔루션 들도 있다. ( 옵션을 잘 확인하고 적용해야 한다. )
불필요한 로그 : 디버그 버전 배포
android:debuggable 속성 및 android:allowBackup 속성을 false 로 지정해야 한다. ( allowBackup 은 기본값이 true 이다 )
allowBackup 을 true 로 두면 주요 설정 파일들이 의도치 않게 백업되어 정보가 유출될 수 있다.
디버깅 로그를 노출되지 않도록 하고, 민감정보는 특히 주의한다.
데이터 변조 : Data 영역에 World Readable, Writable 파일 존재, 앱 설정 파일 변조 가능 여부
MODE_PRIVATE 으로 사용하라.
SDCard 에 정보 저장하는 것은 중요하지 않은 정보들이어야 한다.
인증, 권한, 결제 등의 주요 기능은 폰 내부에 저장된 값만을 신뢰하지 않고 반드시 서버 측에서 세션변수 및 DB에 저장된 값으로 추가 검증 필요
Intent 기반 취약점
Broadcast 를 이용한 권한 상승, 도용 여부
permission 을 protectionLevel=signature 로 설정하고 broadcast 에 해당 권한을 사용한다.
exported="false" 로 정의. intent-filter 가 정의되어 있다면 기본 exported="true" 이다.
Activity 호출을 이용한 권한 상승, 도용 여부
permission 을 protectionLevel=signature 로 정의해서 사용
개발 과정에서 테스트로 사용한 Activity 는 개발 완료 후 삭제하여 불필요한 노출 최소화
다른 App 과의 연동이 필요하지 않는 경우라면 exported 속성을 false 로 둔다.
사용하지 않는 Activity 는 바로 삭제.
:Service 시작을 이용한 권한 상승, 도용 여부
permission 을 protectionLevel=signature 로 정의해서 사용
exported="false" 로 정의. intent-filter 가 정의되어 있다면 기본 exported="true" 이다.
ContentProvider 읽기, 쓰기 권한 허용
permission 을 protectionLevel=signature 로 정의해서 사용
인증 정보
서버 인증서(HTTPS/SSL) 체크 우회 가능성
WebViewClient 클래스 사용시 SSL Error 발생 가능성에 대비해 onReceiveSslError 함수를 cancel() 로 구현
별도 TrustManager 를 구현하게 될 경우 checkServerTrusted 함수에서 인증서 검증 후, CertificateException 또는 IllegalArgumentException 예외를 발생시키는 코드 작성
SSLSocketFactory 를 사용할 경우에도 ALLOW_ALL_HOST_NAME_VERIFIER 를 사용할 경우에는 인증서 검증을 안 한다는 의미이므로 보안 이슈가 있다. hostname 을 이용해서 도메인 이름을 체크해야 한다.
SSL 연결 설정 시 STRICT_HOST_NAME_VERIFIER 를 사용하여 호스트 명을 검증
인증 정보의 평문, 취약한 암호화 사용 전송 여부
인증 정보 및 위치 정보, 중요 정보 전송 시 반드시 SSL 적용 ( 국내에서 위도 경도 정보만으로도 개인정보로 취급 )
SSL 을 사용하더라도 encrypt 하는 것을 추천
복화화 키 노출
안전한 암호화 알고리즘을 사용해야 하며, 클라이언트에서는 가급적 암/복호화 함수와 키를 저장하지 않고 암호화 된 값만을 사용하도록 한다.
안전한 인증 구현
PW 변경, 개인정보 조회, 서비스 변경, 고객정보 변경 시 추가 인증을 한다.
SMS 인증과 개인정보 관련 API 호출시 둘의 상호관계가 타이트하게 되게 하여야 한다. SMS 인증은 제대로 하고 API 호출시에 전화번호를 바꾸는 케이스들이 흔하다.
SMS 인증 코드의 시도 횟수 등에 대한 제약도 있어야 한다.
중요 정보 노출
DB 및 설정 파일에 중요 정보 노출
모바일 앱 설치 시 생성되는 디렉터리 안에 개인정보, 기밀정보, 서비스 계정 등 저장되지 않도록 구현 필요
중요 정보를 저장해야 하는 케이스라면 암호화 해서 저장해야 한다.
메모리에 중요 정보 노출
중요 데이터는 평문으로 사용하지 않도록 암호화하여 사용
개인정보 및 패스워드 등 사용한 변수의 경우 사용 후 null 로 초기화하여 메모리에 남지 않도록 구현 필요
( 메모리 덤프 등으로 값을 빼낼 수도 있음 )
화면에 중요 정보 masking 처리 여부
개인정보 노출을 최소화하고 필요한 경우에는 아스트리크(*) 등으로 식별되지 않도록 해야 한다.
서버에서 중요 정보를 내려 줄 때 masking 처리를 해서 내려주는 것도 검토해야 한다.
NDK 보안 문제점
버퍼 오버플로우, 포맷스트링, 레이스 컨디션 취약점 존재 유무
취약한 함수에 대해 인지하고 모바일 앱 개발 시 사용 배제
사용이 필요한 경우는 최소한으로 구현 필요
addJavascriptInterface 함수 사용 시 api 17 미만 Runtime 클래스를 호출 해서 시스템 명령 삽입 가능했다.
checkCallingOrSelfPermission checkCallingOrSelfUriPermission 등을 사용하여 권한이 없는 녀석들이 후회해서 가져갈 수 있다.
웹 취약점
파라미터 변조 (정보 유출, 수집)
단순한 MDN, IMEI, IMSI 값으로 인증은 피해야 하며, 서버 세션 변수와의 추가 검증 필요
파라미터를 암호화하여 중요한 파라미터에 대해 조작이 어렵도록 조치
Timestamp/nonce 등을 추가하여 패킷의 재사용 방지 필요
파라미터 변조 ( 결제 금액 조작 )
API 호출이 여러 번 나뉘어 있는 경우 잘 나타나는데, 각각에 대해 검증을 잘 해야 한다.
파라미터 변조 ( Replay-Attack )
timestamp 와 nonce 값을 함께 사용해서 악의적 중복호출에 대한 방지를 해야 한다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[도서 정리] 안드로이드 앱 성능 최적화 #2 안드로이드 디바이스 랩 만들기 (0) | 2018.06.23 |
---|---|
[도서 정리] 안드로이드 앱 성능 최적화 #1 안드로이드 성능 입문 (0) | 2018.06.22 |
[android] Collection of Open Source Library (aos) (0) | 2018.05.15 |
[android] 화면 고정 기능 (0) | 2018.05.05 |
[android] Smart Lock 이란 ( Trust Agents ) (0) | 2018.05.04 |
댓글