트렌드

하트블리드 버그, 어찌 대처하오리까

2014.04.16

지난 주 보안회사 코드노믹스가 오픈SSL의 ‘심장출혈(하트블리드)’ 버그를 공개하자 IT업계가 발칵 뒤집혔다.

심장출혈 버그가 뭔가

심장출혈 버그(CVE-2014-0160)는 한마디로 서버와 사용자가 주고받은 데이터를 밖으로 흘려보내는 보안 구멍이다. 오픈SSL에 ‘심장박동(하트비트)’이라는 확장기능을 덧붙이며 생긴 문제다. 심장박동 기능은 서버가 명령에 대답할 수 있는지 주기적으로 확인하는 역할을 한다. 심장출혈 버그를 악용하면 서버의 작동 여부를 확인하면서 서버 메모리에 저장 중인 데이터를 64KB까지 빼돌릴 수 있다. 이해를 돕기 위해 아래 그림을 인용한다.

심장출혈 버그 작동 원리 만화
‘심장출혈’ 버그 작동 원리 (원본 출처 : XKCD CC-NC, 원작자에게 허락 받고 번역해 올립니다. 여기를 누르면 원본 그림으로 이동합니다)

왜 위험한가

심장출혈 버그가 위험한 이유는 무엇일까. 우선 영향을 미치는 범위가 꽤 넓다. SSL은 인터넷에서 주고받는 데이터를 암호화하는데 쓰는 표준 기술이고, 오픈SSL은 이를 오픈소스로 구현한 것이다. 영국 보안업체 넷크래프트 조사에 따르면 2014년 4월 기준으로 전세계 웹사이트 가운데 66%가 오픈SSL을 쓴다고 한다.

심장출혈 버그가 생길 수 있는 곳은 오픈SSL을 쓰는 웹사이트 가운데 17.5%인 50만곳 정도다. 여기에는 구글이나 야후 등 유명 서비스도 포함돼 있다. 은행이나 금융회사도 예외가 아니다. 2012년 3월14일 공개된 1.0.1부터 1.0.1f  사이 버전과 1.0.2 베타 및 1.0.2 베타1 버전 오픈SSL을 사용한 서버는 심장출혈 버그에 시달릴 수 있다.

구글이나 야후 같이 큰 회사는 이 버그를 알자마자 조치를 취했다. 많은 보안업체도 발빠르게 대처하고 있다. 하지만 작은 업체까지 모두 버그를 해결하려면 시간이 꽤 걸릴 것으로 보인다.

서버와 사용자가 주고받는 모든 데이터가 새나갈 수 있다는 점도 큰 문제다. 서버에서 한번에 빼돌릴 수 있는 데이터는 메모리에 남은 64KB뿐이지만, 반복해서 데이터를 빼내면 서버와 사용자 사이에 오가는 모든 데이터를 빼돌릴 수도 있다. 심장출혈 버그를 공개한 코드노믹스는 자체 서비스를 대상으로 이 버그가 얼마나 위험한지 실험했다. 무서운 결과가 나왔다. 코드노믹스는 사용자 이름과 비밀번호, e메일, 문서 등 모든 데이터를 빼돌리는 데 성공했다.

데이터가 SSL 기술로 암호화돼 있다고 하더라도 안심할 수 없다. 데이터를 빼돌리면서 데이터를 암호화하는 데 쓰는 암호키도 손에 넣을 수 있기 때문이다. 해커팀 Node.js 일원인 페도르 인덧니와 일카 마틸라는 심장출혈 버그를 이용해 콘텐츠전송망(CDN) 서비스 클라우드플레어에서 서버 암호키(개인키)를 빼돌리는 데 성공했고 4월11일 밝혔다.

서버 암호키는 호텔 마스터키와 비슷한 역할을 한다. 사용자가 암호화해서 보낸 데이터를 해독하는 데 쓰인다. 서버 암호키를 손에 넣으면 호텔 마스터키를 가진 것처럼 모든 사용자가 보낸 데이터를 훔쳐볼 수도 있다.

데이터가 흘러나갔다는 증거조차 남지 않는다는 점도 심장출혈 버그를 무섭게 만든다. 오픈SSL 심장박동 기능으로 서버 작동 여부를 확인하는 것은 서버에 기록을 남기지 않는다. 따라서 해커가 이 버그를 악용해 얼마나 많은 데이터를 빼돌렸는지 알아낼 길이 없다. 애초에 피해를 입었다는 사실조차 알 수 없다. 이런 특징 때문에 피해 규모를 파악하기도 어렵다고 테크크런치는 지적했다.

왜 생겼나

인터넷 역사상 가장 심각한 취약점으로 불리는 심장출혈 버그는 ‘실수’로 생겼다. 오픈SSL은 오픈소스 형태로 유지·관리된다. 소스코드를 공개해두고 여러 사람이 각자 기능을 개발하고 이를 한데 모아 문제가 없는지 검사한 뒤 내놓는 식이다.

심장출혈 버그를 오픈SSL에 남긴 이는 개발자 로빈 세겔만이다. 로빈 세겔만은 2008년부터 2012년까지 박사 과정을 밟으며 오픈SSL 개발에 힘을 보탰다. 로빈 세겔만은 2011년 12월31일 자정 직전, 오픈SSL 서버의 작동 여부를 주기적으로 확인할 수 있도록 하는 코드를 제출했다. 이른바 ‘심장박동(Heartbeat)’ 기능이다. 로빈 세겔만은 심장박동 기능을 내놓으면서 오류를 제대로 확인하지 않았다고 가디언에 털어놓았다.

“심장출혈 버그는 제 잘못입니다. 코드를 써넣고 필요한 검증절차를 무시한 탓이죠. 불행히도 검사 과정에서도 제 실수는 솎아내지 못했습니다. 그래서 최종 배포 버전까지도 버그를 안게 됐죠.”

간편하게 서버 작동 여부를 확인하려던 확장 기능은 의도와 달리 오픈SSL 심장이 피를 흘리게 만든 치명적인 버그를 남기고 말았다.

해결 방법은 무엇인가

서버 관리자가 문제를 해결하는 방법은 의외로 간단하다. 최신 버전으로 오픈SSL을 판올림하는 것이다.

오픈SSL 개발진은 지난 4월7일 심장출혈 버그를 해결한 오픈SSL 1.0.1g 버전을 내놓았다. 서버에서 쓰는 오픈SSL이 1.0.1 버전부터 1.0.1f 버전 사이라면 심장출혈 버그가 숨겨져 있을 것이다. 서둘러 판올림하는 편이 좋다. 오픈SSL 1.0.0이나 이보다 더 오래된 버전에는 심장박동 기능이 없어 심장출혈 버그에서 안전하다.

심장출혈 버그가 있는 오픈SSL을 쓰지만 당장 판올림하기가 힘들다면, 코드를 손봐 심장박동 기능만 제거해도 된다. 심장출혈 버그를 공개한 코드노믹스는 웹사이트를 따로 꾸려 이 문제를 해결하는 방법을 공유했다.

Codenomicon_Heartbleed_02

오픈SSL말고 다른 암호화 기술을 쓰는 방법도 있다. 오픈SSL은 SSL 기술 가운데 한 종류일 뿐이다. 하드웨어로 SSL 기술을 구현하는 보안업체도 있다. 이런 솔루션을 쓰면 심장출혈 버그에서 안전할 수 있다.

오픈SSL 기술을 응용해 만든 제품에도 같은 문제가 있을 수 있다. 서버뿐 아니라 네트워크 장비, 보안 장비도 문제가 없는지 직접 문의해보는 편이 좋겠다. 많은 회사가 앞다퉈 자사 제품에는 심장출혈 버그가 없다든지, 문제가 있었지만 해결했다고 발표하고 있다.

심장출혈 버그를 도려낸 다음에는 서버 암호키(개인키)를 새로 발급받는 편이 안전하다. 심장출혈 버그가 2년 동안 방치된 탓에 서버 암호키가 새 나가지 않았다고 보장할 수 없기 때문이다.

서버 암호키를 바꿨다면 사용자에게 문제가 있었다는 사실을 솔직히 얘기하고 비밀번호를 바꾸라고 알려야 한다. 서버 암호키를 바꿨다고 해도 일반 사용자가 유출된 비밀번호를 계속 쓴다면 언제고 위험에 처할 수 있다.

한국인터넷진흥원(KISA) 침해대응센터도 자세한 대처법을 공개해뒀으니 참고하자.

일반 사용자는 어떻게 해야 하나

안타까운 일이지만 일반 사용자가 할 수 있는 일은 거의 없다. 심장출혈 버그가 서버 쪽에 생긴 문제이기 때문이다.

당장 비밀번호를 바꾸는 일도 바람직하지 않다. 심장출혈 버그가 여전히 있는 서버에서 비밀번호를 바꾸면 바꾼 비밀번호까지도 노출될 수 있는 탓이다. 구글이나 야후처럼 웹서비스 회사가 먼저 심장출혈 버그를 해결했다거나 문제가 없다는 공지를 띄운 뒤에 비밀번호를 바꿔야 안전하다. 국내 보안업계 관계자는 “자주 쓰는 은행 등 서비스에 버그가 없는지 물어본 뒤, 문제가 없다고 하면 비밀번호를 바꿔야 한다”라고 조언했다. 되도록 다른 웹사이트에서 썼던  비밀번호는 쓰지 말자.

임시방편이지만 문제가 해결될 때까지 은행이나 금융회사 같이 민감한 정보를 다루는 서비스에는 접속하지 않는 것도 방법이다. 해커가 심장출혈 버그를 악용하더라도 서버를 공격하는 것이 아니라 서버가 최근에 했던 작업 가운데 아직 메모리에 남아 있는 일부 데이터만 빼돌릴 수 있기 때문이다.

이미 문제가 있다고 밝혀진 서비스는 재빨리 판올림하는 것도 좋다. 구글은 안드로이드 4.1.1 젤리빈 운영체제(OS)를 쓰는 스마트폰이 심장출혈 버그에 노출돼 있다고 경고했다. 만일 안드로이드 4.1.1 OS를 쓰는 안드로이드폰 사용자라면 OS를 판올림하는 쪽이 좋겠다. 혹시 불안한 사용자는 심장출혈 버그 탐지 앱을 구글플레이에서 내려받아 문제가 있는지를 확인할 수 있다. 애플은 아이폰에 문제가 없다고 발표했다.

하트블리드 버그 디텍터 앱

nuribit@bloter.net

기술의 중심에서 사람을 봅니다. 쉽고 친절하게 쓰겠습니다. e메일 nuribit@bloter.net / 트위터 @nuri_bit / 페이스북 facebook.com/nuribit0