SSL Pinning

SSL/TLS

Secure Socket Layer과 Transport Layer Security는 인터넷 통신의 기밀성과 무결성을 보장하기 위한 프로토콜입니다. 원래는 넷스케이프가 개발한 SSL 프로토콜이 시초였으나, 이후 IETF로 이관되어 TLS라는 명칭으로 변경되었습니다.

TLS 프로토콜은 클라이언트와 서버가 통신을 시작할 때 거치는 TCP 핸드셰이크 과정을 수행하여 세션 키를 생성하고 이를 통해 안전한 통신 채널을 수립합니다. 다음은 TLS 핸드셰이크 과정입니다.

TLS HandShake
  1. Client Hello : 클라이언트가 서버로 메시지의 시작을 알리며 세션 수립 의사를 알립니다. 이 과정에서 클라이언트는 자신이 지원하는 TLS 버전과 사용할 수 있는 암호 스위트, 임의의 난수 등을 함께 전송합니다.

  2. Server Hello : 서버는 클라이언트의 요청에 대해 응답합니다.

  3. Server Hello Certificates : 서버는 클라이언트가 전송한 TLS 버전 중 하나와 암호 스위트를 선택하여 응답합니다. 이 과정에는 선택된 TLS 버전 및 암호 스위트, 서버 측 난수, 필요한 경우 추가 확장, 서버의 X.509 인증서 등이 담깁니다. 만약 암호화 방식이 Diffie–Hellman일 경우 키 교환에 필요한 정보가 추가됩니다.

  4. Server Hello Done : 서버는 자신의 메시지가 끝났음을 알리는 ServerHelloDone을 전송합니다.

  5. Client Key Exchange Message : 클라이언트는 서버의 인증서에 포함된 공개키로 서버를 신원 확인하고(인증서의 유효성 검증 및 신뢰 체인 검증 수행), Pre-Master Secret를 교환합니다. RSA 방식의 경우 Pre-Master Secret을 서버 공개키로 암호화하여 보내며 DH 및 ECDHE 방식의 경우 서버와 공통의 비밀을 생성합니다.

  6. 양측이 공유한 Pre-Master Secret으로부터 협상한 해시/PRF 함수를 이용해 대칭 세션 키를 산출합니다. 클라이언트는 ChangeCipherSpec 메시지를 보내 앞으로 주고받을 데이터를 협상된 알고리즘으로 암호화 하겠다는 것을 알리고, 이어서 Finished를 보냅니다.

SSL Pinning

SSL 피닝은 클라이언트 애플리케이션이 특정 서버와 통신할 때, 서버의 인증서나 공개키를 고정하여 신뢰하는 보안 기법입니다. 일반적으로 위와 같은 TLS 인증 과정에서 클라이언트는 Server Hello Certificates 과정에서 서버가 전송한 X.509 인증서의 서명을 신뢰할 수 있는 CA가 서명했는지만을 검사합니다.

하지만 공격자가 서버의 인증서에 서명하는 신뢰받는 인증 기관의 비밀키를 탈취하거나, 클라이언트가 공격자의 인증서를 직접 설치한 경우 TLS 인증 과정에서 중간자 공격이 가능합니다. 이렇게 될 경우 클라이언트는 서버와 TLS 보안 채널 아래 통신을 하더라도 공격자는 암호화된 내용을 복호화할 수 있습니다.

이러한 경우를 방지하기 위해 SSL 피닝은 애플리케이션 등의 프로그램에 신뢰할 수 있는 인증서 혹은 공개키를 하드코딩 해두어 나머지 요청들은 거부합니다. CA가 침해당하거나 클라이언트가 공격자의 인증서를 신뢰하고 있는 상태더라도, 결국 서버가 신뢰하는 자신들의 인증서/공개키를 하드코딩 한다면 공격자는 해당 소스코드를 변경할 수단이 없기 때문에 중간자 공격에 실패합니다.

Practice

루팅된 디바이스를 이용하여 피닝을 위해 필요한 라이브러리와 프리다 서버, scrcpy 등을 설치합니다.

# Frida & Objection 설치
pip install frida
pip install frida-tools
pip install objection

설치한 Frida-server는 adb push를 이용하여 루팅된 디바이스에 업로드합니다.

# frida-server 업로드
adb push frida-server-16.7.18-android-arm64 /data/local/tmp

# frida-server 실행
./frida-server-16.7.18-android-arm64

# 파워쉘에서 frida를 통해 디바이스 프로세스 목록 열거
frida-ps -Uai

# SSL Pinning를 우회하고자 하는 애플리케이션의 PID를 지정하여 우회
objection -g <PID> explore
> android sslpinning disable

References

Last updated

Was this helpful?