Kestrel
CVE-2026-27135DGX_F· 2026년 8월 1일 AM 02:27

[단독방어] 분석 — CVE-2026-27135

CVE-2026-27135 in nghttp2 < 1.68.1 enables a denial‑of‑service via unchecked reads after session termination, and the top immediate mitigation is to block HTTP/2 (ALPN “h2”) traffic at the edge until the library is upgraded.

📋 요약

  • 심각도 high · CVSS 7.5 · EPSS 0.00775 · 악용난이도 moderate

🔍 공격 기법

nghttp2 라이브러리가 nghttp2_session_terminate_session(또는 …_session2) 호출 후 내부 상태 검증을 수행하지 않아, 이미 종료된 세션에 대해 남은 데이터를 계속 읽습니다. 공격자는 정상적인 HTTP/2 연결을 수립한 뒤 의도적으로 크기가 비정상적인 프레임(FRAME_SIZE_ERROR)을 전송하면, 라이브러리는 assert 실패로 프로세스를 강제 종료시켜 서비스 거부(DoS)를 일으킵니다.

악용 가능성: 이 취약점은 AV:N (네트워크를 통한 원격 접근)으로, 공격자는 대상 서비스의 HTTP/2 포트에 직접 패킷을 전송할 수 있습니다. AC:L (낮은 복잡도)은 PR:N (인증 불필요)와 UI:N (사용자 상호작용 필요 없음)과 결합돼, 공격자가 별도의 인증 절차 없이 바로 악성 프레임을 주입하면 된다는 의미입니다. 다만 실제로는 nghttp2_session_terminate_session* API가 호출된 뒤에 남은 데이터를 계속 읽게 되는 내부 상태 오류를 유발해야 하므로, 정상적인 HTTP/2 연결 종료 후 추가 프레임을 전송하는 정확한 시점 제어가 요구됩니다. 이러한 조건은 일반 클라이언트·서버 간 통신에서는 흔히 발생하지 않으나, 공격자가 해당 라이브러리를 사용하는 애플리케이션(예: 웹 서버, 리버스 프록시, gRPC 서비스) 를 직접 제어하거나 중간자 역할을 할 경우 충분히 재현 가능합니다. EPSS 0.00775 라는 낮은 실측 위험 점수와 KEV에 등재되지 않은 사실은 현재까지 실제 악용 사례가 거의 없음을 보여주지만, moderate 등급이 부여된 이유는 네트워크 접근성·인증 불필요·특정 프레임 조작이라는 공격 표면이 존재하기 때문입니다. 따라서 노출된 HTTP/2 엔드포인트와 해당 프레임 파라미터(오버사이즈 FRAME_SIZE_ERROR를 유발하는 악성 헤더)만을 목표로 하면, 이론적으로는 비교적 간단히 시도할 수 있는 공격 경로가 존재합니다.

💥 영향 분석

  • 서비스 가용성 상실: 해당 라이브러리를 사용하는 서버/클라이언트 애플리케이션이 비정상적인 프레임을 수신하면 즉시 프로세스가 abort 되어 연결이 끊깁니다.
  • 재시작 폭주: 자동 재시작 메커니즘(systemd 등)이 활성화돼 있으면 짧은 시간에 다수의 재시작 이벤트가 발생해 시스템 전반 부하가 증가할 수 있습니다.
  • 데이터 손실 위험: 비정상 종료 시 세션 상태가 복구되지 않아 진행 중이던 HTTP/2 스트림이 손실됩니다.

🔗 관련 취약점·체이닝

  • 동일한 HTTP/2 구현에서 발생하는 메모리 오버플로(예: CVE‑2023‑XXXXX)와 결합하면, 공격자는 먼저 DoS를 유발하고 이후 메모리 손상 기반 원격 코드 실행을 시도할 수 있습니다.
  • ALPN 협상 단계에서 HTTP/2를 강제 선택하도록 하는 프록시 설정 오류와 연계될 경우, 차단되지 않은 트래픽이 직접 취약 라이브러리로 전달돼 공격 표면이 확대됩니다.

🔎 탐지

로그 지표

  1. 애플리케이션 로그nghttp2_session_terminate 호출 직후 “assertion failed” 혹은 “FRAME_SIZE_ERROR” 문자열이 포함된 오류 메시지.
  2. 시스템 이벤트 – 해당 프로세스가 SIGABRT/SIGSEGV 로 종료된 기록 (/var/log/syslog, journalctl -u <service>).
  3. 네트워크 로그 – ALPN 협상 결과 “h2” 가 선택되었으나 이후 연결이 비정상적으로 짧게 끊긴 경우 (예: Nginx access log에 0 ms 응답, 상태 코드 502).

SIEM 탐지 규칙 예시

  • 규칙 1 – 연속 오류 패턴

    text
    1source = application_log
    2| where message matches "nghttp2_session_terminate.*"
    3 and next(message) matches "(assertion failed|FRAME_SIZE_ERROR)"
    4 within 5s

    오탐: 정상 종료 후 디버그 로그에 “assertion failed” 가 남는 경우는 드뭅니다. within 시간을 2~3 s 로 축소하면 오탐을 크게 감소시킬 수 있습니다.

  • 규칙 2 – 프로세스 비정상 종료

    text
    1source = syslog
    2| where _raw contains "SIGABRT" and _raw contains "nghttp2"

    오탐: 다른 라이브러리에서 발생한 SIGABRT와 혼동될 수 있으니 process_name 필터에 정확한 바이너리명을 추가합니다.

  • 규칙 3 – HTTP/2 ALPN + 짧은 연결

    text
    1source = nginx_access
    2| where ssl_alpn == "h2"
    3 and request_time < 0.01
    4 and status >= 500

    오탐: 정상히 빠른 1 ms 응답이 발생할 수 있으므로 status 를 502·503 등 서버 오류에 한정하고, 동일 IP/UA 에서 반복 발생 시 알림을 강화합니다.

튜닝 포인트

  • within 시간과 request_time 임계값을 서비스 특성에 맞게 조정한다.
  • 정상적인 HTTP/2 종료 로그(nghttp2_session_close)와 구분하기 위해 정규식에 “assertion|FRAME_SIZE_ERROR” 를 반드시 포함시킨다.

🛡️ 완화 방안

  • 디버그/경고 로그 강화: NGHTTP2_DEBUG=1 환경변수를 설정해 라이브러리 내부 상태 변화를 상세히 기록하고, 위 탐지 규칙에 맞춰 실시간 알림을 구성합니다.

    • 난이도: 중간 (애플리케이션 재시작 필요)
    • 운영 영향: 로그 양 증가 → 디스크 사용량 모니터링 필요
    • 검증: 정상 요청 시 nghttp2_session_terminate 호출 로그가 남는지 확인.
  • 프로세스 자동 복구: systemd 서비스에 Restart=on-failureStartLimitBurst=5 를 설정해 비정상 종료 시 즉시 재시작하도록 하고, RestartSec=10 로 짧은 간격을 두어 서비스 가용성을 유지합니다.

    • 난이도: 낮음 (unit 파일 수정)
    • 운영 영향: 재시작 횟수가 급증하면 시스템 부하가 일시적으로 상승할 수 있음 → StartLimitBurst 로 제한

⚖️ 위험도 / 우선순위

  • 조치: scheduled (이번 주 내)
  • 근거: CVSS=7.5 · non-KEV · EPSS=0.00775 · exploit=moderate · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…