CVE-2026-90606 (Totolink A3002MU 버퍼 오버플로우) 분석

분류: CVE · 임베디드·라우터 · 버퍼 오버플로우(DoS) · CVE-2026-90606 · [표준]

가정용 기가 무선 공유기 Totolink A3002MU의 관리 웹서버에서, IPv6 설정을 저장하는 요청 하나가 고정 크기 버퍼를 넘겨 씁니다. 인증된 사용자가 static_ipv6 값을 길게 밀어 넣으면 웹서버 프로세스가 무너지고, 관리 화면이 마비됩니다. 오래된 임베디드 웹 스택에서 되풀이되는 “입력 길이를 안 재고 복사하는” 고전적 실수의 최신 사례입니다.

임베디드 라우터의 취약점은 대개 화려한 신기술이 아니라, 20년 전에 이미 교과서에 실린 패턴이 또 나온 것입니다. 이번 CVE-2026-90606도 그렇습니다. 웹 요청에서 받은 문자열을 길이 검사 없이 스택 버퍼로 복사하는 — strcpy 계열의 전형적 오용 — 한 줄이 원인으로 지목됩니다. 이 글은 그 “왜 이 부류가 임베디드에서 유독 오래 살아남는가”를 짚는 교과서 같은 표본입니다.

개요

이 취약점은 Totolink A3002MU(AC1200 등급 기가 무선 공유기)의 펌웨어 Hh-B20211125.1046에서 확인됐습니다. 취약 지점은 공유기 관리 UI를 서비스하는 boa 웹서버(/bin/boa) 안의 formIpv6Setup 함수이며, POST /boafrm/formIpv6Setup 요청의 static_ipv6 파라미터가 방아쇠입니다.

핵심 임팩트는 버퍼 오버플로우로 인한 서비스 거부(DoS) 입니다. 연구자가 실제로 실증한 것은 boa 프로세스의 크래시(관리 UI 마비)이며 확인, 스택 오버플로우 특성상 흔히 거론되는 원격 코드 실행(RCE)은 이 사례에서 실증되지 않았습니다 분석. 공격에는 인증이 필요합니다(pre-auth 아님) — CVSS 벡터의 PR:L과 PoC에 세션 확인 파라미터가 존재한다는 점이 이를 뒷받침합니다.

심각도 지표(⚠️ 출처 간 일부 불일치, 아래 정직 표기):

  • CVSS v3.1: 9.9 CRITICAL — AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H (여러 출처 일치, 가장 신뢰) 확인
  • CVSS v4.0: 8.6 ~ 9.4 (벡터는 CVSS:4.0/AV:N/AC:L/AT:N/PR:L/UI:N/VC:H/VI:H/VA:H/SC:H/SI:H/SA:H/E:P로 일치, 점수는 출처마다 달라 ⚠️미확인)
  • CWE-120(크기 확인 없는 버퍼 복사) + CWE-119(메모리 경계 내 부적절한 제한) 확인
  • 발행일 2026-09-14 (일부 출처 09-13, 사소 불일치 ⚠️미확인)
  • 수정 버전: 현재까지 공개 확인 안 됨 ⚠️미확인(팩트체크 대상)

기술 배경

boa 웹서버. 다수의 저가·구형 임베디드 라우터는 관리 화면을 띄우기 위해 boa라는 경량 C 웹서버를 씁니다. 리소스가 빠듯한 기기에서 작게 도는 것이 장점이지만, 현대적 메모리 안전 장치가 거의 없고 CGI류 폼 처리 코드가 사용자 입력을 직접 C 문자열로 다루는 구조라, 입력 검증이 한 군데만 빠져도 곧장 메모리 손상으로 이어집니다.

스택 버퍼 오버플로우. C에는 문자열에 길이라는 개념이 내장돼 있지 않습니다. strcpy 같은 함수는 출발지 문자열을 끝(널 바이트)까지 무조건 복사하며, 도착지 버퍼가 그만큼 큰지 스스로 확인하지 않습니다. 도착지가 함수의 지역 변수(스택)라면, 넘친 바이트가 같은 스택에 놓인 다른 값 — 저장된 복귀 주소 등 — 을 덮어씁니다. 그 결과 최소 프로세스 크래시(DoS)가, 조건이 맞으면 제어 흐름 탈취(RCE)까지 이론적으로 가능합니다.

폐쇄형 펌웨어라는 한계(정직한 선긋기). Totolink 펌웨어는 오픈소스가 아닙니다. 취약 함수 formIpv6Setup은 공개 저장소의 소스 파일이 아니라 스트립된 바이너리 /bin/boa 안에 있고, 연구자는 이를 디컴파일(리버싱)해 취약 지점을 특정했습니다. 따라서 이 글은 파일 경로·라인 번호·패치 커밋 SHA를 제시할 수 없습니다 — 그런 것이 공개 존재하지 않기 때문입니다. 아래 코드 그림은 원본이 아니라 취약 패턴의 개념적 재구성입니다.

CVE 분석 요약

공개된 범위에서 정리한 인과는 다음과 같습니다.

  1. 인증된 사용자가 IPv6 설정 저장 폼(/boafrm/formIpv6Setup)을 전송합니다.
  2. boa 웹서버의 formIpv6Setup 처리 루틴이 요청 본문에서 static_ipv6 값을 꺼냅니다.
  3. 이 값을 길이 검증 없이 고정 크기 스택 버퍼로 복사합니다. 값이 버퍼보다 길면 인접 스택 메모리를 침범합니다(CWE-120). 확인
  4. 침범이 저장된 복귀 주소 등 제어 데이터를 훼손하면 boa가 크래시하고, 관리 웹 서비스가 내려갑니다(DoS). 확인

취약 패턴을 개념적으로만 그리면 아래와 같습니다. 실제 벤더 코드가 아니라, “무엇이 잘못됐나”를 보여주기 위한 최소 재현입니다.

// 개념용 단순화 — 실제 페이로드/원본 코드 아님 (폐쇄형 펌웨어라 원본 인용 불가)
void handle_ipv6_setup(request *req) {
    char ipv6_buf[64];                       // 고정 크기 스택 버퍼

    const char *v = get_form_value(req, "static_ipv6");

    // 문제: v의 길이를 재지 않고 그대로 복사한다.
    //       v가 64바이트를 넘으면 ipv6_buf를 넘어 인접 스택을 덮는다.
    strcpy(ipv6_buf, v);                      // ← CWE-120: 크기 확인 없는 복사

    apply_ipv6_config(ipv6_buf);
}

무엇이 빠졌는지는 분명합니다. 입력 길이 상한 검사(그리고 그 상한을 지키는 안전 복사)가 없습니다. 올바른 코드라면 복사 전에 static_ipv6가 IPv6 주소 표기의 최대 길이(예: INET6_ADDRSTRLEN 수준)를 넘지 않는지 확인하거나, 버퍼 크기를 넘기지 않는 경계 있는 복사 함수를 써야 합니다. 이 한 겹의 검증 부재가 이 CVE의 근본 원인입니다.

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

공격 시나리오(개념). 공격자는 먼저 관리 세션을 획득해야 합니다(인증 필요). 그 뒤 IPv6 설정 저장 엔드포인트로 static_ipv6 값이 비정상적으로 긴 요청을 보냅니다. 값이 대상 버퍼 크기를 넘어서면 boa의 스택이 훼손되고 프로세스가 무너집니다. 완성형 페이로드·정확한 오프셋은 이 글에서 다루지 않습니다(무해화).

영향도. 실증된 영향은 관리 웹 서버 크래시로 인한 DoS입니다 확인. 관리 UI가 마비되면 정당한 관리자가 설정을 변경하지 못하고, 서비스 안정성이 흔들립니다. RCE로의 확대는 이론적으로 거론되나 이 사례에서는 미실증입니다 분석 ⚠️미확인. 다만 인증이 선행 조건이라는 점은 위험을 다소 낮춥니다 — 다른 인증 우회나 기본 크리덴셜과 엮이지 않는 한, 임의 인터넷 공격자가 곧장 방아쇠를 당기기는 어렵습니다. (관리 UI가 인터넷에 노출돼 있고 약한 크리덴셜을 쓰는 기기라면 체인 위험은 커집니다.)

대응방안.

  1. 근본(안전 버전): 벤더가 배포한 수정 펌웨어가 있으면 업데이트합니다. 다만 현재까지 패치된 펌웨어 버전은 공개적으로 확인되지 않았습니다 ⚠️미확인(팩트체크 대상) — Totolink 공식 채널의 후속 공지를 확인하시기 바랍니다. 구형 모델은 지원 종료(EoL)로 패치가 나오지 않을 수 있으며, 그 경우 기기 교체를 고려해야 합니다.
  2. 차선(업데이트 불가 시): ① 관리 인터페이스를 인터넷에 노출하지 말고 신뢰된 내부 세그먼트로만 접근을 제한합니다(원격 관리 비활성화). ② 기본·약한 관리자 크리덴셜을 강한 값으로 바꿔 세션 획득 자체를 어렵게 만듭니다(인증이 선행 조건이므로 효과적). ③ 관리 세그먼트 앞단에서 /boafrm/formIpv6Setup로 향하는 비정상 길이의 static_ipv6 값을 차단하는 규칙을 둘 수 있습니다.
  3. 탐지 관점: boa 프로세스의 반복 크래시·재시작, 관리 엔드포인트로 향하는 과도하게 긴 폼 파라미터를 이상 징후로 모니터링합니다.

결론

한 줄 요약: 인증된 요청 하나의 static_ipv6 값이 길이 검사 없이 고정 버퍼로 복사돼, 임베디드 웹서버 boa를 크래시(DoS)시킨다.

임베디드 라우터에서 이 부류가 반복되는 이유는 단순합니다 — 리소스가 빠듯한 C 웹 스택은 입력 길이 검증을 “나중에” 미루기 쉽고, 폼 처리 핸들러 하나하나가 그 검증을 스스로 챙겨야 하는데 그중 한 곳이 빠지면 곧장 메모리 손상이 됩니다. 이번 틈은 (패치가 나온다면) 한 함수의 경계 검사로 막히겠지만, 같은 사고방식 — “입력을 안 재고 복사한다” — 은 다른 폼, 다른 기기에서 또 나옵니다. 그래서 우리는 개별 익스플로잇이 아니라 패턴을 읽는 방법을 남깁니다.

References / 참고자료

이 글은 아래 원 분석·공개 레코드를 우리 관점에서 다시 쓰고 논평을 더한 것입니다. 특정 문장·코드를 그대로 옮기지 않았으며, 자세한 재현 절차는 원문을 참고하세요.

  1. [이 글이 재구성한 원 분석] SunnyYANGyaya, “BOF in formIpv6Setup — Totolink A3002MU”, GitHub write-up — 취약 함수·엔드포인트·파라미터·DoS 실증의 1차 근거. https://github.com/SunnyYANGyaya/cuicuishark-sheep-fishIOT/blob/main/ToTolink/A3002MU/bof-formIpv6Setup.md
  2. [1차·조율기관] NVD, “CVE-2026-90606”, 공식 CVE 레코드 — 영향 제품·CWE·CVSS 벡터. https://nvd.nist.gov/vuln/detail/CVE-2026-90606
  3. [1차·조율기관] VulDB, “CVE-2026-90606”, 취약점 레코드 — CVSS·발행 메타. https://vuldb.com/vuln/403188
  4. [집계·CVSS 상세] OpenCVE, “CVE-2026-90606” — CVSS v3.1/v4.0·발행일·보고자. https://app.opencve.io/cve/CVE-2026-90606
  5. [독립 분석] strix.ai, “CVE-2026-90606” — 인증 요구·CVSS v4.0 점수·EPSS. https://www.strix.ai/cve/CVE-2026-90606
  6. [독립 분석] OffSeq Threat Radar, “Buffer Overflow in Totolink A3002MU (CVE-2026-90606)” — 엔드포인트·심각도 교차 확인. https://radar.offseq.com/threat/cve-2026-90606-buffer-overflow-in-totolink-a3002mu-ff1e560ec5dedad6