SSL/TLS Pinning은 클라이언트가 서버에 연결할 때 미리 지정된(pinned) SSL/TLS 인증서나 공개키만 신뢰하도록 강제하는 보안 기술입니다. 중간자 공격(Man-in-the-Middle Attack, MitM)을 방어하기 위해 사용됩니다. . 일반적인 TLS 통신은 CA(인증기관)가 발급한 모든 유효한 인증서를 신뢰하지만, SSL Pinning은 특정 서버의 인증서(혹은 공개키)만을 허용함으로써 공격자가 위조된 인증서로 클라이언트를 속이는 것을 방지합니다.
SSL Pinning은 크게 두 가지 방식으로 구현됩니다.
Certificate Pinning: 서버의 인증서(Certificate)를 앱 내부에 직접 저장하고, 연결 시 서버가 보내온 인증서와 일치하는지 확인합니다. 이 방식은 인증서가 갱신될 때마다 앱을 업데이트해야 하는 번거로움이 있습니다.
Public Key Pinning: 서버의 인증서에 포함된 공개키(Public Key)를 추출하여 앱 내부에 저장하고 검증합니다. 이 방식은 인증서 자체는 갱신되어도 공개키는 유지될 수 있어, 인증서 갱신에 따른 앱 업데이트 부담이 Certificate Pinning보다 적습니다.
SSL Pinning은 강력한 보안 기술이지만, 다음과 같은 방법으로 우회될 수 있습니다.
NSURLAuthenticationChallenge, SSLCertificate)를 호출할 때 그 함수의 실행을 가로채서(hooking) 검사 결과를 조작합니다. 즉, 검사 결과가 실패하더라도 성공했다고 속여 우회하는 방식입니다.Ghidra나 IDA Pro 같은 디컴파일러를 사용해 코드를 분석해야 합니다.TrustManager를 잘못 구성하는 경우가 있습니다. 이러한 구현상의 오류를 찾아내 우회할 수 있습니다. 예를 들어, okhttp와 같은 라이브러리의 커스텀 TrustManager를 찾아내고 그 함수를 후킹합니다.SSL Pinning은 강력한 방어책이지만 완벽하지는 않습니다. 전문적인 해커는 Frida와 같은 동적 분석 도구를 사용해 런타임에 손쉽게 우회할 수 있습니다. 따라서 SSL Pinning은 심층 방어(Defense in Depth)의 한 요소로 활용되어야 합니다.
진정한 보안을 위해서는 SSL Pinning 외에 다음을 함께 고려해야 합니다.
Frida와 같은 동적 분석 도구 사용을 어렵게 만듭니다.