하트블리드와 오픈소스

4월의 일이니까 한참 지난 얘기지만, 그래도 한 번 쯤 정리하고 넘어가야 할 것 같다. 하트블리드 얘기 말이다. 처음에는 너무나 간단해서 누구도 눈치채지 못했던.
그러니까 올해 상반기 세계를 떠들석하게 했던 이 보안 오류는 기술이 세계를 지배한 21세기형 ‘공유지의 비극’이라고 할 만 했다. 2014년 4월1일, 핀란드의 작은 보안회사 코데노미콘은 세계에서 가장 널리 쓰이는 보안 기술인 OpenSSL에 심각한 결함이 있다고 발표했다. 마치 만우절 장난처럼 보였다. 그도 그럴 것이 OpenSSL은 구글과 페이스북 같은 세계 최대 인터넷 기업들부터 은행과 보험사 같은 금융회사까지 보편적으로 사용했던 세계에서 가장 널리 쓰이던 보안 기술이었기 때문이다.

OpenSSL의 원리는 간단하다. 인터넷을 통해 오가는 모든 정보를 암호로 바꿔놓는 것이다. 예를 들어 보내는 쪽이 “1234”라는 문자를 보내려 한다면 이를 1234 대신 4567로 보내는 식이다. 그러면 받는 쪽은 받은 숫자 각각에서 3을 빼라는 암호해독 키를 갖고 이를 1234라고 해석한다. 실제 작동 방식은 이보다 훨씬 복잡하지만, 대충 말하자면 원리는 이렇다. 그런데 문제는 이런 문자를 주고받지 않을 때다. 예를 들어 사용자가 은행 사이트에 접속해 아무 것도 입력하지 않아도 은행은 계속 접속상태를 확인해야 한다. 그래야 5분 동안 아무 입력이 없다는 걸 확인해 접속을 종료할 수도 있고, 사용자가 잠시 다른 일을 하다가 돌아와서 전에 하던 일을 이어서 해도 이게 새 접속이 아니라 기존 일의 연장이란 걸 파악할 수 있다. 이 때 사용하던 기술이 ‘하트비트’(Heart Beat), 즉 심장박동이란 기술이다. 일단 연결된 사용자 컴퓨터와 웹사이트 서버는 사용자의 입력없이도 끊임없이 서로 아주 적은 양의 문자를 주고받으며 접속 여부를 확인하는 것이다.

보통은 서버가 몇 글자 정도를 요구한다. “아직 접속중이라면 ‘ABC’라는 문자 세개를 나한테 보내봐”라는 식이다. 하트블리드는 이 과정에서 생긴 버그다. 즉 “ABC라는 문자 세개를 보내봐”라는 말 대신 “1234라는 문자 ‘500개’를 보내봐”라고 잘못된 명령을 하는 것이다. 그러면 서버는 통신을 유지하기 위해 3개의 문자만 보내면 되는데도 바보처럼 4번째부터 500번째까지의 문자 497개를 더 보낸다. 아무 거나. 그러다보니 이 뒤에 괜히 더 보내는 문자 속에 사용자가 입력한 암호, 신용카드 정보, 대화창에 입력한 비밀대화 등이 끼어 있을 수 있다.

애초에 이 버그가 생긴 건 2011년 12월31일밤 11시59분. 그리고 세상에 공개된 건 2014년 4월1일이다. 만 2년 3개월 이상 이 버그가 유지됐던 셈이니 문제는 심각했다. 피해대상도 광범위했다. 페이스북, 구글, 야후가 자신들의 OpenSSL 취약점을 인정했고, 안드로이드 운영체제(OS) 4.1 이하 버전을 사용하는 구형 스마트폰도 위험에 빠졌다. 또한 수많은 금융회사의 온라인 서비스도 그대로 정보유출 위험에 노출돼 있음을 인정할 수밖에 없었다.

심지어 이렇게 피해를 입은 서버 가운데 상당수가 공신력 있다는 인증기관에서 안전한 서비스로 인증 받은 서버였다. 보안업계에서는 이런 안전 인증을 받은 서버 가운데 약 17%(약 50만대)가 위험에 노출됐다고 추정한다. 한마디로 역사상 최악의 보안 사고였던 셈이다. 하지만 이 폭풍을 피해갔던 서비스도 있는데, 서버가 어떤 운영체제를 사용하느냐에 따라 희비가 갈렸다.

대표적으로 애플은 하트블리드 사태의 영향을 거의 받지 않았다. 애플은 4월10일 자신들의 서비스가 안전하다고 공언했다. 2012년부터 OpenSSL이 불안정하다며 사용하지 않았기 때문이다. 누구나 무료로 사용할 수 있던 공개 소프트웨어였던 OpenSSL을 쓰지 않겠다며 거부한 애플을 두고 개발자들은 “역시 애플은 폐쇄적인 회사”, “자신들이 모든 걸 통제하려 든다” 등의 비난을 쏟아냈다. 하지만 결과적으로는 애플이 옳았다. 애플은 자신들의 OSX 운영체제를 쓰는 서버와 iOS를 쓰는 모바일 기기에서 이미 OpenSSL을 걷어낸 바 있었다. 이동이 제한적인 구역에 전염병 확산이 일어나지 않는 원리처럼 애플은 위협을 비껴갔다. 마이크로소프트의 윈도 운영체제를 쓰는 서버도 괜찮았다. 윈도 운영체제를 쓰는 서버는 OpenSSL을 쓰지 않고 마이크로소프트가 만든 자체 암호화 기술을 쓰기 때문이었다.

하트블리드는 일찌기 겪지 못했던 엄청난 보안 위협이었다. 그런데 너무나도 단순한 실수, 즉 해당 소프트웨어 작성자가 요구되는 문자길이를 제대로 확인하는 과정을 빼먹었다는 실수가 불러 일으킨 재앙이었다는 게 사람들을 더 놀라게 만들었다. 이는 마치 댐을 관리하는 직원이 실수로 수문을 열어 아랫마을이 밤새 물에 잠기는 사고가 일어난 것과 비슷한 지경이었다. 이 때문에 과연 이것이 단순한 실수에 불과했겠느냐는 음모론이 돌기 시작했다.

특히 문제가 된 건 광범위한 민간인 사찰을 통해 전 세계의 인터넷망을 감시해 왔다고 비난받은 미 국가안보국(NSA)이었다. 언론은 NSA에게 하트블리드 버그를 알고 있었느냐, 이를 통해 개인정보를 수집한 일이 있느냐고 질문했고 NSA는 아무런 코멘트도 하지 않았다.

하트블리드 문제는 해결 가능했다. 많은 기업들이 이미 하트블리드 문제를 해결한 상태다. 개인들로서도 우려할 일이 그렇게 크지는 않다. 하지만 정작 끔찍한 건 그동안 유출됐을 잠재적 정보다. 무려 2년 3개월의 기간 동안 얼마나 많은 정보가 누구에게 어떻게 유출됐는지 거꾸로 추적하는 게 불가능하다는 것, 이 점이 하트블리드가 재앙이라고 일컬어지는 가장 큰 이유다. 과연 정보 수집에 혈안이 된 모든 기관은 이 정보 유출 사고를 어떻게 보고 있었을까.

이와 별도로 무엇보다 하트블리드 사태는 ‘오픈소스’에 대한 의문을 남겼다. 오픈소스, 즉 공개 소프트웨어는 프로그램을 만드는 핵심 소스코드를 일반인에게 공개한다. 누구나 기여하고, 누구나 수정하는 일종의 ‘소프트웨어 위키피디아’인 셈이다. 위키피디아가 브리타니카 백과사전보다 정확성에 앞선다는 평가를 받는 것처럼 오픈소스 소프트웨어도 대기업이 개발한 소프트웨어보다 더 정밀하리라는 게 세상의 통념이었다. 그러니까 여럿이 함께 만들면 여럿이 함께 검토하기 때문에 버그도 없을 거라는 생각 말이다. 심지어 이런 믿음은 라이너스의 법칙(Linus’s Law), 그러니까 대표적인 오픈소스 소프트웨어로 유명한 리눅스의 개발자 라이너스 토발즈의 이름을 딴 법칙이란 이름으로 지지돼 왔다. 라이너스의 법칙은 “충분히 많은 사람이 주의깊게 지켜본다면 버그란 아주 사소한 문제일 뿐”(Given enough eyeballs, all bugs are shallow.)이라는 얘기였다. 그리고 라이너스의 법칙은 이번에 어긋나도 아주 심하게 어긋났다. 블랙스완이 발견된 셈이랄까.

논란이 들끓었다. 오픈소스는 필연적으로 인기 있는 주제로만 사람들을 모으기 때문에, 암호화 관리처럼 재미없고 복잡한 부분에는 자발적인 참여자가 줄어서 이런 버그가 나올 수밖에 없는 운명이었다는 비관론자들의 주장이 힘을 얻었다. 이들은 또한 개인에게 책임을 부여하는 기업과 달리 책임을 부여하지 않는 오픈소스는 꼼꼼한 관리가 어렵다고 주장했다.

하지만 여전히 기업이 만드는 상용 소프트웨어의 버그도 끊이지 않고, 대부분의 오픈소스 소프트웨어는 매력적인 가격(무료)과 빠른 업데이트, 최신 기술의 선도적인 적용 등의 장점을 잃지 않고 있다. 즉, 하트블리드는 뭔가를 결론내거나 끝을 보게 한 게 아니다. 대신 하트블리드는 기술이 지배하는 세상에 큰 질문 몇 가지를 남겼다.

첫째, 인터넷은 과연 안전한가?

둘째, 인터넷의 약점을 이용하는 세력이 나타난다면 우리는 그들을 어떻게 통제할 것인가.

셋째, 인터넷은 과연 대중의 지혜와 집단지성을 발휘하도록 돕는 도구가 될 수 있는가?

답은 없다. 하지만 우리에겐 이제 답을 찾아야만 할 이유가 생겼다. 이는 분명 새롭게 대두된 위협이고, 우리는 위협의 시작을 알게 됐으니까. 하트블리드가 그냥 한 차례 스쳐 지나가는 사고만은 아닌 이유다.

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 / 변경 )

%s에 연결하는 중