분석 대상 |
OpenSSL Library 1.0.0l | ||
문서 작성일 |
2014.04.11 |
문서 버전 |
V0.3 |
OpenSSL프로젝트는 정해진 규격의 네트워크 보안 프로토콜을 범용 라이브러리로 구현하기 위한 목적을 가지고 오픈소스 프로젝트로 시작하였으며, 현재 전 세계 개발자들이 유지보수에 참여하고 있다.
OpenSSL라이브러리는 OpenSSL 프로젝트의 결과물로써, 데이터 통신 시 사용되는 네트워크 암호화 프로토콜인 TLS(Transport Layer Security)와 SSL(Secure Sockets Layer)기능을 구현한 라이브러리이다.
이러한 OpenSSL라이브러리는 네트워크 보안 프로토콜에 사용되는 소프트웨어나 네트워크 하드웨어 장비 등에 사용되고 있는데, 본 라이브러리와 관련하여 지난 2014년 4월 8일 “HeartBleed”라는 이름의 보안 취약점이 공개 되었다.
“HeartBleed” 취약점은 OpenSSL 라이브러리를 사용하는 서버와 통신 시 조작된 TLS 패킷 전송 과정을 적절하게 검증하지 않음으로 발생한다. SSL을 사용한 네트워크 통신 과정에는 서버와 클라이언트 간 연결을 안정적으로 지속시키기 위해 연결 지속 신호를 주고 받도록 되어 있는HeartBeat라는 과정이 존재한다. 취약한 버전의OpenSSL 라이브러리는HeartBeat 통신 과정을 수행할 때 특정 변수의 경계 값을 적절히 검증하지 않으며, 이로 인해 서버 측 메모리 데이터가 노출되는 취약점이 존재한다.
해당 취약점을 통해 개인 키, 비밀 키와 웹 서비스를 이용 중인 사용자 세션의 획득이 가능하고 서버와 클라이언트의 암호화 된 트래픽을 통해 정보를 획득할 수 있다.
- OpenSSL TLS heartbeat관련 URL
https://www.openssl.org/news/secadv_20140407.txt http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2014-0160 |
- 취약한 버전 정보
openssl:1.0.1f openssl:1.0.1 openssl:1.0.1:beta1 openssl:1.0.1:beta2 openssl:1.0.1:beta3 openssl:1.0.1a openssl:1.0.1b openssl:1.0.1c openssl:1.0.1d openssl:1.0.1e |
“Heartbleed” 취약점은 OpenSSL라이브러리 내TLS 패킷을 처리하는 과정 중 수행되는 tls1_process_heartbeat(), dtls1_process_heartbeat() 함수에서 payload 변수의 경계 값을 적절히 검증하지 않아 발생한다.
[그림 2] t1_lib.c 소스코드의 취약한 함수
TLS 패킷 처리 과정에서 payload값을 설정하여 서버에 요청 패킷을 보내면, 서버로 보내진 payload 값이 그대로 서버 응답 패킷에 포함되어 클라이언트로 전달된다.
공격자는 이러한 통신 과정 수행 시 payload 데이터는 명시하지 않고, 단순히payload 사이즈 값만을 조작한 패킷을 서버로 전송 할 수 있다. 이 때 서버는 payload사이즈 여부만 검증하여 payload 데이터 영역에 내부 특정 메모리 영역의 데이터를 복사하여 클라이언트로 응답 패킷을 보내게 되며, 공격자는 이에 따라 최대 64KB 임의의 데이터를 획득할 수 있다.
[그림 3] 조작된 TLS 패킷 전송
HeartBeat 허용 요청 패킷이 전송된 것을 모니터링 도구를 통해 확인 할 수 있다.
[그림 4] TLS 패킷 확인
클라이언트에서 HeartBeat 통신 과정 중 payload 사이즈 값을 조작하여 서버에 요청한다.
[그림 5] heartbeat 패킷 전송
취약점이 발생하는 부분을 OpenSSL 라이브러리의 소스코드를 참조하여 쉽게 알 수 있다.
[그림 6] tls1_process_heartbeat() 함수에 인자로 전달되는 SSL 구조체
[그림 7] SSL 구조체를 참조하는 과정과 취약점이 패치된 부분
해당 취약점을 근거로, 다음과 같은 테스트베드를 구축하여 취약점의 심각성을 재현하였다.
* 시나리오 : OpenSSL로 구성된 Apache 서버의 타 사용자 권한 획득
* 서버 : Apache 2.2.15-29 + php 5.3.3 + openssl-1.0.1e-16
* 클라이언트 : Windows XP + Chrome 34.0.1847.116 m
웹 사이트에 로그인 된 사용자의 화면이다.
[그림 8] 로그인 된 사용자
로그인 된 사용자의 세션 정보이다.
[그림 9] 로그인 된 사용자 세션
조작된 heartbeat 패킷을 통해 서버의 특정 메모리 영역에 대한 데이터를 전달 받을 수 있다.
[그림 10] heartbeat 패킷 응답 값
다음과 같이 전달된 데이터를 통해 메모리에 저장된 로그인 사용자의 세션 정보 및 사용자 계정 정보를 확인할 수 있다.
[그림 11] 메모리에 저장된 사용자 세션 정보
본 취약점에 노출 될 경우 악의적인 외부 사용자는 웹 서비스 및 보안 장비, 또는 네트워크를 사용하는 사용자들에 대해 세션이나 개인키, 비밀 키에 대한 획득이 가능하다.
사용자 및 관리자의 세션이 탈취 될 경우, 홈페이지에 대한 위험이 발생할 수 있으며 더 나아가 서버 및 내부 네트워크 침투에 대한 위험을 초래할 수 있다.
본 취약점으로 인해 노출되는 위협에는 다음과 같은 사례들이 존재한다.
1. 포털 및 커뮤니티 사이트의 로그인 정보 유출
2. VPN 서버의 Private Key 유출
3. 네트워크 장비 및 보안 장비의 Private Key 및 로그인 정보 유출
4. 취약한 OpenSSL 라이브러리로 구성되어 통신하고 있는 애플리케이션의 로그인 정보 유출
※ 해당 취약점은 특정 OS 환경에 국한되는 취약점이 아닌 OpenSSL 라이브러리를 사용하고 있는 VPN 및 라우터와 같은 네트워크 장비나 하드웨어 보안장비에도 영향을 미칠 수 있음.
1. Memory Read Overrun
1. OpenSSL 업데이트
OpenSSL 공식 홈페이지를 통해 패치 된 버전으로 업데이트 할 수 있도록 권고함.
2. OpenSSL 재 컴파일
OpenSSL의 업데이트 불가피할 경우, 소스코드를 "-D OPENSSL_NO_HEARTBEAT"를 통해 재 컴파일 할 수 있도록 권고함.
※ 현재 ㈜에이쓰리시큐리티에서 테스트 및 분석 중에 있으며, 이 문서는 계속 업데이트될 것입니다. 본 문서는 보안취약점으로 인한 피해를 최소화하는 데 도움이 되고자 작성되었으나, 본 문서에 포함된 대응방안의 유효성이나 기타 예상치 못한 시스템의 오작동 발생에 대하여서는 ㈜에이쓰리시큐리티에서는 일체의 책임을 지지 아니합니다.