CVE-2026-86509 (D-Link DIR-895L udhcp 스택 버퍼 오버플로) 분석

분류: CVE · 임베디드·네트워크 · 스택 버퍼 오버플로 · CVE-2026-86509 · [표준]

인증 없이, 같은 네트워크에 붙어 있기만 하면 라우터의 DHCP 서버를 스택 오버플로로 무너뜨릴 수 있는 취약점입니다. 문제의 코드는 표준 DHCP 파싱이 아니라 D-Link가 관리용으로 덧붙인 TR-111 Option 125 처리부에 있습니다. 그리고 대상 기기는 이미 지원이 끝난(EOL) 제품이라 고쳐줄 패치가 나오지 않습니다 — 그래서 이 글은 “언제 고쳐지나”가 아니라 “왜 이런 자리에서 같은 버그가 반복되나”에 관한 기록입니다.


리드 — 임베디드 라우터의 취약점은 대부분 “표준 프로토콜 자체”가 아니라 벤더가 표준 위에 덧댄 관리·확장 코드에서 납니다. 잘 검증된 오픈소스 데몬을 가져다 쓰더라도, 그 위에 자체 기능(원격관리·프로비저닝·통계)을 손으로 이어붙이는 순간 검증이 얇아진 새 코드 경로가 생기기 때문입니다. CVE-2026-86509는 그 교과서 같은 사례입니다 — 검증된 udhcp DHCP 데몬 골격에 D-Link가 붙인 TR-111 Option 125 파싱 한 조각에서, 길이 검사 없이 스택 버퍼로 복사가 일어납니다.


개요

CVE-2026-86509는 D-Link DIR-895L(AC5300 무선 라우터)의 펌웨어 A1_102b07에 존재하는 스택 기반 버퍼 오버플로입니다(CWE-121). 라우터에 내장된 udhcp 계열 DHCP 서버 데몬의 sendOffer / sendACK 경로에서, TR-111 DHCP Option 125를 파싱할 때 필드 길이를 검증하지 않고 고정 크기 스택 버퍼로 복사하는 것이 원인으로 보고되어 있습니다.

핵심 성질은 세 가지입니다.

  • 무인증(pre-auth). 인증이 필요 없습니다(CVSS PR:N). 로그인 상태가 아니어도 트리거됩니다.
  • 인접/로컬 네트워크 한정. 인터넷 너머 원격 공격은 불가능하고, 공격자가 같은 LAN 세그먼트 안에 있어야 합니다(CVSS AV:A). DHCP는 브로드캐스트 기반 프로토콜이라 라우팅 경계를 넘지 못하기 때문입니다.
  • 임팩트. 스택 오버플로이므로 최소한 데몬 크래시(서비스 거부)이고, 조건이 맞으면 임의 코드 실행까지 이어질 수 있습니다. CVSS 벡터의 Scope Changed(S:C)는 DHCP 데몬을 넘어 라우터 전반으로 영향이 번질 수 있음을 반영합니다.

공개된 CVSS는 3.1 기준 9.6(Critical), 4.0 기준 9.4(Critical) 로 집계됩니다 분석: CVSS 4.0 점수는 일부 집계처가 8.6으로도 표기 — ⚠️미확인(팩트체크 대상). 취약점은 2026-09-08에 공개되었고, 보고자는 핸들 “tian”(tzh00203), 할당 CNA는 VulDB입니다.

한 줄 요약 — 같은 네트워크의 무인증 공격자가, D-Link 자체 확장인 TR-111 Option 125 필드에 과대 길이를 실어 DHCP 요청을 보내면, 검증 없는 스택 복사로 라우터 DHCP 데몬을 넘어뜨립니다. EOL 제품이라 벤더 패치는 없습니다.


기술 배경

DHCP와 udhcp. DHCP(Dynamic Host Configuration Protocol)는 네트워크에 새로 붙은 기기에 IP 주소 등을 나눠주는 프로토콜입니다. 요청·응답은 여러 개의 “옵션(option)” 필드로 구성되는데, 각 옵션은 [코드][길이][값] 구조입니다. udhcp는 임베디드 리눅스에서 널리 쓰이는 경량 DHCP 구현으로, DIR-895L의 서버 데몬도 이 계열을 포크한 것입니다. sendOffer(DHCP OFFER 전송)와 sendACK(DHCP ACK 전송)는 서버가 클라이언트에 응답을 만들어 보내는 함수입니다.

TR-111 Option 125. Option 125는 “Vendor-Identifying Vendor-Specific Information” 옵션으로, 벤더가 자체 정보를 실어 나르는 통로입니다. TR-069/TR-111 계열의 원격관리 표준은 이 옵션을 프로비저닝·기기 식별에 활용합니다. 문제는 이 파싱 로직이 표준 udhcp에는 없고 D-Link가 자체적으로 덧붙인 부분이라는 점입니다 — 즉, 잘 검토된 오픈소스 경로가 아니라 벤더 커스텀 경로에서 버그가 났습니다.


CVE 분석 요약

보고된 근본 원인은 “옵션의 선언된 길이를 신뢰해 고정 크기 스택 버퍼로 그대로 복사” 하는 고전적 패턴입니다. DHCP 옵션의 길이 바이트는 공격자가 임의로 정할 수 있는 값인데, 이를 목적지 버퍼 크기와 비교하지 않고 복사하면 버퍼 경계를 넘어 인접 스택 영역(저장된 레지스터·복귀 주소 등)을 덮어쓰게 됩니다.

아래는 이 부류의 결함을 개념적으로 보여주는 의사 코드입니다.

/* 개념용 단순화, 실제 페이로드/원본 코드 아님 */
void handle_option125(unsigned char *pkt) {
    char buf[64];                 /* 고정 크기 스택 버퍼 */
    unsigned char opt_len = pkt[1];   /* 공격자가 정하는 길이 바이트 */

    /* 결함: opt_len 을 sizeof(buf) 와 비교하지 않음 */
    memcpy(buf, &pkt[2], opt_len); /* opt_len > 64 이면 스택 오버플로 */
    /* ... 이후 sendOffer/sendACK 응답 구성 ... */
}

⚠️ 위 코드는 취약점 클래스를 설명하기 위한 우리 재작성이며, DIR-895L의 실제 소스가 아닙니다. 실제 취약 라인이 어떤 버퍼에 어떤 복사 함수(memcpy/strcpy 등)로 몇 바이트를 복사하는지 — 즉 정확한 오버플로 기전과 file:line — 는 원 연구자 노트에만 있고 우리가 1차 대조하지 못했습니다. ⚠️미확인(팩트체크 대상).

코드 렌더의 정직한 한계. 이 취약점의 실제 취약 라인은 오픈소스에서 렌더할 수 없습니다. sendOffer/sendACK 함수 시그니처 자체는 Russ Dill 계열 standalone udhcp(GPL)의 serverpacket.c에서 유래한 공개 골격이지만, 오버플로를 일으키는 TR-111 Option 125 파싱은 D-Link가 폐쇄 펌웨어에 덧붙인 독자 개조분이라 upstream 오픈소스에 존재하지 않습니다. 따라서 upstream udhcp 코드를 “이것이 취약 코드”라고 제시하는 것은 사실이 아니며, 이 글은 그렇게 하지 않습니다. 실제 취약 라인은 D-Link GPL 펌웨어 타르볼(공개될 경우)에서만 확인 가능합니다 분석: DIR-895L 정확 타르볼·해당 소스 라인은 우리가 확보·대조하지 못함 — ⚠️미확인.

컴포넌트 표기 불일치(주의). CVE 정본 레코드와 대부분의 애그리게이터는 컴포넌트를 udhcpcd(끝에 c — 통상 DHCP 클라이언트 데몬 철자)로 적었습니다. 그러나 sendOffer/sendACK는 DHCP 서버 함수이고, 원 연구자 노트 제목은 udhcpd(서버)로 표기합니다. 기능상 서버(udhcpd)가 맞을 개연성이 높으나, NVD/CVE 정본 문자열은 udhcpcd입니다 — ⚠️미확인(팩트체크 대상, 1차출처로 확정 필요).


공격 시나리오 · 영향도 + 대응방안

공격 시나리오(개념).

  1. 공격자가 대상 라우터와 같은 로컬 네트워크에 접속합니다(유선/무선 불문, 인증 불필요).
  2. TR-111 Option 125 필드에 목적지 스택 버퍼 크기를 초과하는 과대 길이 데이터를 담은 DHCP 요청을 보냅니다.
  3. 서버가 sendOffer/sendACK 경로에서 그 옵션을 길이 검증 없이 스택 버퍼로 복사하며 오버플로가 발생합니다.
  4. 최소 결과는 DHCP 데몬 크래시(주소 할당 서비스 마비)이고, 스택 레이아웃·완화책 부재 정도에 따라 제어 흐름 탈취를 통한 코드 실행으로 이어질 수 있습니다 분석: 임의 코드 실행 가능성은 벡터(S:C, VC/VI/VA:H)와 CWE-121 성격에 근거한 추론 — 실제 RCE 재현 여부는 ⚠️미확인.

작동하는 익스플로잇·완성형 페이로드는 싣지 않습니다(무해화 원칙). 여기서 중요한 것은 페이로드가 아니라 “공격자 통제 길이를 검증 없이 고정 버퍼로 복사” 라는 원리입니다.

영향도. 무인증·인접 네트워크에서 라우터의 핵심 서비스(DHCP)를 무너뜨릴 수 있고, 코드 실행에 성공하면 게이트웨이 장악으로 내부망 전반이 위협받습니다. 다만 인터넷 원격 공격은 불가하고 공격 표면이 로컬로 제한된다는 점은, 실제 위험도를 평가할 때 반드시 함께 고려해야 합니다(그래서 벡터가 AV:A입니다).

대응방안.

  1. 근본(안전 버전). 없습니다. DIR-895L은 이미 지원 종료(EOL/EOS) 제품이라 벤더 펌웨어 개발이 끝났고, 이 취약점에 대한 고정 패치는 나오지 않을 가능성이 높습니다 분석: EOL 정책·미패치 상태에 근거 — 향후 벤더 대응 여부는 ⚠️미확인이나 EOL 제품 관행상 미패치 예상. 현실적 근본 대책은 지원 중인 기기로의 교체입니다.
  2. 차선(업데이트 불가 시).
    • 신뢰할 수 없는 단말이 라우터와 같은 L2 세그먼트에 있지 않도록 네트워크를 분리합니다(게스트/IoT VLAN 격리). Option 125 파싱은 로컬에서만 트리거되므로, 공격 표면 축소가 곧 방어입니다.
    • 관리용 원격관리(TR-069/TR-111) 기능을 쓰지 않는다면 비활성화하고, 무선 접근을 강한 인증·최소 노출로 조입니다.
    • 가능하다면 신뢰 가능한 서드파티 펌웨어로의 이전을 검토합니다(기기·모델 지원 여부 확인 전제).
  3. 탐지 관점. 동일 세그먼트에서 비정상적으로 긴 Option 125(Vendor-Specific) 필드를 담은 DHCP DISCOVER/REQUEST 패턴을 이상 징후로 볼 수 있습니다. DHCP 데몬의 반복 크래시·재시작 로그도 트리거 시도의 간접 신호입니다.

결론

CVE-2026-86509는 새로운 종류의 버그가 아닙니다 — 검증된 오픈소스 데몬 위에 벤더가 손으로 덧댄 관리 확장(TR-111 Option 125)에서, “선언된 길이를 믿고 고정 버퍼로 복사”라는 30년 된 실수가 다시 나온 것입니다. 임베디드 취약점의 무게 중심이 표준 프로토콜이 아니라 벤더 커스텀 경로에 있다는 점을 다시 확인시켜 줍니다. 그리고 대상이 EOL 제품이라는 사실은 또 다른 교훈을 남깁니다 — 지원이 끝난 네트워크 장비는 “취약점이 발견되어도 고쳐지지 않는” 자산이 되며, 이때 유일한 방어는 코드가 아니라 네트워크 설계(격리·교체)로 옮겨갑니다.

이 한 틈은 아마 패치되지 않겠지만, “길이를 검증하지 않고 복사하는” 이 사고방식은 다음 펌웨어의 다음 커스텀 옵션에서 또 나옵니다 — 그래서 우리는 개별 익스플로잇이 아니라 패턴과 방어 원리를 남깁니다.


References / 참고자료

  1. [재구성한 원 분석] tian(tzh00203), “D-Link DIR-895L — Stack Overflow in udhcpd (TR-111 Option 125 Parsing)” — 이 취약점의 원 보고·PoC 존재를 담은 연구자 노트(본문은 SPA 렌더로 우리가 자동 대조하지 못함). https://tzh00203.notion.site/D-Link-DIR-895L-Stack-Overflow-in-udhcpd-TR-111-Option-125-Parsing-33cb5c52018a80dc8140e1502e4814d0
  2. NVD, CVE-2026-86509 상세 — 공식 취약점 레코드(정본). https://nvd.nist.gov/vuln/detail/CVE-2026-86509
  3. CVEProject/cvelistV5, CVE-2026-86509.json — 제품·버전·컴포넌트·함수 등 정본 필드 확인용 raw 레코드. https://raw.githubusercontent.com/CVEProject/cvelistV5/main/cves/2026/86xxx/CVE-2026-86509.json
  4. VulDB, CVE-2026-86509 — 할당 CNA·보고자·초기 등록 정보. https://vuldb.com/cve/CVE-2026-86509
  5. OffSeq Threat Radar, Stack-based Buffer Overflow in D-Link DIR-895L — CVSS 3.1/4.0 벡터·크레딧 상세 교차확인. https://radar.offseq.com/threat/cve-2026-86509-stack-based-buffer-overflow-in-d-link-dir-895l-9794ccee4cffa64a
  6. Strix.ai, CVE-2026-86509 — TR-111 Option 125 근본원인 명시(독립 분석, 교차검증). https://www.strix.ai/cve/CVE-2026-86509
  7. D-Link, End-of-Life Policy — 대상 제품의 지원 종료·미패치 근거. https://www.dlink.com/en/end-of-life-policy
  8. D-Link, GPL Source Code Center — 베이스 udhcp serverpacket.c 골격(취약 라인 아님)의 배포처. https://tsd.dlink.com.tw/GPL.asp

이 글은 위 원 분석을 우리 관점에서 다시 쓰고 논평을 더한 것입니다. 특정 문장·코드를 그대로 옮기지 않았으며, 자세한 재현 절차는 원문을 참고하세요. 본문의 코드는 취약점 클래스를 설명하기 위한 개념용 재작성이며 실제 소스가 아닙니다. ⚠️미확인 표시 항목(정확한 오버플로 기전·file:line, udhcpcd/udhcpd 컴포넌트 표기, CVSS 4.0 점수)은 독립 팩트체커가 1차출처로 확정할 대상입니다.