글 작성자: ikimonotaku

2014년 4월 7일 부터 현재까지 이슈가 되었던 OpenSSL 취약점 정리본


■ Test for SSL heartbeat vulnerability (CVE-2014-0160) 2014/04/07 - Open SSL 취약점

서버의 Heartbeat 기능을 우회하여 서버가 다른 사용자와 통신 중인 암호화 되기 전 민감정보를 공격자에게 전달

설명 : 

클라이언트와 서버가 SSL 인증을 통해 세션을 맺은 후 OpenSSL을 사용중인 서버는 Heartbeat 라는 규약을 통해 세션이 끊어지지 않기 위해 서로 상태를 체크


ex) 

1. 클라이언트 hello -> 서버

2. 서버 hello -> 클라이언트 : 이때 hello는 클라이언트가 보내온 동일한 문자열로 인증


상세정보 : 

hello 문자열을 클라이언트에서 서버로 보내올때 length 부분을 문자열과 사이즈가 동일한지 체킹하는 부분이 없어서 서버 Memory(cache)상에 존재하는 다른 사용자와 통신중인 암호화되기전 민감정보를 무작위로 공격자에게 length 만큼 전달


■ SSL/TLS MITM (CVE-2014-0224) 2014/06/05 중요

- CCS 메세지 적용 전 종종 동작함

- 마스터 길이가 0으로 설정될 때 나타날 수 있음

공격자 Flow : 

1) 클라이언트와 서버 사이에서 ClientHello/ServerHello 핸드쉐이크 메세지가 발생하는 새로운 TLS 연결이 맺어질 때까지 기다린다.

2) 정상적인 CCS 패킷을 서버로 전송했을 때 서버에서 특정오류가 발생하여 마스터키가 0으로 생성된다. 세션키는 0 마스터키를 통해 이루어지고, 다음 세션에서도 0 마스터키를 통해 이루어진 세션키를 사용하기 때문에 취약점이 존재한다.

3) 핸드쉐이크가 재협상을한다.

4) 공격자는 0 Master secret key를 통해 민감정보의 복호화가 가능하며, 패킷을 수정하여 전송한다.


■ DTLS recursion DoS (CVE-2014-0221) 2014/06/05 그닥

- DTLS handshake 과정중 클라이언트를 crash


■ DTLS invalid Fragment Code Exec.(CVE-2014-0195) 2014/06/05 위험

- 첫번째 플래그먼트와 두번째 플래그먼트의 length, Fragment Size를 체크하는 부분이 없고, 단순 "Length>Fragment Size" 만 체크함에 따라 유효하지 않는 코드가 실행되는 버그 발생


■ SSL_MODE_RELEASE_BUFFERS DoS (CVE-2014-0198) 2014/04/21 중요

영향 : 비인증 데이타의 DoS 또는 인젝션을 야기함

- SSL_MODE_RELEASE_BUFFERS 를 메모리에 저장해 사용하는 경우 발생(유효연결수당 32K)

- DTLS/SSL2 통신엔 영향 없음


■ Anonymous ECDH DoS (CVE-2014-3470) 2014/05/30 그닥

- 상세정보는 없으며, 익명 cipher 패키지(anonymous cipher suites)를 사용하지 않으면 됨


■ 선행지식 : 

CCS(Change Cipher Spec) : Handshake로 협상된 압축, MAC, 암호화 방식 등이 이후부터 적용됨을 상대방에 알림

■ DTLS

DTLS 란 : UDP 기반 TLS, DTLS 1.0은 OpenSSL 에서 구현되었음

- 사용중인 서비스

VPNs, VoIP(Cisco), WebRTC, LDAP over SSL, SNMPv3, 대부분의 video/voice에 사용되는 SSL


DTLS Flow

1. 프로토콜버전, 암호화 방식 등 협상

2. 서버인증 또는 키 교환

3. 클라이언트 인증 또는 키교환

4. 협상된 압축, MAC, 압호화 방식 등 적용 되었음을 서버에 알림(CCS)

4. 협상된 보안 알고리즘에 따른 메세지 교환


DTLS 플래그먼트 속성

– Total message length (Length) 

– Fragment Offset (Offset) 

– Fragment Length


DTLS 플래그먼트 Process

1. 플래그먼트를 받는다(체크 : Length>Fragment Length)

2. OpenSSL 서버는 Length를 수렴

3. 카피된 fragments를 버퍼에 저장