Charles로 바이낸스 앱 패킷 캡처 실패: 인증서 피닝(Pinning) 설명
기술 연구원이나 보안 감사자가 Charles 또는 mitmproxy를 사용하여 바이낸스 앱의 HTTPS 트래픽을 캡처하려고 시도할 때, 앱이 연결을 직접 거부하거나 SSL 오류를 발생시키는 것을 발견하게 됩니다. 이는 바이낸스가 인증서 피닝(Certificate Pinning)을 구현했기 때문입니다. 본 노트에서는 이 메커니즘을 기술적인 관점에서 설명합니다. 앱 다운로드는 바이낸스 공식 사이트 또는 바이낸스 공식 앱을 이용하세요. iPhone 설치는 iOS 설치 튜토리얼을 참고하세요.
인증서 피닝(Certificate Pinning)이란 무엇인가
일반적인 HTTPS 검증 절차:
- 앱이 연결을 요청합니다.
- 서버가 인증서를 반환합니다.
- 앱은 시스템에서 신뢰하는 인증 기관(CA)이 인증서를 발급했는지 확인합니다.
- 신뢰할 수 있는 CA가 발급한 것이라면 모두 수락합니다.
인증서 피닝은 이보다 더 엄격한 검사입니다:
- 앱 내부에 '예상되는 인증서 지문(Fingerprint)'이 내장되어 있습니다.
- 서버가 인증서를 반환하면, 앱은 CA뿐만 아니라 내장된 지문과 일치하는지도 확인합니다.
- 일치하지 않으면 연결을 거부합니다.
왜 금융 앱은 피닝을 하는가
중간자 공격(MitM)을 방지하기 위함입니다:
- 공격자가 사용자를 속여 자신의 루트 인증서를 설치하도록 유도할 수 있습니다.
- 이후 자신의 인증서를 사용하여 트래픽을 가로챕니다.
- 일반적인 HTTPS 검증은 통과하게 됩니다 (루트 인증서가 화이트리스트에 추가되었기 때문).
- 하지만 피닝은 지문이 일치하지 않기 때문에 연결을 거부합니다.
바이낸스, 은행, PayPal 등과 같은 금융 앱들은 일반적으로 피닝을 적용합니다.
Charles / mitmproxy의 작동 방식
Charles가 HTTPS 패킷을 캡처하는 단계:
- 기기에 Charles 루트 인증서를 설치하고 신뢰하도록 설정합니다.
- 프록시를 Charles로 지정하도록 설정합니다.
- 앱이 요청을 보냅니다 → Charles는 자신의 인증서를 사용하여 대상 서버로 위장합니다.
- 앱의 검증: CA가 신뢰됨 (Charles 인증서가 설치되어 있기 때문).
- 일반 앱은 이를 수락합니다 → 패킷 캡처 성공.
하지만 바이낸스 앱은 4단계에서 항목을 하나 더 검사합니다:
5'. 인증서 지문을 확인합니다 → 일치하지 않음 → 연결 거부.
따라서 패킷 캡처에 실패하게 됩니다.
패킷 캡처 실패의 구체적인 증상
| 현상 | 원인 |
|---|---|
| 앱 실행 후 로딩 아이콘만 돔 | TLS 핸드셰이크 거부됨 |
| 시세 차트가 빈 화면으로 나타남 | WebSocket 연결 거부됨 |
| API가 연결 오류를 반환함 | 인증서 검증 실패 |
| Charles에 SSL Handshake Error가 표시됨 | 위와 동일 |
| 앱이 즉시 강제 종료됨 (드문 경우) | 처리되지 않은 예외 발생 |
피닝을 우회하는 몇 가지 방법
연구원들은 다음과 같은 방법을 사용할 수 있습니다:
- Frida 스크립트: 앱 내부의 인증서 검증 로직을 동적으로 교체합니다.
- LSPosed / Magisk 모듈: 수정된 코드를 주입합니다.
- APK를 디컴파일한 후 dex를 수정하여 다시 패키징합니다.
- PIN-SSL 수정 도구를 사용합니다.
이러한 방법들은 모두 기기 루팅(rooting)이 필요하며 앱의 사용자 약관을 위반합니다. 또한 바이낸스 앱의 보안 메커니즘이 이러한 도구들을 감지할 수도 있습니다.
일반 사용자가 이 문제를 겪는 이유
대다수의 일반 사용자는 패킷 캡처를 시도하지 않지만, 예외적인 몇 가지 상황이 있습니다:
상황 1 · 회사 네트워크에서 SSL 차단 적용 회사가 모니터링을 위해 라우터 수준에서 HTTPS 트래픽을 복호화하는 경우:
- 모든 직원의 기기에 회사 루트 인증서를 설치합니다.
- 트래픽이 복호화됩니다.
- 바이낸스 앱은 연결 거부 (지문 불일치).
판단 방법: 회사의 다른 HTTPS가 필요한 앱이나 은행 앱도 연결되지 않는지 확인해 보세요.
상황 2 · 백신 프로그램의 HTTPS 검사 Kaspersky, Avast 등과 같은 백신 프로그램은 HTTPS 트래픽을 스캔할 수 있습니다:
- 유사한 중간자(MitM) 방식을 사용합니다.
- 바이낸스 앱이 연결을 거부할 수 있습니다.
조치 방법: 백신 프로그램의 HTTPS 검사 기능을 임시로 끄세요.
상황 3 · '네트워크 가속기' 설치 일부 '가속기'는 실제로는 트래픽 프록시 역할을 합니다:
- 사용자가 모르는 사이에 루트 인증서가 설치됩니다.
- 패킷을 캡처하고 가속을 시도합니다.
- 바이낸스 앱은 연결을 거부합니다.
조치 방법: 출처가 불분명한 가속기를 삭제하세요.
피닝 업데이트 메커니즘
인증서 피닝의 지문은 바이낸스가 인증서를 교체할 때 변경됩니다:
- 보통 앱 내부에 여러 개의 지문이 내장되어 있습니다.
- 하나가 무효화되더라도 연결에 영향을 주지 않습니다.
- 앱을 업데이트할 때 지문도 함께 업데이트됩니다.
앱을 오랫동안 업데이트하지 않으면, 어느 날 피닝 지문과 서버 인증서가 모두 변경되어 연결할 수 없게 될 수도 있습니다.
클라이언트별 구현 차이
바이낸스 각 플랫폼별 피닝 강도:
| 클라이언트 | 피닝 강도 |
|---|---|
| 안드로이드 앱 | 엄격함 |
| iOS 앱 | 엄격함 |
| 데스크톱 클라이언트 | 엄격함 |
| 브라우저 | 구현 안 됨 (OS 신뢰 체계에 의존) |
브라우저에는 피닝 기능이 없습니다 (이 때문에 브라우저에서는 중간자 공격이 가능하지만, 앱에서는 불가능한 것입니다).
패킷 캡처 대체 방안
기술 연구를 위한 대체 방법:
- 바이낸스 공식 API 문서(공개됨)를 활용합니다.
- SDK에서 제공하는 인터페이스를 사용합니다.
- 웹 버전에서 패킷을 캡처합니다 (브라우저 개발자 도구 사용).
- 네트워크 계층에서 패킷을 캡처합니다 (Wireshark 등, 암호화된 상태로만 볼 수 있음).
이러한 방법들은 모두 앱의 보안 메커니즘을 훼손할 필요가 없습니다.
보안 권장 사항
- 출처가 불분명한 루트 인증서를 설치하지 마세요.
- 회사나 공용 WiFi 환경에서 바이낸스 앱 사용 시 주의하세요.
- 백신 프로그램의 HTTPS 검사 기능과 바이낸스 앱을 함께 사용할 때는 바이낸스를 허용 목록(화이트리스트)에 추가하세요.
- 주로 사용하는 기기는 루팅(rooting)하지 마세요.
FAQ
Q: Charles로 바이낸스 웹 버전의 패킷을 캡처할 수 있나요? A: 네, 가능합니다 (브라우저에는 피닝이 없기 때문). 하지만 웹 트래픽만 볼 수 있으며 앱 트래픽은 볼 수 없습니다.
Q: mitmproxy로 바이낸스 앱이 피닝을 하지 않도록 만들 수 있나요? A: mitmproxy 단독으로는 불가능합니다. Frida와 같은 도구와 함께 사용해야 합니다.
Q: iOS에 기업용 루트 인증서를 설치하면 바이낸스 접속이 차단되나요? A: 그럴 수 있습니다. 해당 인증서가 신뢰 체인에 어떻게 내장되었는지에 따라 다릅니다.
Q: 루팅된 안드로이드 기기에서는 패킷 캡처가 가능한가요? A: Frida 등의 도구를 사용하면 이론적으로 가능하지만, 앱 약관 위반입니다.