[버그바운티] CVE 분석 - CVE-2024-12797

Jay·2025년 2월 15일

BugBounty

목록 보기
5/6

CVE-2024-12797는 OpenSSL의 취약점으로, OpenSSL이 인증되지 않은 서버의 RPK가 예상된 키와 일치하지 않더라도 TLS/DTLS 핸드셰이크(RFC 7250)가 중단되지 않는 고위험 취약점이다.

OpenSSL
TLS(Transport Layer Security) 및 SSL(Secure Sockets Layer) 프로토콜을 구현한 오픈 소스 라이브러리이다. 이를 통해 데이터 TLS/SSL 프로토콜 지원, 암호화 기능 제공, X.509 인증서 및 PKI(Public Key Infrastructure) 지원 등의 기능을 하고, 인터넷을 보다 안전하게 보호할 수 있다. 웹 서버(HTTPS), VPN, 이메일 암호화, IoT, 내장 시스템, 블록체인 및 암호화폐 등에 사용된다.

RPK(Raw Public Key) - RFC 7250
일반적으로 TLS 핸드셰이크에서 서버와 클라이언트가 X.509 인증서를 교환하여 인증을 수행하는 것과 다르게, RFC 7250은 인증서 없이 공개키 자체를 사용하도록 허용한다. TLS 및 DTLS에서 X.509 인증서 대신 공개 키(Raw Public Key)를 직접 사용하는 방식이다.
다음과 같은 과정으로 이루어진다.
1. ClientHello (기본 TLS 핸드셰이크 시작)
2. ServerHello
3. ServerKeyExchange (X.509 인증서 대신 Raw Public Key 포함)
4. ClientKeyExchange (클라이언트도 Raw Public Key를 사용 가능)
5. Key Exchange 및 핸드셰이크 완료
주로 IoT, 경량 네트워크 환경, 제한된 리소스 시스템에서 X.509 인증서 관리의 부담을 줄이기 위한 목적으로 사용된다.

CVE-2024-12797 취약점에서, RFC 7250 RPK(Raw Public Key, 원시 공개 키)를 사용하여 서버를 인증하는 클라이언트는 SSL_VERIFY_PEER 검증 모드가 설정된 경우 핸드셰이크가 예상대로 중단되지 않기 때문에 서버가 인증되지 않았다는 사실을 알아차리지 못할 수 있다.

해당 취약점을 악용하면, RPK를 사용하는 TLS 및 DTLS 연결은 클라이언트가 서버 인증 실패를 감지하지 못할 때 MITM(Man-in-the-Middle, 중간자 공격)에 취약할 수 있고 잠재적으로 데이터 침해 및 무단 액세스 등의 공격으로 이어질 수 있다.

SSL_VERIFY_PEER는 클라이언트가 서버의 인증서를 검증하는 모드이다.

RPK는 TLS 클라이언트와 TLS 서버 모두에서 기본적으로 비활성화되어 있다. 취약점은 TLS 클라이언트가 서버에서 명시적으로 RPK 사용을 사용하도록 설정하고 서버도 마찬가지로 X.509 인증서 체인 대신 RPK 전송을 사용하도록 설정하는 경우에만 발생한다. 영향을 받은 클라이언트는 SSL_VERIFY_PEER모드를 사용하여 서버의 RPK가 예상된 공개키와 일치하지 않으면 핸드셰이크가 실패할 것이라고 기대하지만, 핸드셰이크가 정상적으로 진행되어 클라이언트가 서버 인증 실패를 감지 못할 가능성이 있다.

일반적인 X.509 기반 TLS(HTTPS 등) 환경에서는 해당 취약점의 영향을 받지 않으며, 클라이언트가 SSL_get_verify_result()를 활용하여 서버의 공개 키를 수동 검증하는 경우에도 해당 취약점의 영향을 받지 않는다.

해당 문제는 OpenSSL 3.2에서 RPK 기능이 처음 구현될 때 발생한 버그이다.
OpenSSL 3.4, 3.3, 3.2 버전이 취약하다.

보완 방법

  1. 취약점이 패치된 버전으로 업그레이드. :
  • OpenSSL 3.2 사용자는 OpenSSL 3.2.4로 업그레이드
  • OpenSSL 3.3 사용자는 OpenSSL 3.3.2로 업그레이드
  • OpenSSL 3.4 사용자는 OpenSSL 3.4.1로 업그레이드
  1. RPK 대신 X.509 인증서 기반 검증 사용:
  • RPK가 아닌 X.509 인증서를 활용하여 서버를 검증하면 해당 취약점의 영향을 받지 않음
  1. SSL_get_verify_result() 호출을 통한 인증 검증 강화
  • 애플리케이션에서 SSL_get_verify_result() 함수를 반드시 호출하여, 서버 인증이 실패한 경우 연결을 즉시 종료하도록 구현한다.

reference:
https://www.cyberone.kr/news-trends-detail?id=120029&page=1
https://www.openwall.com/lists/oss-security/2025/02/11/3

0개의 댓글