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

2019. 7. 21. 19:20 보안 이야기/취약점

지인을 통해 금보원에 새로운 취약점 몇 개가 추가되었다고 들었는데

 

처음듣는 부분이 있어서 포스팅한다.

 

 

취약점 이름은

Insecure Client-Initiated Renegotiation

 

이 설정이 미흡하게 되어 있다면 DoS 형태의 공격에 노출될 수 있는 취약점이다.

 

암호화 통신을 할때, 재협상 제한이 미흡해서 일어나는 취약점.

 

 

처음에는 파이썬으로 코딩해서 Burp에 API로 붙이려고 했으나,, 

도저히 못짜겠어서 일단 원리파악차 공부했다.

 

일단 확인 방법은 쉽다

 

openssl을 통해서 점검하고자 하는 사이트에 붙은 후 명령어를 통해 재협상을 하면 된다.

 

그에 따른 리턴값이 어떻게 나오냐에 따라 취약 유무를 따질 수 있다.

 

일단 재협상은 네 가지 종류가 있다.

 

  • Client-initiated secure renegotiation
  • Client-initiated insecure renegotiation
  • Server-initiated secure renegotiation
  • Server-initiated insecure renegotiation

재협상은 두가지의 공격 유형이 있는데 그중 DoS 공격이 될 수 있는 취약점에 대해서만 알아보자.

 

테스트 방법은 이렇다.

 

 

먼저, 알아야 할 것은 윈도우에서는 openssl 바이너리가 제공되지 않기 때문에 

 

리눅스에서 확인을 해야한다. 

 

그래서 윈도우10에서 지원하는 우분트 쉘을 설치해서 openssl을 테스트했다.

 

다음과 같이 

 

"openssl s_client -connect IP:PORT"

 

명령어를 주면 쭈~~~~욱 결과가 나온다.

 

 

이 때 콘솔창이 잠깐 멈추는데 

 

 

저기 빨간색 네모 안에 대문자 알 위에 보면 작대기 세 개가 있다.

 

--- 이렇게 된부분이 콘솔에 뜨면 그 때 대문자 R을 입력한다.

 

R 명령어는 보이는 바와 같이 RENEGOTIATING 재협상을 시도하는 명령어이다.

 

R 명령을 입력했을 때 저 캡처와 같이 error가 발생하고 

아무 동작이 이루어 지지 않는다면 양호항 형태이다.

 

 

그렇다면 취약할 때는?

 

 

 

다음과 같이 재협상이 이루어지게 된다.

 

이런 형태로 DoS공격이 이루어지게 되는 것이다.

 

 

생각해보니 openssl 바이너리가 없으면 테스트하기가 너무 어려운 항목이었다.

 

괜히 python으로 짤라다가 시간만 보낸게 아닌가 싶다.

 

 

어떻게 막을까??

Disabling TLS renegotiation

Tackling the second problem seems easy: just disable TLS renegotiation. It is hardly needed: a server can trigger a renegotiation to ask a client to present a certificate but a client usually does not have any reason to trigger one. Because of a past vulnerability in TLS renegotiation, recent versions of Apache and nginx just forbid it, even when the non-vulnerable version is available.

openssl s_client can be used to test if TLS renegotiation is really disabled. Sending R on an empty line trigger renegotiation. Here is an example where renegotiation is disabled (despite being advertised as supported):

$ openssl s_client -connect www.luffy.cx:443 -tls1 [...] New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-SHA Server public key is 2048 bit Secure Renegotiation IS supported Compression: zlib compression Expansion: zlib compression [...] R RENEGOTIATING 140675659794088:error:1409E0E5:SSL routines:SSL3_WRITE_BYTES:ssl handshake failure:s3_pkt.c:591:

Disabling renegotation is not trivial with OpenSSL. As an example, I have pushed a patch to disable renegotiation in stud, the scalable TLS unwrapping daemon.

https://vincent.bernat.ch/en/blog/2011-ssl-dos-mitigation#disabling-tls-renegotiation

 

https://github.com/bumptech/stud/pull/47/commits/5317e3cb096a67409405e0d4c4789c0ac292076c

 

openssl 개발자가 2011년도에 업데이트한 내역이다.

 

재협상이 일어나지 안도록 소스코드를 수정했다.

 

고로 업데이트가 답인데...

 

금융권에서 openssl 을 쉽게 업데이트할 수 있을까?

 

정말 어려운 숙제이다. 서비스가 가장 중요한 곳이다 보니.

 

 

 

참고 URL :

1. https://securingtomorrow.mcafee.com/technical-how-to/tips-securing-ssl-renegotiation/

2. https://blog.ivanristic.com/2009/12/testing-for-ssl-renegotiation.html

3. http://www.exploresecurity.com/wp-content/uploads/custom/SSL_manual_cheatsheet.html

4. https://ok-chklist.readthedocs.io/ko/latest/08_Cryptography/OTG-CRYPST-001.html#id7

5. https://www.ssllabs.com/ssltest (여기서 스캔하면 결과로 보여주는데 정확하지 않으니 참고만 하시길)