Insecure Client-Initiated Renegotiation 취약점 및 조치방안

2024. 11. 6. 00:02 보안 이야기/취약점

웹 서버나 애플리케이션에서 SSL/TLS를 사용하여 데이터를 암호화할 때, 잘못된 설정이나 취약점이 발생하면 보안이 취약해질 수 있습니다. 그중에서도 Insecure Client-Initiated Renegotiation(클라이언트가 시작하는 재협상) 취약점은 비교적 흔하게 발견되며 매우 위험할 수 있는 보안 문제입니다. 이 포스팅에서는 해당 취약점을 어떻게 발견할 수 있는지, 그리고 이를 어떻게 조치할 수 있는지 구체적인 예시와 함께 설명하겠습니다.

1. Insecure Client-Initiated Renegotiation이란?

Client-Initiated Renegotiation는 클라이언트가 SSL/TLS 연결의 보안을 재협상하도록 요청할 수 있는 메커니즘입니다. 일반적으로 이 기능은 클라이언트와 서버 간의 연결 보안을 개선하기 위해 사용될 수 있지만, 악의적인 클라이언트가 이 기능을 악용하면 **DoS(서비스 거부 공격)**를 발생시킬 수 있는 취약점으로 작용할 수 있습니다. 즉, 다수의 클라이언트가 지속적으로 재협상 요청을 보내 서버의 리소스를 소모하게 하여, 결국 정상적인 사용자를 위한 서비스를 방해하는 방식입니다.

2. 취약점 발견 방법

이 취약점을 진단하기 위해서 전문적인 보안 도구를 사용할 수 있습니다. 예를 들어, Nmap의 스크립트를 이용하면 SSL/TLS 취약점을 탐지할 수 있습니다.

다음은 Insecure Client-Initiated Renegotiation을 확인하기 위한 Nmap 명령어 예시입니다:

nmap --script ssl-enum-ciphers -p 443 example.com

위 명령어는 서버의 포트 443에서 사용하는 SSL/TLS 설정을 검사하여, 재협상이 허용되는지 여부를 포함한 보안 정보를 제공합니다.

또 다른 방법으로는 OpenSSL 도구를 이용하여 직접 서버와 핸드셰이크를 시도하여, 재협상 지원 여부를 확인할 수 있습니다:

openssl s_client -connect example.com:443 -reconnect

만약 서버가 클라이언트 측에서 재협상 요청을 허용한다면, 이는 보안 취약점으로 이어질 수 있습니다.

3. 조치 방안

이 취약점을 해결하기 위해서 서버의 설정을 수정하여 Client-Initiated Renegotiation을 비활성화할 수 있습니다. 각 웹 서버나 SSL/TLS 라이브러리에 따라 설정 방법이 다를 수 있지만, 여기서는 주요 서버 설정 예시를 보여드리겠습니다.

3.1. Apache 웹 서버에서의 설정

Apache 웹 서버에서는 mod_ssl 모듈을 사용하여 재협상 설정을 제어할 수 있습니다. 재협상을 비활성화하려면 다음과 같은 설정을 추가합니다:

SSLInsecureRenegotiation off

이 설정을 Apache 설정 파일(httpd.conf 또는 가상 호스트 파일)에 추가한 후 서버를 재시작하면 클라이언트가 시작하는 재협상을 막을 수 있습니다.

3.2. Nginx 웹 서버에서의 설정

Nginx의 경우, 재협상을 직접 제어하는 설정 옵션은 없지만, SSL/TLS 버전을 업그레이드하고 모던한 암호화 방식을 적용함으로써 보안성을 높일 수 있습니다. 예를 들어, 최신 TLS 버전만 허용하고 안전한 암호화를 사용하도록 설정할 수 있습니다:

ssl_protocols TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH";

이와 같은 설정은 취약한 SSL/TLS 프로토콜을 차단하고, 서버가 더 안전한 암호화 방식을 선호하도록 만들어 DoS 공격의 위험을 줄입니다.

3.3. AWS ALB 설정 예시

만약 AWS의 **Application Load Balancer(ALB)**를 사용 중이라면, ALB의 보안 정책(Security Policy)을 수정하여 안전한 SSL/TLS 프로토콜과 암호화 스위트만 허용하도록 설정할 수 있습니다. AWS 콘솔에서 ALB를 선택한 후, Listener 설정에서 보안 정책을 아래와 같이 변경할 수 있습니다:

  1. AWS Management Console에서 ALB로 이동합니다.
  2. Listeners 탭을 클릭합니다.
  3. HTTPS 리스너를 선택하고, Edit 버튼을 클릭합니다.
  4. Security Policy를 최신 버전으로 설정합니다 (예: ELBSecurityPolicy-TLS-1-2-2017-01).

이를 통해 클라이언트의 재협상 시도를 제한하고, 안전한 SSL/TLS 연결을 유지할 수 있습니다.

4. 적용 후 확인 방법

설정 변경 후, 다시 한 번 Nmap이나 OpenSSL을 이용하여 재협상이 차단되었는지 확인할 수 있습니다. 만약 설정이 성공적으로 적용되었다면 클라이언트에서 시작된 재협상 요청이 거부될 것입니다.

예를 들어:

openssl s_client -connect example.com:443 -reconnect

위 명령어를 실행했을 때 재협상이 거부되거나 실패 메시지가 출력되면 설정이 올바르게 적용된 것입니다.

5. 결론

Insecure Client-Initiated Renegotiation은 잘못된 설정으로 인해 서버 자원을 낭비하게 만들고, 서비스 거부 공격의 대상이 될 수 있는 심각한 취약점입니다. 이를 방지하기 위해서는 웹 서버 설정을 수정하여 클라이언트 측 재협상을 비활성화하거나, 최신 SSL/TLS 프로토콜과 보안 설정을 적용해야 합니다. Nmap이나 OpenSSL과 같은 도구를 통해 설정 상태를 점검하고 주기적으로 보안성을 확인하는 것도 중요합니다.

이 글을 통해 Insecure Client-Initiated Renegotiation 취약점에 대해 이해하고, 이를 방지하는 구체적인 방법을 적용해 보세요. 안전한 웹 환경을 유지하는 데 도움이 되길 바랍니다.