SSL Pinning
비플페이에서 유지보수 하고 있는 ‘힛플러스 (현대자 임직원 전용앱)’ 취약점 점검 결과에서
SSL Pinning 이 적용되지 않아 네트워크 패킷 확인이 가능하다는 진단을 받았다.
일단 SSL Pinning이 뭔지 알아보자
1️⃣ SSL Pinning 이란?
SSL Pinning은 앱이 서버와 통신할 때, 사전에 앱 내부에 저장(pinning)해 둔 서버의 인증서(Certificate)와 공개키(Public Key) 정보와 실제로 서버로부터 받은 인증서 정보를 비교하여 신뢰성을 확인하는 메커니즘 이다.
2️⃣ SSL Pinning이 필요한 이유
일반적인 HTTP(SSL/TLS) 통신은 인증 기관(CA)의 서명을 받은 인증서를 신뢰한다. 하지만 다음과 같은 공격에 취약할 수 있다.
- 중간자 공격(Man-in-the-Middle, MITM)
- 공격자가 사용자의 기기에 악성 CA 인증서를 심거나, 공용 와이파이 등을 이용해 트래픽을 가로채고, 위조된 인증서를 제시하여 사용자와 서버 간의 통신을 도청하거나 변조할 수 있다.
- 인증 기관(CA) 손상
- 만약 CA 자체가 해킹 당해 신뢰할 수 없는 인증서를 발급하게 된다면, 일반적인 HTTPS 검증만으로는 이를 막을 수 없다.
SSL Pinning은 마치 ‘이 사람이 우리가 아는 서버의 얼굴이야!’ 라고 앱에 사진을 심어주는 것과 같다.
앱은 CA의 서명 여부 뿐만 아니라, 미리 저장된 정보와 일치하는지를 추가적으로 확인하여 위협을 방지한다.
3️⃣ SSL Pinning의 주요 방식
주로 두 가지 방식이 사용되는데
- 인증서 Pinning (Certificate Pinning)
- 서버의 전체 SSL/TLS 인증서 파일(.cer, .der 등)을 앱 번들 내부에 저장한다.
- 통신 시 서버에서 받은 인증서와 앱에 내장된 인증서가 완전히 일치하는지 비교한다.
- 단점
- 인증서가 만료되거나 갱신(보통 1년 주기)될 때마다, 새로운 인증서로 앱을 업데이트(배포)해야 하는 단점이 있다.
- 공개 키 Pinning (Public Key Pinning, 권장)
- 서버 인증서에서 공개 키(Public Key) 부분만 추출하여 해시 값 형태로 앱 코드에 저장한다.
- 통신 시 서버에서 받은 인증서의 공개 키를 추출하여 앱에 저장된 해시 값과 비교한다.
- 장점
- 인증서가 갱신되더라도 공개키 쌍이 변경되지 않으면(키 순환 정책에 따라) 앱 업데이트 없이 Pinning을 유지할 수 있어 더 유연하다.