OpenSSL 취약점. Heartbleed
- “Heartbleed(심장 출혈)”라고 부르는 버그를 이용하면 최근 2년동안의 OpenSSL 버전이 설치된 시스템 메모리의 64KB 데이터를 공격자가 볼 수 있다.
- 정확한 취약성 이름은: CVE-2014-0160 OpenSSL Heartbleed
- 시스템 메모리에는 유저이름, 암호, 신용카드 정보 등의 데이터가 있고. 이것을 키를 이용해서 암호화한다.
- 이 키를 공격자가 얻을 수 있고. 암호화되지 않은 상태로 읽을 수 있다.
- 그리고 이 키를 가지고 다른 사람 행세를 하며 서버에 침입할 수 있다.
구체적인 공격 가능성은:
- 공격자가 https 서버의 SSL인증서 개인키를 얻을 수 있다.
- FreeBSD 9.1에서 개인키가 보인 사례
- 이건 최악의 경우긴 한데. 현재 사용중인 SSL인증서를 revoke하고 재발행하는게 좋다.
- 만약 현재 운영하는 서버가 취약성있는 버전의 OpenSSL에서 서비스하고 있었다면. 최근 2년동안 SSL 인증서의 개인키가 털렸을 가능성이 있다.
- https 서버의 메모리에 있는 사용자 정보가 노출될 수 있다. 만약 아파치에서 SSL을 처리하고 있다면 웹 어플리케이션 정보가 노출될 수 있다.
- heartbleed 취약성을 이용하여 유저 세션을 하이재킹하는 방법
버그 분석
- TLS 스펙의 문제는 아니고 TLS heartbeat 기능을 OpenSSL 라이브러리가 잘못 구현한 버그이다.
- heartbeat 구현 버그라서 Heartbleed 라고 이름 붙여짐.
- 실제 수정한 소스코드 분석은 여기서
- TLS Heartbeat 스펙은
- payload 와 payload length 를 받아서.
- length 를 검사하고 payload를 그대로 복사하여 클라이언트에게 응답해야 한다.
- 하지만 OpenSSL이 payload length 검사 없이 memcpy 를 실행해서 메모리 안의 다른 내용까지 복사해서 응답해주는 버그였다.
- https://github.com/openssl/openssl/commit/96db9023b881d7cd9f379b0c154650d6c108e9a3
- 2011년 12월 이후 버전. OpenSSL 1.0.1 ~ 1.0.1f 에 문제가 있고 오늘(4/7) 수정되었다.
- 게다가 이 버그를 악용해도 로그에 남지 않는다.
내 사이트가 영향이 있는지 체크하는 방법
- 아래의 사이트에서 해당 웹서버가 영향을 받는지 아닌지 테스트할 수 있다.
- http://filippo.io/Heartbleed/#github.com
- 이 사이트의 소스코드는 https://github.com/FiloSottile/Heartbleed 여기 있는데, go로 작성되어 있다.
- How to test if your OpenSSL heartbleeds
- 이 블로그를 보고 직접 서버에서 테스트 할 수도 있다.
- Chromebleed 라는 크롬 확장도 나왔다.
- 현재 브라우징 하고 있는 사이트가 heartbleed 위험이 있는지 보여줌.
- (사실 이런 확장들이 위험이 있는 사이트들을 수집하고 있는게 아닌가 의심도..)
- 파이썬으로 작성된 테스트 스크립트. heartbleed-masstest
OpenSSL 1.0.1 ~ 1.0.1f 을 사용하지 않으면 안전하다.
sangwook@main:~$ openssl version -a
OpenSSL 1.0.1 14 Mar 2012
AWS EC2 에서 대응하는 방법
Amazon Linux에서 아래의 명령 후 서비스 restart
sudo yum clean all
sudo yum update OpenSSL
ELB에서 SSL termination을 사용하는 경우 취약점이 여전히 있음. 관련 이슈는 아래의 링크들에서..
- is AWS Elastic Load Balancing affected by the HeartBleed BUG
- Heartbleed Load Balancer Vulnerability CVE-2014-0160
Ubuntu 에서 대응하는 방법
http://www.ubuntu.com/usn/usn-2165-1/
sudo apt-get update
sudo apt-get upgrade
또는
sudo apt-get update
sudo apt-get install libssl1.0.0
Node.js 에서 대응
- Node.js v0.10.2 이상, v0.8 이라면 취약성 없음.
- OPENSSL_NO_HEARTBEATS 이 설정된 상태로 heartbeat기능이 disable 상태.
- https://twitter.com/nodejs/status/453298698714230784
- https://github.com/joyent/node/commit/28c6e42e
- “의도하지 않은 보안 기능”이라는 댓글이 인상깊다.