Offcanvas

How To / 보안 / 악성코드 / 애플리케이션 / 오픈소스 / 인문학|교양

한 줄 코드가 낳았던 보안 위기··· 허트블리드 버그 A to Z

2022.09.08 Josh Fruhlinger  |  CSO
2014년 4월에 선보인 OpenSSL의 취약성 허트블리드(Heartbleed)는 야후(Yahoo) 같은 주요 사이트를 구동하는 수천 개의 웹 서버에 존재했다. OpenSSL은 ‘TLS & SSL 프로토콜’을 구현하는 오픈소스 코드 라이브러리이다. 이 취약성 때문에 악의적인 공격자가 취약한 웹 서버를 손쉽게 속여 사용자 이름과 비밀번호 등의 민감한 정보를 전송하도록 할 수 있었다.

이 결함은 TLS/SSL 표준 자체보다 OpenSSL 구현에 있었지만 문제는 OpenSSL이 너무 광범위하게 사용되고 있다는 점이다(버그가 공개되었을 때, 전체 SSL 서버의 17%가 영향을 받았다).
 
Image Credit : Getty Images Bank


허트블리드를 허트블리드라 부르는 이유?
‘허트블리드’라는 이름은 TLS/SSL 프로토콜의 중요한 구성요소의 이름인 ‘heartbeat’에서 유래했다. ‘heartbeat’는 사용자가 다운로드 또는 업로드를 하지 않고 있는 순간에 서로 통신하는 2개의 컴퓨터가 여전히 연결되어 있음을 서로에게 알려주는 방식이다. 때로는 두 컴퓨터 중 하나가 다른 컴퓨터에게 ‘heartbeat request’라는 암호화된 데이터를 전송한다. 두번째 컴퓨터는 정확히 동일한 암호화된 데이터로 응답하여 연결되어 있음을 증명한다.

허트블리드 취약성은 공격자가 ‘heartbeat request’를 사용하여 대상 서버로부터 정보를 추출할 수 있기 때문에 이름이 붙여졌다. 은유적으로 표현하자면, 피해자는 ‘heartbeat request’를 통해 민감한 데이터를 유출(bleed)한다.

허트블리드는 어떻게 작동하는가?
허트블리드는 민감한 사실 하나에 기반한다. ‘heartbeat request’에는 자체 길이에 대한 정보가 포함되어 있지만 취약한 버전의 OpenSSL 라이브러리는 정보가 정확한지 확인하지 않으며 공격자는 이를 활용해 대상 서버가 비공개로 유지되어야 하는 메모리 부분에 대한 공격자의 액세스를 허용하도록 속일 수 있다. 그 이면의 메커니즘을 이해하기 위해 전형적인 OpenSSL 사례를 살펴보면 다음과 같다. 

야후 메일을 읽고 있지만 추가적인 정보를 로딩하기 위해 아무런 동작도 하지 않았다고 생각해보자. 웹 브라우저는 야후의 서버가 여전히 활성 상태로 응답하고 있는지 확인하고 싶기 때문에 기본적으로 다음과 같은 메시지를 전송한다. “곧 40KB 메시지를 받게 될 것이다. 이것을 나에게 재전송하라.”

이것이 우리가 앞서 논의한 ‘heartbeat request’이다. ‘heartbeat request’는 크기가 가변적일 수 있으며(최대 64KB), 각 요청은 특정 길이에 대한 정보를 포함해야 한다.

야후의 서버가 이 메시지를 수신하면 메모리 버퍼(정보를 저장할 수 있는 물리적인 메모리 부분)를 ‘heartbeat request’의 보고된 길이와 같은 크기로 할당한다. 우리의 예에서는 40KB이다. 그리고 서버는 요청의 암호화된 데이터를 메모리 버퍼에 저장한 후 즉시 데이터를 다시 읽어 들이고 웹 브라우저로 재전송한다. 브라우저가 전송한 정보를 재전송 받으면 현 시점까지 통신하고 있던 서버와 여전히 연결되어 있음을 확인할 수 있다.

허트블리드 취약성은 OpenSSL의 ‘heartbeat’ 기능 구현에 중요한 안전 조치가 누락되어 있었기 때문에 발생했다. ‘heartbeat request’를 수신한 컴퓨터가 요청의 길이가 실제로 정확한지 절대로 확인하지 않았다. 그래서 요청에서 40KB 길이라고 이야기하지만 실제로는 20KB 밖에 되지 않는 경우 수신하는 컴퓨터는 40KB의 메모리 버퍼를 할당하고 실제로 수신한 20KB를 저장한 후 20KB와 함께 메모리의 다음 20KB에 있는 것을 재전송한다. 

그 20KB에는 온갖 것들이 있을 수 있다. 왜냐하면 컴퓨터가 정보 처리를 끝냈더라도 다른 것으로 덮어쓸 때까지는 해당 데이터가 여전히 메모리 버퍼 안에 존재한다. 추가적인 20KB의 데이터는 공격자가 웹 서버로부터 새롭게 추출한 정보가 되는 셈이다.

허트블리드가 위험한 이유는 무엇인가?
허트블리드는 공격자가 민감한 정보가 포함되어 있을 수 있는 메모리 버퍼의 내용을 확인할 수 있기 때문에 위험하다. 솔직히, 공격자 입장에서는 서버에서 탈취한 그 20KB에 어떤 것이 숨어 있을지 미리 알 수 없지만 다양한 가능성이 있다. 횡설수설하거나 쓸모없는 쓰레기일 수 있다. 정말로 운이 좋다면 해당 서버에 대한 보안 통신의 복호화를 허용하는 SSL 비공개 키를 얻을 수 있다. 가능성은 낮지만 공격자에게는 성배가 될 것이다. 일반적으로 서버에서 구동하는 애플리케이션과 서비스로 제출된 사용자 이름과 비밀번호를 얻을 수 있으며, 이를 통해 앱에 로그인하여 사용자 계정에 액세스할 수 있다.

랜달 먼로의 웹툰 xkcd는 특히 먼로의 전문 분야인 컴퓨터 공학 부문의 어려운 과학적 개념을 쉽게 설명하는 것으로 유명하다. 2014년의 이 xkcd 만화에서는 허트블리드 취약성이 어떻게 작용하는지 간결하게 요약하고 있다. 

허트블리드는 어떻게 발견되었는가?
허트블리드는 독립적으로 활동하는 2개의 그룹이 전혀 다른 방식으로 발견했다. 하나는 OpenSSL의 오픈소스 코드베이스의 검토 과정이었고, 다른 하나는 OpenSSL을 구동하는 서버에 대한 일련의 시뮬레이션 공격 과정에서였다. 두 그룹은 불과 몇 주 차이로 이 취약성을 발견했다. 이 취약성이 2년 동안 감지되지 않고 숨어 있었다는 점을 감안하면 우연적인 결과다.

구글에 근무하는 엔지니어 닐 메타가 2014년 3월 처음으로 허트블리드를 발견했다. 메타는 OpenSSL 코드에 대한 라인별 감사를 수행하기로 결정했다. 왜냐하면 해당 연도 초에 발견된 2건의 SSL 결함인 goto fail과 GnuTLS 때문에 SSL/TLS 생태계의 다른 곳에 다른 위험이 숨어 있을 수 있다고 의심하게 됐다. 

그가 이 버그를 찾아내고 구현을 실현한 후 구글은 공개적으로 발표하거나 미 정부에게 알리지 않았지만 클라우드플레어(CloudFlare) 같은 일부 인프라 기업들에게 이에 관해 비밀스럽게 알리기 시작했다.

두번째 발견은 몇 주 후 핀란드의 사이버 보안 기업 코드노미콘(Codenomicon)에서 이뤄졌다. 해당 기업은 암호화 및 인증 툴링에 대한 침투 테스트를 위해 설계된 세이프가드(Safeguard)라는 제품을 개발하고 있었다. 스스로의 개먹이를 먹는 장엄한 기술 산업 전통 속에서 코드노미콘은 자체 인프라에서 세이프가드를 테스트하기로 결정했고 충격적인 양의 데이터에 액세스할 수 있음을 발견했다.

코드노미콘은 구글과 꽤 다른 조치를 취했다. 발견사항을 공개할 뿐 아니라 이를 브랜드화 했다. 허트블리드라는 이름을 붙였고 심지어 로고도 디자인했다. 이것은 보안 기업이 취약성 발견을 마케팅 기회로 삼은 초기 사례이기도 하다.

허트블리드 CVE
CVE 시스템에서 허트블리드의 식별자는 CVE-2014-0160이며, 이 링크를 따라가면 버그에 관한 많은 정보를 얻을 수 있다. 

허트블리드 코드
한 줄의 코드에 실수가 포함되어 있어 허트블리드 취약성이 등장했다.

memcpy()는 데이터를 복사하는 명령이다. bp는 이를 복사하는 위치이다, pl은 복사를 하는 출처이며 payload는 복사되는 데이터의 길이이다. 언급했듯이 문제는 pl의 데이터의 양이 payload의 주어진 값과 같은지 절대로 확인하려 시도하지 않았다는 것이다.

여기에서 가장 아이러니한 점은 OpenSSL이 오픈소스 소프트웨어라는 점이다. 누구든 코드를 들여다볼 수 있었지만 메타와 코드노미콘 팀이 우연히 발견할 때까지 아무도 이런 꽤 기본적인 코딩 오류를 알아차리지 못했다. 

허트블리드 익스플로잇 공격: 누가 허트블리드의 영향을 받는가?
허트블리드 취약성에 대한 실질적인 익스플로잇 공격이 있었지만 버그가 널리 공개되기 전에 발생했는지 여부는 확실하지 않다. 2013년경에 보안 기업들이 감지한 일부 공격에서 이 취약성을 찾고 있었을 수 있으며, 일각에서는 공격자들이 정부 보안 기관이었다고 생각하고 있다.

코드노미콘이 취약성을 공개한 2014년 4월 이후, 기업들이 시스템을 업데이트하느라 분투하면서 많은 활동과 일정량의 혼란이 있었다. 예를 들어, 야후와 OK큐피드(OKCupid)의 사용자들은 이 서비스들이 OpenSSL의 설치를 패치 할 때까지 계정에 로그인하지 말고 액세스를 다시 획득하면 비밀번호를 변경하라는 안내를 받았다.

이런 대기업들은 나쁜 일이 닥치기 전에 만반의 준비를 갖출 수 있었지만 해커들은 여러 사례에서 취약점을 악용할 수 있었다. 환자 데이터를 훔친 CHS(Community Health Systems)에 대한 공격도 CRA(Canadian Revenue Agency)에서 수백 개의 소셜 ID 번호가 도난당한 것과 마찬가지로 허트블리드가 원인이었다.

비용
허트블리드의 비용은 이런 성공적인 공격으로 인해 발생한 피해 이상의 수준이었다. 시큐리티 매거진(Security Magazine)은 SSL 인증을 폐지하고 대체해야 하는 수천 개의 조직의 비용이 최대 500억 달러에 달할 수 있을 것으로 추산했다. 그리고 시스템 점검 및 업데이트에 필요한 근로 시간이 증가하고 이 취약성과 직접 관련된 지출이 크게 증가한다.

허트블리드 픽스(Fix)
허트블리드 픽스는 2014년 4월 8일 공개된 OpenSSL 라이브러리의 1.0.1g 버전에서 제공되었으며, 이후의 모든 소프트웨어 버전에도 포함되었다. OpenSSL을 최신 버전으로 업그레이드하여 허트블리드 취약성을 해결할 수 있고 모든 최신 코드에 대한 링크는 OpenSSL 웹 사이트에서 확인할 수 있다.

/* Read type and payload length first */
if (1 + 2 + 16 > s->s3->relent)
return 0;
/* silently discard */
hbtype = *p++;
n2s(p, payload);
if (1 + 2 + payload + 16 > s->s3->rrec.length)
return 0;
/* silently discard per RFC 6520 sec. 4 */
pl = p;


픽스를 구현하는 코드에 대해 궁금하다면 살펴볼 수 있다. 어쨌든 OpenSSL은 오픈소스다. 이 코드의 첫번째 부분은 ‘heartbeat reques’t가 문제를 유발할 수 있는 0KB가 아닌지 확인한다. 두번째 부분은 길이가 요청한 대로인지 확인한다.

허트블리드는 여전히 문제인가?
허트블리드는 8년 전에 발견되어 패치 되었기 때문에 많은 서버들이 여전히 허트블리드 취약성을 숨기고 있다는 사실이 놀라울 수 있겠다. 사실, SANS ISC(Internet Storm Center)의 연구원에 따르면 2020년 11월에 20만 개가 온라인 상태였다. 그 이후로 수치가 조금 감소했을 수는 있지만 여전히 다수의 취약한 서버가 언제 해킹될지 모르는 상황이다. 

숙련된 보안 전문가는 이런 사실에 그리 놀라지 않을 것이다. 기업들은 백업 없이 업무에 필수적인 시스템의 다운타임을 피하기 위해 또는 단순히 방치하면서 패치를 하지 않는 경우가 많다. 하지만 패치 되지 않은 기기의 수는 스스로 탄탄한 패치 관리 프로그램 제공의 중요성에 대한 경종을 울리고 있다.

허트블리드 취약성 테스트: 허트블리드를 감지하는 방법
무료 온라인 도구로 서버를 손쉽게 테스트하여 허트블리드 취약성을 감지할 수 있다. 예를 들어, <pentest-tools.com>은 URL을 입력하여 서버가 허트블리드 및 기타 다수의 취약성에 대해 적절히 패치 되어 있는지 확인할 수 있는 무료 웹 기반 테스트가 있다.

관리하는 서버가 한 동안 취약한 상태로 방치되었음을 발견한 경우 OpenSSL 코드를 업데이트하는 것 외에 할 일이 있다. 예를 들어, 서버가 사용하는 SSL 인증서가 흔적 없이 해킹되었을 수 있기 때문에 변경해야 한다. 그리고 시스템에 계정이 있는 사용자도 비밀번호를 변경해야 한다. ciokr@idg.co.kr
Sponsored
추천 테크라이브러리

회사명:한국IDG 제호: ITWorld 주소 : 서울시 중구 세종대로 23, 4층 우)04512
등록번호 : 서울 아00743 등록일자 : 2009년 01월 19일

발행인 : 박형미 편집인 : 박재곤 청소년보호책임자 : 한정규
사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2022 International Data Group. All rights reserved.