← 목록으로

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

[CVE] CVE 분석 · 작성: 2026-07-19 19:39:08 · 수정: 2026-07-21 23:17:42 · 조회 21

취약점 개요

패치 분석

패치(t1_lib.c, d1_both.c*_process_heartbeat())는 딱 한 지점 — "클라이언트가 주장하는 payload 길이"와 "실제 수신한 레코드 전체 길이"를 비교하는 검증을 추가하는 것으로 요약된다.

1) tls1_process_heartbeat() — 길이 검증 부재

Before (1.0.1f 이하)

hbtype = *p++;
n2s(p, payload);           // 클라이언트가 보낸 길이 필드를 그대로 읽음
pl = p;
// ↓ payload가 실제 수신 데이터 크기보다 커도 여기서 걸러지지 않음
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
bp = buffer;
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);    // pl 뒤의 인접 힙 메모리까지 그대로 복사됨

After (1.0.1g)

hbtype = *p++;
n2s(p, payload);
// 추가된 검증: 클라이언트가 주장한 payload가 실제 수신 레코드 길이(s->s3->rrec.length)를
// 초과하면 즉시 무시하고 응답하지 않는다
if (1 + 2 + 16 > s->s3->rrec.length) return 0;
hbtype = *p++;
n2s(p, payload);
if (payload + padding > s->s3->rrec.length) return 0;  // 핵심 한 줄
pl = p;
buffer = OPENSSL_malloc(1 + 2 + payload + padding);
...
memcpy(bp, pl, payload);

payload + padding > s->s3->rrec.length 검사 한 줄이, "클라이언트가 주장하는 길이"가 "실제로 받은 바이트 수"를 넘어설 수 없도록 강제한다. 이 검증이 없던 시절에는 memcpypl 포인터 뒤에 물리적으로 이어진 힙 메모리를 최대 64KB까지 그대로 읽어 응답에 담아 보냈다.

재현 결과 (공격 흐름)

  1. 정상 TLS 핸드셰이크 수립(인증서 검증 불필요, 암호화 채널만 있으면 됨)
  2. Heartbeat 레코드에 type=1(request), 실제 payload는 1바이트만 담고 길이 필드에는 0xFFFF를 기록해 전송
  3. 패치 전 서버는 이 필드를 그대로 신뢰 → memcpy(bp, pl, 65535) 실행, 힙에서 pl 뒤에 이어지는 최대 64KB가 응답에 그대로 담겨 반환
  4. 이 요청을 반복하며 매번 다른 힙 스냅샷을 수집 — 개인키 조각, 세션 토큰, 평문 크리덴셜을 정규식으로 걸러냄

영향 및 체이닝

참고자료

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 취약점 →