Skip to content
KitploitKITPLOIT
도구블로그
제출
도구블로그
제출

해킹, 침투 테스트 및 사이버 보안 도구를 당신의 보안 무기고에!

Kitploit은 해킹, 사이버 보안 및 침투 테스트 도구 디렉토리입니다. 최신 프로젝트 업데이트를 발견하여 취약점을 찾고, 시스템을 분석하고, 테스트를 자동화하고, 보안을 강화하세요.

··피드·문의·개인정보·© 2026 Kitploit

도구 디렉토리

카테고리

모든 카테고리 보기
Loading categories
servu-cve-2026-28318-poc — SolarWinds Serv-U CVE-2026-28318: 인증되지 않은 Content-Encoding: deflate 크래시. 근본 원인 분석 (내부 포인터의 잘못된 해제 -> 힙 손상) + DoS 전용 PoC. 15.5.4 핫픽스 1에서 수정됨. | Kitploit
도구/GitHubGitHub/eaea0001/servu-cve-2026-28318-poc
Memory ForensicsVulnerability AnalysisExploitationPenetration TestingBinary Analysis
GitHubeaea0001/servu-cve-2026-28318-poc

servu-cve-2026-28318-poc

SolarWinds Serv-U CVE-2026-28318: 인증되지 않은 Content-Encoding: deflate 크래시. 근본 원인 분석 (내부 포인터의 잘못된 해제 -> 힙 손상) + DoS 전용 PoC. 15.5.4 핫픽스 1에서 수정됨.

저장소 보기

인기

모두 보기 →

커뮤니티에서 가장 많이 사용되는 도구를 찾아보세요.

모든 도구 탐색

도구 컬렉션을 둘러보세요

모든 도구 보기 →
공유
133개월 전아직 검토되지 않음

CVE-2026-28318 — SolarWinds Serv-U "Content-Encoding: deflate" 사전 인증 충돌

근본 원인 분석 + DoS 개념 증명. 공식 권고에서는 이를 인증되지 않은 서비스 거부 / 제어되지 않은 리소스 소비로 분류합니다. 바이너리 분석 결과 근본적인 결함은 메모리 안전성입니다: HTTP deflate 디코드 경로에서 내부 포인터에 대한 유효하지 않은 free() 가 발생하여 프로세스 힙을 손상시킵니다(STATUS_HEAP_CORRUPTION, 0xC0000374). 이는 압축 해제 폭탄이 아니며, 충돌은 압축 해제된 크기와 무관합니다.


⚠️ 면책 조항 / 범위

  • 이는 이미 패치되어 공개적으로 공개된 취약점에 대한 방어적 보안 연구입니다 (수정 사항은 2026-06-04에 Serv-U 15.5.4 Hotfix 1로 제공됨; CISA KEV에 등록됨).
  • 여기의 PoC는 귀하가 소유하거나 명시적으로 테스트 권한이 있는 Serv-U 인스턴스만 충돌시킵니다. 이는 DoS 전용입니다 — 원격 코드 실행은 포함되거나 시연되지 않습니다 (심각도 참조).
  • 자신의 시스템에서 패치 상태 및 탐지를 검증하는 데 사용하십시오. 통제하지 않는 시스템을 대상으로 사용하지 마십시오. 귀하는 관련 법률을 준수할 책임이 있습니다.

영향 받는 버전 / 수정 버전

이는 HTTP/HTTPS 리스너(웹/관리 경로)에만 영향을 미칩니다. FTP/FTPS/SFTP는 이 코드 경로에 있지 않습니다.


TL;DR

Content-Encoding: deflate 헤더와 유효한 deflate 본문을 포함한 모든 HTTP 요청은 서비스를 충돌시킵니다. 핸들러는 본문을 압축 해제한 다음 압축된 본문에 대한 포인터를 해제하고 압축 해제된 버퍼로 교체합니다. 그러나 그 포인터는 HTTP 수신 버퍼 내의 내부 포인터입니다 (본문을 가리키며, \r\n\r\n 바로 뒤에 위치). 힙 할당 기준이 아닙니다. 기본이 아니고 정렬되지 않은 포인터에 대해 free()를 호출하면 힙이 손상되고 프로세스가 종료됩니다.

버그가 본문 포인터가 해제되는 방식에 있기 때문에 — 얼마나 많은 데이터가 생성되는지가 아니라 — 약 25바이트의 압축된 본문(수 KB로 압축 해제됨)도 안정적으로 충돌을 일으킵니다. 메모리 사용량은 증가하지 않으며, 'zip/deflate 폭탄'이 아닙니다.


근본 원인

deflate 디코드 루틴은 RhinoNET.dll(Serv-U의 네트워크 라이브러리)에 있으며, 헤더 파서가 Content-Encoding: deflate를 보고 'deflate' 플래그를 설정하면 HTTP 수신 경로(ProcessReceive)에서 도달합니다.

단순화하면, 루틴은 decode(this, &bodyPtr, &bodyLen)으로 호출되며 다음을 수행합니다:

root@kitploit:~
1. inflate bodyPtr[0..bodyLen]  -> grows an accumulator buffer `acc`   (stock zlib, bounded, correct)
2. free(*bodyPtr)                <-- *bodyPtr is an INTERIOR pointer into the receive buffer
3. *bodyPtr = acc                // replace compressed body with decompressed buffer
4. *bodyLen = total

2단계가 버그입니다. *bodyPtr는 독립적으로 할당된 블록이 아닙니다: 요청 본문을 가리키지만 단일 HTTP 수신 버퍼 내부에 있습니다, 즉 receive_buffer + header_length입니다. 내부(그리고 16바이트 정렬되지 않은) 포인터를 해제하면 할당자가 공격자가 영향을 미친 영역을 힙 청크 헤더로 파싱하게 되어 → 힙 메타데이터 손상 → 0xC0000374가 발생합니다.

배제된 사항 (잘못된 방향으로 추적하지 않도록)

두 가지 '명백한' 가설은 틀렸으며, 런타임에서 확인되었습니다:

  • 인플레이트/압축 해제 오버플로우가 아님. 압축 해제기는 표준 zlib1.dll!inflate이며 모든 호출에서 avail_out을 준수합니다 (100개 이상의 청크에서 관찰됨; 범위를 벗어난 쓰기 없음).
  • 누산기 오버플로우가 아님. 증가하는 출력 버퍼는 각 라운드마다 prev_total + produced + 1로 할당되고 정확히 그만큼 기록됩니다 — 빡빡하며 오버플로우가 없습니다.

손상은 오로지 2단계의 유효하지 않은 free() 때문입니다.


증거

런타임(Frida)에서 Serv-U 15.5.4.108을 대상으로 본문이 "A" * 8192로 압축 해제되는 Content-Encoding: deflate 요청을 전송하는 동안 캡처:

  • 해제된 포인터는 …ce — mod 16 == 14입니다. 힙 할당 기준은 16바이트 정렬이므로 할당 기준이 아닙니다; 내부 포인터입니다.
  • 해제된 포인터 앞의 48바이트는 HTTP 헤더 꼬리이며, \r\n\r\n으로 끝납니다:
    root@kitploit:~
    …tream\r\nContent-Length: 26\r\nConnection: close\r\n\r\n
    
  • 해제된 포인터 위치의 바이트는 원시 deflate 스트림입니다 (ed c1 01 0d 00 …).
  • 충돌 시그니처: 오류 모듈 ntdll.dll, 예외 0xC0000374 (STATUS_HEAP_CORRUPTION), 호출은 RhinoNET.dll deflate 핸들러의 free에서 시작됩니다. 충돌 전 마지막 힙 작업이 바로 이 free(bodyPtr)입니다.
  • 크기 독립성: 약 4KB(압축 시 수십 바이트)로만 압축 해제되는 본문도 동일하게 충돌합니다; 작업 세트 메모리는 증가하지 않습니다.

심각도

  • 확인됨: Serv-U 서비스의 신뢰할 수 있는 인증되지 않은 원격 충돌(DoS)입니다. 서비스가 자동으로 다시 시작될 수 있지만, 반복적인 요청으로 인해 서비스가 중단되고 Windows 서비스 복구가 소진될 수 있습니다.
  • DoS 이상 — 입증되지 않음. 해제된 '청크 헤더'가 공격자가 제어하는 HTTP 헤더 바이트와 겹치는데, 이는 원칙적으로 단순한 DoS보다 강력한 프리미티브입니다. 그러나 최신 Windows(Segment Heap)에서 유효하지 않은 해제는 테스트에서 빠르게 실패(0xC0000374)하며, 코드 실행을 달성하지 못했습니다. 이를 메모리 안전성 근본 원인을 가진 사전 인증 힙 손상 DoS로 취급하십시오; RCE로 가정하지 마십시오.

재현

Python 3(표준 라이브러리만 필요)이 필요합니다. 테스트 권한이 있는 Serv-U HTTP 리스너를 대상으로 설정하십시오. Windows에서는 하나의 Get-NetTCPConnection 호출을 사용하여 리스너 PID를 읽고 응용 프로그램 이벤트 로그를 확인하여 힙 손상 충돌을 확인합니다.

root@kitploit:~
python poc_verify.py                       # default 127.0.0.1:80, tiny packet, 1 shot
python poc_verify.py --host <ip> --port 80
python poc_verify.py --big                 # body decompresses to 8192 bytes
python poc_verify.py --shots 3
python poc_verify.py --no-events           # skip event-log check (no privileges needed)

PoC는 최소한의 요청을 구성합니다:

root@kitploit:~
POST / HTTP/1.1
Host: <target>
Content-Encoding: deflate
Content-Type: application/octet-stream
Content-Length: <n>
Connection: close

<raw-deflate body — even a few dozen bytes is enough>

서비스가 충돌한 경우(리스너 PID 변경 / 0xC0000374 이벤트 발생) PASS를 보고하고, 서비스가 생존한 경우(이미 패치됨, 영향을 받지 않음, 또는 본문이 deflate로 처리되지 않음) FAIL을 보고합니다.


완화

  1. Serv-U 15.5.4 Hotfix 1(또는 이후 버전)을 적용합니다.
  2. 임시 조치: Serv-U 앞단에서 HTTP/HTTPS 리스너의 인바운드 Content-Encoding을 제거하거나 거부합니다, 예: 리버스 프록시에서:
    root@kitploit:~
    if ($http_content_encoding) { return 400; }
    
  3. Serv-U 웹/관리 포트의 네트워크 노출을 제한합니다.

방법론 (분석 방법)

  • 정적: RhinoNET.dll / Serv-U.exe(이미지 베이스 0x180000000)의 매개변수화된 PE 디스어셈블리를 통해 수신 → 헤더 파싱 → deflate 디코드 경로를 매핑하고 오류가 있는 free를 찾았습니다.
  • 동적: 라이브 서비스에 대한 Frida 계측 — zlib가 avail_out을 준수함을 증명하기 위해 압축 해제기를 후킹하고, 디코드 호출의 모든 alloc/free/memcpy를 디스크에 추적하며, 프로세스 예외 핸들러를 통해 손상 시점의 오류 명령과 0xC0000374 스택을 캡처했습니다. 그런 다음 해제된 포인터 주변의 바이트(HTTP 헤더 꼬리 + 원시 deflate 본문, 16바이트 비정렬)를 덤프하여 내부 포인터 해제를 확인했습니다.

분석에서 참조된 오프셋은 빌드 15.5.4.108에 특화되어 있으며 빌드에 따라 다를 수 있습니다.


참고 자료

  • SolarWinds — Serv-U 15.5.4 Hotfix 1 릴리스 노트
  • NVD — CVE-2026-28318
  • CISA KEV catalog — CVE-2026-28318

벤더 패치 제공 후 방어적 연구로 게시됨. PoC는 DoS 전용이며 승인된 테스트를 위한 것입니다.

도구 다운로드
제품SolarWinds Serv-U (FTP / MFT / File Server)
취약 버전15.5.4 and earlier in that branch without Hotfix 1 (analysis done on build 15.5.4.108)
수정 버전Serv-U 15.5.4 Hotfix 1 (released 2026-06-04)
공격 경로인증되지 않음, 네트워크 (HTTP/HTTPS 관리/웹 포트)
공개 분류CWE-400 Uncontrolled Resource Consumption · DoS · CVSS 7.5 · CISA KEV
실제 분류CWE-763 Release of Invalid Pointer / CWE-590 Free of Memory not on the Heap → heap corruption