Wins Security Information

보안 정보

앞 내용 보기 다음 내용 보기
취약점 정보OpenSSL 취약점(CVE-2017-3733)
작성일 2017-03-02 조회 914

1.개요

OpenSSL 취약점 중 언더플로우 취약점이 발견되었다. 해당 취약점은 handshake가 진행되는 과정에서 암호 알고리즘(Encrypt-Then-Mac)을 재검토 시 발생하는 충돌로 인해 발생한다.
 

[취약점 버전 정보]
OpenSSL 1.1.0e 이하 버전

 
[취약점 발생 결과]
서비스 거부(DoS) 발생
 

 

2.분석 내역

해당 취약점은 서비스 거부가 발생하는 취약점이다. ETM(Encrypt-Then-MAC) 없이 Clinet와 Server 응용 프로그램간에 OpenSSL 세션이 설정되었다고 가정해보자. 이로 인해 SSL content flag 변수인 s->s3->flags 가 TLS1_FLAGS_ENCRYPT_THEN_MAC 플래그를 설정 해제한다.

 

그 다음 Client가 ETM을 포함한 현재 사용한 암호로 암호화한 Client Hello 메시지를 보내 서버와의 재연결을 수행할 경우 ssl_scan_clienthello_tlsext() 함수는 현재 SSL context flag 변수 인 s->s3->flags에 TLS1_FLAGS_ENCRYPT
_THEN_MAC 플래그를 설정한다. 그러나 양쪽이 Change Cipher Spec TLS 레코드를 교환 할 때 까지, 모든 TLS 메시지는 ETM 스키마를 사용하지 않는 원래 암호 방식으로 암호화 된다. 해당 취약점은 바로 이 지점에서 발생한다.

 

ETM을 활성화하기 위해 Change Cipher Spec 레코드가 수신 될 때 까지 기다리는 대신 OpenSSL은 ETM을 포함한 Client Hello를 받으면 즉시 모든 후속 레코드가 ETM으로 암호화되고, ssl3_get_record() 함수가 ETM 블록에 들어가 복호화 하기 전 MAC을 읽고 확인한다. 그러나 TLS 레코드가 아직 ETM으로 암호화되지 않았으므로 빈 MAC 구조를 사용하는 EVP_MD_CTX_size() 함수를 호출하게 된다. 그 결과, mac_size가 에러 값으로 사용하는 -1의 값으로 생성된다. 그러나 여기에서 ssl3_get_record() 함수는 해당 값의 오류 조건을 확인하지 않고, mac_size를 2^32-1의 부호없는 정수 값으로 해석하게 된다. 그리고, mac_size가 64보다 크지 않다고 보장하기 위해 assertion 한다. 그 결과, assertion이 실패하고 OpenSSL 응용 프로그램은 종료된다.

 

위의 메커니즘은 ETM이 초기 handshake에서 연결될 때, 그리고 재연결 중에 연결되지 않는 경우 또는 반대의 경우 모두 적용 할 수 있다. 또한 서버 응용 프로그램과 마찬가지로 OpenSSL 클라이언트 응용 프로그램에도 똑같이 적용된다.

 

인증되지 않은 원격의 공격자는 먼저 ETM extension없이 OpenSSL 클라이언트 또는 서버 응용 프로그램 일 수 있는 대상 서버 어플리케이션과 유효한 TLS 세션을 설정 한 다음, ETM extension으로 TLS 재연결을 수행하여 취약점을 악용 할 수 있다. 공격이 성공하면 OpenSSL 응용 프로그램이 assertion 오류로 종료된다.

 

해당 취약점과 관련하여 OpenSSL 소스코드를 살펴보면 다음과 같다. OpenSSL 버전 1.1.0e의 소스코드 일부를 캡쳐한 내용으로, 소스코드 내에 주석으로 취약점 발생 위치를 표시해뒀다.

 

ssl/t1_lib.c (OpenSSL 1.1.0d)


[그림1] ssl/t1_lib.c (OpenSSL 1.1.0d)

 

ssl/record/ssl3_record.c (OpenSSL 1.1.0d)


[그림2] ssl/record/ssl3_record.c (OpenSSL 1.1.0d)

 

다음은 공격 흐름에 대해서 살펴보자. 해당 공격은 아래의 흐름으로 진행된다.

 

1)    공격자와 공격 대상 서버 서로 ETM없이 TLS handshake 수행
2)    공격자가 ETM을 포함한 Client Hello 메시지를 전달함으로 재연결 시도
3)    서버에서 Server Hello, Certificate, Server Hello Done 메시지 응답
4)    공격자가 암호화된 TLS record 전달함으로 공격 시도

 

위의 공격 흐름에 대해 공격 트래픽을 통해 살펴보면 다음과 같다. 먼저, 공격자는 ETM 없이 Clien Hello 메시지를 보내게 되고, 서버도 ETM 없이 응답 메시지를 보내게 된다.


[그림3] Client Hello 메시지

 


[그림4] Server Hello 메시지

 

다음으로 공격자는 이전 handshake를 끝내고, 다음 handshake 수립 요청 메시지를 보내게된다. 해당 메시지를 전달 받은 서버는 이전에 맺었던 handshake를 끝내고, 새롭게 요청된 handshake 요청인 TLS 세션을 수립한다.


[그림5] 새로운 handshake 수립 요청


[그림6] TLS 세션 연결

 

이에 공격자는 ETM을 포함한 Client Hello 메시지를 보냄으로 서버와 재연결을 시도한다. 해당 메시지를 받은 서버는 암호화된 Server Hello, Certificate, Server Hello Done 메시지들을 보냄으로 공격자와 세션이 연결되게 된다.


[그림7] ETM 포함한 Client Hello 메시지


[그림8] ETM 포함한 Client Hello 메시지

 

마지막으로 공격자는 암호화된 Client Key Exchange 메시지를 보냄으로, 취약점을 발생 시킬 수 있다.


[그림9] Client Key Exchange 메시지

 

 

3.정리

해당 취약점은 OpenSSL 1.1.0e 이하 버전에 존재한다. 해당 취약점을 이용하여 서비스 거부 공격이 가능하므로 이에 대한 각별한 주의가 필요하다. 이를 피하기 위해 반드시 최신 버전으로 업그레이드하여 사용하도록 한다.

 

 

 

4.대응 방안

1)최신 버전으로 업그레이드한다.


[OpenSSL 업데이트] https://www.openssl.org/source/


 

 

5.참고

https://www.openssl.org/news/secadv/20170216.txt
https://ko.wikipedia.org/wiki/OpenSSL
http://zetawiki.com/wiki/Encrypt-then-MAC

첨부파일 첨부파일이 없습니다.
태그   CVE-2017-6334  NETGEAR  DGN2200  dnslookup.cgi