[HACKING] SSLv2 DROWN Attack(CVE-2016-0800) 취약점 분석 / 대응방안

올 초에 발견되었던 DROWN Attack에 대해 이야기해볼까 합니다. 사실 발견 당시 이 취약점에 대해 굉장히 흥미가 생겼지만, 바쁜 일정과 적은 자료로 관심을 접게되었지요. 최근에 a2sv에 해당 취약점을 점검할 수 있는 모듈을 넣는게 좋다고 생각되어서 다시 열어보게 되었습니다.

https://drownattack.com/ (style=undefined)

DROWN Attack이란?

이 취약점은 SSLv2 자체 취약점으로 알려져 있습니다. DROWN의 풀네임인 “Decrypting RSA with Obsolete and Weakened eNcryption” 또한 취약한 암호화에 대한 내용이며 해당 취약점을 통해 Cross-protocol attack 수행이 가능합니다.

공격을 통해서 HTTPS 를 깨거나 MITM 등의 시나리오가 가능합니다. 현재까지도 대다수 SSL이 적용된 웹 서비스가 취약하네요.. :(

CVSS를 보면 아래와 같습니다.


CVSS Severity (version 3.0):
  CVSS v3 Base Score: 5.9 Medium
  Vector: CVSS:3.0/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N
  Impact Score: 3.6
  Exploitability Score: 2.2
CVSS Version 3 Metrics:
  Attack Vector (AV): Network
  Attack Complexity (AC): High
  Privileges Required (PR): None
  User Interaction (UI): None
  Scope (S): Unchanged
  Confidentiality (C): High
  Integrity (I): None
  Availability (A): None


CVSS Severity (version 2.0):
  CVSS v2 Base Score: 4.3 MEDIUM
  Vector: (AV:N/AC:M/Au:N/C:P/I:N/A:N) (legend)
  Impact Subscore: 2.9
  Exploitability Subscore: 8.6
  CVSS Version 2 Metrics:
  Access Vector: Network exploitable
  Access Complexity: Medium
  Authentication: Not required to exploit
  Impact Type: Allows unauthorized disclosure of information 

기밀성만 침해되며 4.3의 Base Score를 가져가네요. v3 버전이 나온지가 조금 되었는데, 솔직히 아직 익숙하지가 않네요; 간단히 알아보았고 원리에 대해서 조금 더 알아보겠습니다.

DROWN Attack 원리

최근 웹서버가 TLS를 통한 보안을 사용하지만 많은 서버들이 SSLv2 or SSLv3 등을 지원하는 경우가 있습니다. 일반적으로 각각 웹 브라우저에서 SSLv2를 사용하지 않기 때문에 지금에서야 그 위험성이 나타난 것 같네요. (POODLE도 그러고 SSLv2, SSLv3 둘다 참..)

공격자가 SSLv2를 지원하는 서버와 같은 개인키(Private Key)를 사용해서 일반적인 TLS Connections 풀어낼 수 있습니다. 이 공격 자체가 개인키를 공유하는 서비스 중 SSLv2를 사용하지 않으면 괜찮지만 사용한다면 HTTPS가 DROWN Attack에 위협받을 수 있습니다.

| | |——–| |https://privatsphaere-leipzig.org/| 현재 웹 보안에서 매우 중요하게 여겨지는 보안 프로토콜은 TLS입니다. 이 프로토콜의 초기, 즉 시작이 된 유래가 Netscape Communications에서 만든 SSL(Secure Socket Layer)입니다. 초기 SSL은 불안정하고 오류/버그등이 있었지만 시간이 오래 지난 현재에도 지원을하며, 사용이 가능하기 때문에 여러 SSL 취약점에 노출되게 됩니다. 아무래도 1990년대 프로톨콜이기 떄문에 이런 이슈가 터져도 이상하지 않을수도 있죠.

SSLv2, TLS 모두 RSA를 지원하지만 TLS는 암호화에 대한 공격에 대해서 대응이 가능하고 SSLv2는 그게 불가능합니다. SSLv2는 RSA 기반의 키 교환 과정을 거치는데, 이 과정 자체를 PMS(Pre Master Secret) 라고 부릅니다.

공격자는 암호화된 PMS를 스니핑하고, 서버에게 유사한 연관값들을 매우 많이 보내며 PMS에 대해 복호화를 시도하게 됩니다. 이러한 과정을 통해서 PMS 복호화에 성공하면 RSA를 통해 교환된 키값을 찾을 수 있고 이 키를 이용하여 SSL을 복호화할 수 있습니다. (이 과정중에는 Daniel Bleichenbacher가 발표했던 문서에 1비트의 정보를 통해 복호화가 성공했는지 실패했는데 알 수 있는 부분이 있습니다.)

이 과정에서 TLS와 SSL의 보안성의 차이가 나타납니다. SSL이 크랙되는 과정은 이처럼 이루어지게 되고 다음은 큰 그림으로 Drown Attack의 형태를 볼까합니다.

보시면 아시겠지만 굉장히 단순한 보안연결에 대한 공격 시나리오입니다.

아래 그림과 같이 공격자는 SSLv2를 지원하는 웹서버에게 조작된 SSLv2 probes를 날립니다.

https://drownattack.com/ (style=undefined)

이 과정에서 키를 찾는 Crack 과정이 들어가고, 공격자가 Key 를 찾는다면 Victim Client 와 Victim Server 간의 암호화된 통신을 열람할 수 있게 되지요.

DROWN Attack Check(Check Vulnerability)

이 취약점을 발표한 곳에서 drownattack.com 서비스를 운영하고 있습니다. 이 사이트에서는 DROWN Attack에 대한 정보와 테스트를 해볼 수 있는 사이트 링크를 제공합니다. (물론 외부서버는 상관없겠지만, 내부 자산이거나 민감한 경우에는 이곳이 아닌 별도의 툴을 사용하는게 좋겠지요)

https://test.drownattack.com/?site=

A2SV Modules

SSL Scanner인 A2SV에서도 DROWN Attack에 대한 스캔 모듈을 넣어볼까 합니다. 물론 대략적인 정보는 수집하였고, SSLv2 사용 여부를 검증하는 코드만 넣으면 금방될 것 같으니 업데이트까지 오래 걸리지는 않을 것 같네요.

실제로 업데이트되면 글 추가로 수정하겠습니다.

대응방안

아주 간단합니다. SSLv2를 사용하지 않으면 됩니다. (POODLE도 동일한 해법이지요, 물론 config를 수정해야하지만 =_=)

또한 OpenSSL에서는 버전 upgrade가 필요합니다. 이 내용은 알약 블로그에서 굉장히 잘 설명해주셨네요 :) (http://blog.alyac.co.kr/554)

업그레이드 후 Apache, Nginx 에서 config(httpd.conf 등) 편집이 필요합니다. (SSLv3 POODLE 수정방법과 거의 동일한 느낌..)

SSLProtocol -all +TLSv1.1 +TLSv1.2 SSLCipherSuite HIGH:!aNULL:!MD5:!SSLv2:!SSLv3:!TLSv1

Reference

https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2016-0800 https://drownattack.com/ http://blog.alyac.co.kr/554