본문 바로가기

40./41. Android

Securing mobile banking on Android with SSL certificate pinning

애플리케이션과 서버간에 민감한 정보를 안전하게 전송하고 싶을 때, SSL 방식을 채택하여 사용할 것이다. 하지만 SSL 채택은 반만 맞는 이야기다.

애플리케이션과 서버간에 민감한 데이터를 전송하는 일은 빈번하다. 가장 대표적인 예로는 모바일 은행 애플리케이션이 있다. 가장 최악의 사황으로는 악의적인 해커가 당신의 은행 계좌 정보나 돈을 훔치거나 더 나쁜 행위를 저지를 수 있다.

모바일 뱅킹 솔루션에서 보안은 중요하기 때문에 데이터의 안전과 비밀성을 유지하기 위해서 SSL을 사용하는 것이다. 하지만 이러한 방법은 깨질 수 있다.

Certificate pinning이란?


SSL 연결을 만들 때 기본적으로 클라이언트는 서버의 인증서를 확인하게 된다.
- 신뢰할수 있는 상위(root) 인증서를 검증 가능한 체인이 존재하는지 여부
- 요청한 호스트 명의 신뢰 여부

서버가 이미 알고있는 특정 인증서의 경우에 대해서 확인하지 않는 경우가 발생한다.

장지(모바일 디바이스) 안에 신뢰하는 저장서와 원격서버 사이의 의존도로 인해 보안문제가 발생한다. 사용자가 임의로 모바일 디바이스에 신뢰하는 저장소에 인증서를 설치 가능하므로, Man-in-the middle attacks(중간자 공격)이 가능하다.

Certificate pinning은 이러한 문제를 해결해준다. 서버에서 사용할 인증서를 모바일 안에 하드코딩하게된다. 앱은 디바이스 내 신뢰하는 저장소에 의존하는 대신에 앱 내부에 있는 인증서를 사용하여 서버와 SSL을 연결하게 된다.

또한 디바이스에 부가적인 인증서 설치가 필요 없으며 자체 서명된 인증서로 호스트 신뢰 기능을 제공한다.

장점 :
- 보안 강화 : Pinned SSL 인정서를 사용하면 앱은 디바이스 내 신뢰하는 인증서 저장소와 독립하여 사용할 수 있다. 앱 내부에 하드 코딩 된 신뢰하는 인증서 저장소를 건드는건 쉽지 않다. 앱을 디컴파일하여 변경 후 재 컴파일  해야한다. 앱에서 서명했던 기존 개발자와 같은 Android Keystore을 사용하여 서명은 불가능하다.

- 비용 절감 : SSL 인증서 피닝은 자체 서명된 인증서를 사용할 수 있도록 제공해준다. 예를들어 앱 개발 시 자체 API 서버를 사용한다면 인증서에 대한 지불 대신에 자체 서명된 인증서를 서버에 사용가능하다. 비록 그 비용이 아주 적어도 이러한 방법으로 보안 강화와 비용 절감할 수 있다.

결점 :
- 융통성 부족 : SSL 인증서 피닝을 사용하고 있다면 쉽게 SSL 인증서 변경이 불가능하다. 모든 SSL인증서를 변경하기 위해서는 앱을 업데이트하고 Google Play에 다시 올려야한다. 또한 사용자들도 재설치 해야한다.

Android 내부에서 동작 방식

Android 내 Pinning SSL 인증서를 넣는 일은 쉽지 않다. Android 2.2 이상 버전에서 작업해야하며, 적용 전에 많은 정보를 찾아야한다.

프로세스 내 3가지 중요한 단계 :
- 원하는 서버에 대한 인증서 획득(전체 인증서 체인)
- .bks 형태로 인증서를 제작 - 모든 디바이스에서 호환하기 위해서는 매우 중요한 작업
- Android에서 제공한 Apache HTTP Client 사용 - SSL 연결을 위해서 제공한 .bks keystore를 초기화하는데 사용

완벽하게 동작하는 예 : https://github.com/ikust/hello-pinnedcerts

SSL 피닝은 모든 앱에서 동작해야하는건 아니지만, 위험도가 높은 앱에서 보안 레벨을 올리는데 의미가 있다.

참고 자료 : https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning