← 목록으로

CVE-2017-0144 (EternalBlue): WannaCry를 전 세계로 퍼뜨린 SMB 취약점

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

취약점 개요

패치 분석

MS17-010 패치는 srv.sys의 FEA 크기 변환 경로에 입력 크기 필드에 대한 명시적 상한/일관성 검증을 추가하는 방식으로 이뤄졌다. 공개된 분석 자료를 바탕으로 재구성한 핵심 로직은 다음과 같다.

1) SrvOs2FeaListSizeToNt() — 변환 크기 계산의 정수 처리 오류

Before

// OS/2 FEA 리스트를 순회하며 NT 포맷 기준 필요한 총 크기를 누적 계산
ULONG SrvOs2FeaListSizeToNt(FEALIST *os2FeaList) {
    ULONG ntSize = 0;
    PFEA fea = os2FeaList->list;
    while (/* 리스트 순회 조건 */) {
        // NameLength, ValueLength는 클라이언트가 보낸 필드
        ntSize += sizeof(FEA) + fea->NameLength + fea->ValueLength + 1;
        fea = NEXT(fea);
    }
    return ntSize;   // 이 값을 기준으로 이후 버퍼가 할당됨
}

NameLength/ValueLength는 네트워크로 전달된 Trans2 요청의 필드값이라 클라이언트가 임의로 조작할 수 있다. 특정 조합(오버플로우를 유발하는 큰 값들의 합)을 넣으면 ntSize 계산 자체가 실제 데이터 크기보다 작은 값으로 wrap — 정수 오버플로우가 일어난다.

2) 변환 버퍼 할당과 실제 복사의 불일치

Before

buffer = ExAllocatePoolWithTag(NonPagedPool, ntSize, TAG);  // 과소 계산된 ntSize로 할당
Os2FeaListToNt(os2FeaList, buffer);  // 원본 FEA 데이터를 buffer에 복사 — 실제 크기 기준으로 씀

할당은 (오버플로우로 왜곡된) ntSize 기준, 복사는 원본 데이터의 실제 길이 기준으로 이뤄지며 할당된 커널 풀 청크 경계를 넘어 인접 풀 메모리를 덮어쓴다.

After (MS17-010)

ULONG SrvOs2FeaListSizeToNt(FEALIST *os2FeaList) {
    ULONGLONG ntSize64 = 0;   // 64비트로 누적해 오버플로우 여부를 별도 확인
    ...
    ntSize64 += (ULONGLONG)fea->NameLength + fea->ValueLength + sizeof(FEA) + 1;
    if (ntSize64 > MAXULONG || ntSize64 > MAX_ALLOWED_FEA_SIZE) {
        return STATUS_INVALID_PARAMETER;  // 명시적으로 거부
    }
    ...
}

계산을 더 넓은 정수 폭(64비트)으로 수행해 wrap 여부를 사전에 감지하고, 상한값을 넘으면 요청 자체를 거부하도록 검증이 추가됐다.

재현 결과 (공격 흐름)

  1. 공격자가 445번 포트로 SMBv1 연결을 맺고, 조작된 NameLength/ValueLength 조합을 담은 Trans2 FEA 리스트 요청 전송
  2. 커널이 왜곡된 ntSize로 과소 할당된 버퍼를 준비, 이어지는 변환 루틴이 실제 데이터 크기만큼 복사하며 인접 커널 풀 오버플로우 발생
  3. 사전에 별도 요청들로 커널 풀 레이아웃을 원하는 배치로 조작(heap grooming)해뒀기 때문에, 오버플로우가 정확히 원하는 커널 구조체(함수 포인터 등)를 덮어씀
  4. 실행 흐름이 공격자 셸코드로 전환 — 커널 모드에서 실행되므로 즉시 SYSTEM 권한
  5. WannaCry/NotPetya는 이 지점에 자가 전파형 웜 페이로드를 심어 전 세계로 확산됨 — 세부 익스플로잇 코드는 이미 공개적으로 잘 알려져 있어 흐름만 정리한다

영향 및 체이닝

참고자료

CVE 분석 카테고리의 글 (4/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-2014-0160 (Heartbleed): OpenSSL 하트비트가 새어나간 메모리 CVE-2021-34527 (PrintNightmare): 프린터 드라이버 관리 기능이 만든 권한 상승 →