← 목록으로

CVE-2014-0160 (Heartbleed): OpenSSL 하트비트가 새어나간 메모리

[CVE] CVE 분석 · 작성: 2026-07-19 19:39:08 · 조회 4

Heartbleed는 SSL/TLS 구현체로 인터넷 대부분의 암호화 통신에서 쓰이던 OpenSSL 라이브러리에서 발견된 메모리 노출 취약점이다. 2014년 공개 당시 전 세계 웹 서버의 상당수(추정치로 수십만 대 이상)가 영향을 받았고, "심장에서 피가 샌다"는 이름 그대로 서버 메모리에 있던 개인키, 세션 쿠키, 사용자 비밀번호 같은 민감 정보가 그대로 유출될 수 있었다.

Heartbeat 확장 기능이란

TLS의 Heartbeat 확장은 연결이 살아있는지 확인하기 위한 기능이다. 클라이언트가 임의의 데이터와 그 길이를 서버에 보내면, 서버는 같은 데이터를 그대로 돌려보내는 단순한 핑퐁 구조다.

클라이언트 → 서버: "이 데이터(길이: N바이트)를 그대로 돌려줘"
서버 → 클라이언트: (동일한 데이터, N바이트)

근본 원인: 길이 검증 누락

취약한 OpenSSL 코드는 클라이언트가 "길이는 N바이트"라고 주장한 값을 그대로 믿고, 실제로 보낸 데이터의 실제 길이와 대조하지 않았다. 공격자가 실제로는 1바이트짜리 데이터만 보내면서 "이건 64KB짜리 데이터야"라고 주장하면, 서버는 그 1바이트 뒤에 이어지는 서버 프로세스 메모리의 나머지 부분(공격자가 보낸 적 없는 데이터)까지 그대로 응답에 채워서 돌려보냈다.

// 개념적으로 이런 문제였다
memcpy(response_buffer, payload, claimed_length);  // claimed_length를 검증 없이 그대로 사용

이건 전형적인 버퍼 오버리드(over-read) 취약점이다 — 쓰기가 아니라 읽기 방향으로 경계를 넘는다는 점에서 스택 버퍼 오버플로우와는 성격이 다르지만, "길이를 검증하지 않고 신뢰한다"는 근본 원인은 동일한 패턴이다.

왜 이렇게 치명적이었나

한 번의 요청으로 서버 메모리의 최대 64KB를 읽어갈 수 있었고, 이 요청을 반복하면 서버 프로세스 메모리를 계속 다른 조각으로 훑어볼 수 있었다. 서버 프로세스 메모리에는 그 시점에 처리 중이던 다른 사용자의 세션 쿠키, 로그인 정보, 심지어 서버의 TLS 개인키(private key) 조각까지 우연히 포함될 수 있었다. TLS 개인키가 유출되면 그 인증서로 이루어지는 모든 통신을 사후에 복호화하거나, 해당 서버를 완벽하게 사칭하는 것까지 가능해진다 — 단순 정보 유출을 넘어 신뢰 체계 자체가 무너지는 결과다.

특히 무서웠던 지점

패치와 대응

  1. OpenSSL 버전 업그레이드 (1.0.1g 이상으로) — 실제 전송된 데이터 길이와 주장된 길이를 대조하는 검증 로직 추가
  2. TLS 인증서 재발급: 개인키가 유출됐을 가능성을 배제할 수 없으므로, 영향받은 모든 서버의 인증서를 폐기하고 새로 발급
  3. 모든 사용자 세션/비밀번호 재설정: 유출 가능성이 있는 세션 토큰을 전부 무효화

이 사건이 남긴 교훈

CVE 분석 카테고리의 글 (3/8)

  1. CVE-2024-3400: Palo Alto PAN-OS GlobalProtect 원격 코드 실행
  2. CVE-2021-44228 (Log4Shell): 로그 한 줄로 서버를 장악당한 사건
  3. CVE-2014-0160 (Heartbleed): OpenSSL 하트비트가 새어나간 메모리
  4. CVE-2017-0144 (EternalBlue): WannaCry를 전 세계로 퍼뜨린 SMB 취약점
  5. CVE-2021-34527 (PrintNightmare): 프린터 드라이버 관리 기능이 만든 권한 상승
  6. CVE-2022-0847 (Dirty Pipe): 파이프로 읽기전용 파일을 덮어쓴 취약점
  7. CVE-2021-3156 (Sudo Baron Samedit): 힙 오버플로우로 root 획득
  8. CVE-2022-22965 (Spring4Shell): 클래스 로더 조작으로 이어지는 RCE
← CVE-2021-44228 (Log4Shell): 로그 한 줄로 서버를 장악당한 사건 CVE-2017-0144 (EternalBlue): WannaCry를 전 세계로 퍼뜨린 SMB 취약점 →