
Sliver HTTP(S) C2 PNG 폭탄 DoS 익스플로잇 — GHSA-663m-7x7m-g4fw (CVE-2026-77622)
Sliver C2의 HTTP(S) 리스너에 대한 서비스 거부(DoS) 익스플로잇입니다. 세션별 PNG 인코딩 nonce를 무차별 대입(brute-force)하여 서버 메모리를 고갈시키는 압축 해제 폭탄(decompression bomb)을 전달합니다.
GHSA-663m-7x7m-g4fw로 공개되었습니다.
Sliver의 HTTP(S) C2 채널은 메시지를 PNG 이미지 내부에 래핑합니다. 각 세션에는 [1, 65537) 범위의 무작위 nonce가 할당되며, 서버는 ?n= 쿼리 매개변수가 세션의 nonce와 일치하는 요청의 PNG 데이터만 디코딩합니다. 이는 인증 검사가 아닌 라우팅 메커니즘입니다 — 키 공간(keyspace)은 16비트입니다.
서버는 Go의 image.Decode()로 PNG를 디코딩하며, 이는 메모리에 width × height × bytes_per_pixel을 할당합니다. 선언된 크기가 32767×32767 RGBA인 PNG 파일은 전송 시 약 3KB로 압축되지만 메모리에서는 4GB 이상으로 압축 해제됩니다. 서버는 디코딩된 크기에 제한을 두지 않습니다.
익스플로잇은 세 단계로 작동합니다:
GHSA-663m-7x7m-g4fw에 언급된 수정 이전의 Sliver C2 버전. HTTP 또는 HTTPS 리스너를 실행하는 모든 Sliver 서버가 노출됩니다.
go build -o pngboomer
외부 종속성 없음. 표준 라이브러리만 사용합니다.
./pngboomer -url http://target:8080/ [options]
| 플래그 | 기본값 | 설명 |
|---|---|---|
-url | http://127.0.0.1:8080/ | Sliver HTTP C2 기본 URL |
-workers | 8 | 스캔 동시성 |
-probe-w | 2000 | 프로브 PNG 너비 |
-probe-h | 2000 | 프로브 PNG 높이 |
-probe-color | 2 | 프로브 색상 유형 (2=RGB, 6=RGBA) |
-kill-w | 32767 | 종료 PNG 너비 |
-kill-h | 32767 | 종료 PNG 높이 |
-kill-color | 6 | 종료 색상 유형 (2=RGB, 6=RGBA) |
-threshold-ms | 50 | nonce 감지를 위한 최소 응답 시간 기준 |
-outlier-mult | 15.0 | 적응형 임계값 = 기준 p99 × 이 값 |
-calibrate | 16 | 보정 샘플 수 |
-verify | 3 | 후보 nonce당 재프로브 횟수 |
-max-nonce | 65537 | nonce 범위 상한 (Sliver 모듈러스) |
-probe-timeout | 5s | 프로브당 HTTP 타임아웃 |
-kill-timeout | 180s | 종료 요청 HTTP 타임아웃 |
-target-cap-mb | 10240 | 선언된 대상 메모리 상한 (안전 검사) |
-nonce | 0 | 스캔 건너뛰고 이 nonce를 직접 사용 |
-scan-only | false | nonce를 찾아 출력만 하고 종료 요청은 보내지 않음 |
-no-confirm | false | 종료 후 대상 사망 여부 TCP 폴링 건너뜀 |
-no-color | false | ANSI 색상 출력 비활성화 |
-silent | false | 발견된 nonce만 stdout에 출력 |
로컬 Docker 대상에 대한 기본 스캔 및 종료:
./pngboomer -url http://127.0.0.1:8080/ -target-cap-mb 10240
스캔만 수행 (종료 없이 nonce 찾기):
./pngboomer -url https://c2.target.com/ -scan-only
nonce를 이미 알고 있을 때 스캔 건너뛰기:
./pngboomer -url http://target:8080/ -nonce 41337
종료 폭탄은 대상에서 수 기가바이트의 PNG 디코딩을 유발합니다. 테스트 시 Sliver 서버를 --memory=<N>g로 Docker 컨테이너 안에서 실행하고 -target-cap-mb N을 전달하여 도구가 대상 메모리를 초과하는 위험한 작업자/프로브 조합을 거부하도록 하십시오.
프로브 PNG는 잘못된 nonce에 대한 서버의 빠른 경로 거부보다 디코딩에 측정 가능할 정도로 오래 걸릴 만큼 큽니다. 스캔은 nonce 범위를 섞은 다음 작업자 고루틴(goroutine)에 분산합니다. 각 작업자는 후보 nonce로 프로브 PNG를 전송하고 응답 시간을 측정합니다.
응답이 적응형 임계값(-threshold-ms와 baseline_p99 × outlier-mult 중 더 높은 값)을 초과하면 후보를 -verify 횟수만큼 재프로브합니다. 재프로브의 과반수가 임계값을 초과하면 nonce가 확인됩니다. 그렇지 않으면 후보는 블랙리스트에 추가되고 스캔이 계속됩니다. 스캔이 포기하기 전까지 최대 8개의 오탐 "블립(blip)"이 허용됩니다.
GitHub의 비공개 자문 프로세스를 통해 Bishop Fox에 보고되었습니다. CalebKingan이 패치를 작성했습니다.