更新: 291 个文件 - 2026-03-23 03:00:08
这个提交包含在:
@@ -4,24 +4,24 @@
|
||||
"display_name": "Traefik",
|
||||
"category": "servers",
|
||||
"advisory_mode": "server",
|
||||
"title": "traefik CVE-2024-45410 fix bypass: lowercase `Connection` tokens can delete traefik-managed forwarded identity headers (for example, `X-Real-Ip`)",
|
||||
"summary": "## Impact\n\nThere is a potential vulnerability in Traefik managing the `Connection` header with `X-Forwarded` headers.\n\nWhen Traefik processes HTTP/1.1 requests, the protection put in place to prevent the removal of Traefik-managed `X-Forwarded` headers (such as `X-Real-Ip`, `X-Forwarded-Host`, `X-Forwarded-Port`, etc.) via the `Connection` header does not handle case sensitivity correctly. The `Connection` tokens are compared case-sensitively against the protected header names, but the actual header deletion operates case-insensitively. As a result, a remote unauthenticated client can use lowercase `Connection` tokens (e.g. `Connection: x-real-ip`) to bypass the protection and trigger the removal of Traefik-managed forwarded identity headers.\n\nThis is a bypass of the fix for [CVE-2024-45410](https://github.com/traefik/traefik/security/advisories/GHSA-62c8-mh53-4cqv).\n\nDepending on the deployment, the impact may be higher if downstream services rely on these headers (such as `X-Real-Ip` or `X-Forwarded-*`) for authentication, authorization, routing, or scheme decisions.\n\n## Patches\n\n- https://github.com/traefik/traefik/releases/tag/v2.11.38\n- https://github.com/traefik/traefik/releases/tag/v3.6.9\n\n## Workarounds\n\nNo workaround available.\n\n## For more information\n\nIf there are any questions or comments about this advisory, please [open an issue](https://github.com/traefik/traefik/issues).\n\n---\n\n<details>\n<summary>Original Description</summary>\n\nTraefik's XForwarded middleware (removeConnectionHeaders) tries to prevent clients from using the Connection header to strip trusted X-Forwarded-* headers, but the protection compares the Connection tokens case-sensitively while the deletion is case-insensitive.\n\nAs a result, a remote unauthenticated client can send a lowercase token like Connection: x-real-ip and still trigger deletion of traefik-managed X-Real-Ip (and similarly named headers in the managed list).\n\nThis can cause downstream routing, scheme, and header-based authn/authz decisions to be evaluated with missing trusted forwarding identity headers.\n\n### Severity\n\nCRITICAL\n\nRationale: the PoC demonstrates an end-to-end access control bypass pattern when a downstream service uses proxy-provided identity headers (for example, X-Real-Ip) for IP allowlists or trust decisions. A remote unauthenticated client can strip the traefik-managed identity header via a lowercase Connection token, causing the downstream service to evaluate the request without the expected header signal.\n\n### Relevant Links\n\n- Repository: https://github.com/traefik/traefik\n- Pinned commit: a4a91344edcdd6276c1b766ca19ee3f0e346480f\n- Callsite (pinned): https://github.com/traefik/traefik/blob/a4a91344edcdd6276c1b766ca19ee3f0e346480f/pkg/middlewares/forwardedheaders/forwarded_header.go#L225\n\n### Vulnerability Details\n\n#### Root Cause\n\nremoveConnectionHeaders uses a case-sensitive membership check for protected header names when inspecting Connection tokens, but it deletes headers via net/http which treats header names case-insensitively. A lowercase token bypasses the protection check and still triggers deletion.\n\n#### Attacker Control / Attack Path\n\nRemote unauthenticated HTTP client (untrusted IP) sends Connection: x-real-ip, and Traefik deletes the generated X-Real-Ip header.\n\n### Proof of Concept\n\nThe attached poc.zip contains a deterministic, make-based integration PoC with a canonical run and a negative control.\n\nCanonical (vulnerable):\n\n unzip poc.zip -d poc\n cd poc\n make test\n\nOutput contains:\n\n [CALLSITE_HIT]: pkg/middlewares/forwardedheaders/forwarded_header.go:225\n [PROOF_MARKER]: downstream_admin_bypass=1 x_real_ip_present=0\n\nControl (same env, no lowercase token):\n\n unzip poc.zip -d poc\n cd poc\n make test\n\nOutput contains:\n\n [CALLSITE_HIT]: pkg/middlewares/forwardedheaders/forwarded_header.go:225\n [NC_MARKER]: downstream_admin_bypass=0 x_real_ip_present=1\n\nExpected: Connection tokens are handled case-insensitively and protected identity headers (for example, X-Real-Ip and X-Forwarded-*) are not deleted due to client-supplied Connection options (regardless of token casing).\n\nActual: Lowercase Connection tokens bypass the protection check and still trigger deletion of traefik-managed identity headers (for example, X-Real-Ip).\n\n### Recommended Fix\n\n- Case-fold (or otherwise canonicalize) Connection header tokens before comparing them against protected header names.\n- Add a regression test covering lowercase tokens (for example, Connection: x-real-ip).\n\nFix accepted when: a request with Connection: x-real-ip does not cause deletion of traefik-managed X-Real-Ip, and a regression test covers this behavior.\n\n</details>",
|
||||
"published_at": "2026-03-04T21:19:08Z",
|
||||
"updated_at": "2026-03-05T22:46:31.066201Z",
|
||||
"severity": "low",
|
||||
"cvss_score": 3.1,
|
||||
"title": "traefik CVE-2024-45410 fix bypass: lowercase `Connection` tokens can delete traefik-managed forwarded identity headers (for example, `X-Real-Ip`) in github.com/traefik/traefik",
|
||||
"summary": "traefik CVE-2024-45410 fix bypass: lowercase `Connection` tokens can delete traefik-managed forwarded identity headers (for example, `X-Real-Ip`) in github.com/traefik/traefik",
|
||||
"published_at": "2026-03-10T18:28:10Z",
|
||||
"updated_at": "2026-03-23T04:53:13.381024Z",
|
||||
"severity": "unknown",
|
||||
"cvss_score": null,
|
||||
"exploit_status": "unknown",
|
||||
"source_confidence": "official",
|
||||
"official_source_url": "https://github.com/traefik/traefik/security/advisories/GHSA-92mv-8f8w-wq52",
|
||||
"secondary_source_urls": [
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2026-29054",
|
||||
"https://github.com/traefik/traefik",
|
||||
"https://github.com/traefik/traefik/releases/tag/v2.11.38",
|
||||
"https://github.com/traefik/traefik/releases/tag/v3.6.9"
|
||||
],
|
||||
"aliases": [
|
||||
"CVE-2026-29054",
|
||||
"GHSA-92mv-8f8w-wq52"
|
||||
"GHSA-92mv-8f8w-wq52",
|
||||
"GO-2026-4597"
|
||||
],
|
||||
"cve_ids": [
|
||||
"CVE-2026-29054"
|
||||
@@ -30,9 +30,10 @@
|
||||
"GHSA-92mv-8f8w-wq52"
|
||||
],
|
||||
"osv_ids": [
|
||||
"GHSA-92mv-8f8w-wq52"
|
||||
"GO-2026-4597"
|
||||
],
|
||||
"affected_versions": [
|
||||
"introduced=0",
|
||||
"introduced=2.11.9, fixed<2.11.38",
|
||||
"introduced=3.1.3, fixed<3.6.9"
|
||||
],
|
||||
@@ -46,9 +47,7 @@
|
||||
"secure_code_topics": [
|
||||
"proxy-trust-boundary",
|
||||
"request-smuggling-boundary",
|
||||
"token-cookie-storage",
|
||||
"authz-server-side-recheck",
|
||||
"dependency-upgrade-policy"
|
||||
"token-cookie-storage"
|
||||
],
|
||||
"status": "generated",
|
||||
"triage_reasons": [],
|
||||
@@ -78,6 +77,7 @@
|
||||
}
|
||||
],
|
||||
"affected_version_ranges": [
|
||||
"introduced=0",
|
||||
"introduced=2.11.9, fixed<2.11.38",
|
||||
"introduced=3.1.3, fixed<3.6.9"
|
||||
],
|
||||
@@ -90,11 +90,11 @@
|
||||
"version_evidence_sources": [
|
||||
"https://github.com/traefik/traefik/security/advisories/GHSA-92mv-8f8w-wq52",
|
||||
"https://nvd.nist.gov/vuln/detail/CVE-2026-29054",
|
||||
"https://github.com/traefik/traefik",
|
||||
"https://github.com/traefik/traefik/releases/tag/v2.11.38",
|
||||
"https://github.com/traefik/traefik/releases/tag/v3.6.9"
|
||||
],
|
||||
"affected_version_refs": [
|
||||
"traefik--repo--github-com-traefik-traefik-v3--introduced-0",
|
||||
"traefik--repo--github-com-traefik-traefik-v3--introduced-2-11-9-fixed-2-11-38",
|
||||
"traefik--repo--github-com-traefik-traefik-v3--introduced-3-1-3-fixed-3-6-9"
|
||||
],
|
||||
@@ -112,26 +112,27 @@
|
||||
"version_resolution_needed": false,
|
||||
"workflow": {
|
||||
"workflow_id": "traefik--CVE-2026-29054--workflow",
|
||||
"vuln_family": "authz-bypass",
|
||||
"entry_surface": "privileged-route-or-object-reference",
|
||||
"vuln_family": "session-token",
|
||||
"entry_surface": "session-or-token-processing",
|
||||
"preconditions": [
|
||||
"\u4ec5\u5728 lab-local\u3001lab-public \u6216\u660e\u786e\u6388\u6743\u76ee\u6807\u4e2d\u6267\u884c\u3002",
|
||||
"\u786e\u8ba4\u76ee\u6807\u547d\u4e2d\u7248\u672c\u65ad\u8a00: introduced=2.11.9, fixed<2.11.38, introduced=3.1.3, fixed<3.6.9",
|
||||
"\u786e\u8ba4\u76ee\u6807\u547d\u4e2d\u7248\u672c\u65ad\u8a00: introduced=0, introduced=2.11.9, fixed<2.11.38, introduced=3.1.3, fixed<3.6.9",
|
||||
"\u82e5\u5bf9\u8c61\u5c5e\u4e8e `repo`\uff0c\u5148\u786e\u8ba4\u6269\u5c55/\u4ed3\u5e93/\u5305\u5df2\u542f\u7528\u5e76\u5904\u4e8e\u53d7\u5f71\u54cd\u7248\u672c\u3002"
|
||||
],
|
||||
"required_role": "cross-tenant-or-low-privileged-user",
|
||||
"required_role": "authenticated-user",
|
||||
"affected_version_assertion": [
|
||||
"introduced=0",
|
||||
"introduced=2.11.9, fixed<2.11.38",
|
||||
"introduced=3.1.3, fixed<3.6.9"
|
||||
],
|
||||
"trigger_vector": "\u5bf9 `authz-bypass` \u5bb6\u65cf\u5165\u53e3\u6295\u9012\u6700\u5c0f\u5316\u3001\u53ef\u5ba1\u8ba1\u3001\u53ef\u56de\u6eda\u7684\u53d7\u63a7\u8f93\u5165\uff0c\u6bd4\u8f83\u4fee\u590d\u524d\u540e\u5dee\u5f02\u3002",
|
||||
"trigger_vector": "\u5bf9 `session-token` \u5bb6\u65cf\u5165\u53e3\u6295\u9012\u6700\u5c0f\u5316\u3001\u53ef\u5ba1\u8ba1\u3001\u53ef\u56de\u6eda\u7684\u53d7\u63a7\u8f93\u5165\uff0c\u6bd4\u8f83\u4fee\u590d\u524d\u540e\u5dee\u5f02\u3002",
|
||||
"request_or_ui_path": [
|
||||
"/admin/*",
|
||||
"/api/private/*",
|
||||
"/tenant/*"
|
||||
"/login",
|
||||
"/callback",
|
||||
"/session"
|
||||
],
|
||||
"input_shape": "\u4f7f\u7528\u4f4e\u6743\u9650\u8eab\u4efd\u8bbf\u95ee\u9ad8\u6743\u9650\u5bf9\u8c61\u6216\u8de8\u79df\u6237\u8d44\u6e90\u3002",
|
||||
"expected_unsafe_behavior": "\u4f4e\u6743\u9650\u8eab\u4efd\u53ef\u8bbf\u95ee\u672c\u4e0d\u5e94\u53ef\u89c1\u7684\u6570\u636e\u6216\u64cd\u4f5c\u3002",
|
||||
"input_shape": "\u4f7f\u7528\u77ed\u671f\u6d4b\u8bd5\u4ee4\u724c\u6216\u4f1a\u8bdd\uff0c\u9a8c\u8bc1\u751f\u547d\u5468\u671f\u3001\u7ed1\u5b9a\u4e0e\u5931\u6548\u903b\u8f91\u3002",
|
||||
"expected_unsafe_behavior": "\u4ee4\u724c\u6216\u4f1a\u8bdd\u53ef\u88ab\u91cd\u653e\u3001\u56fa\u5b9a\u6216\u8d8a\u6743\u4f7f\u7528\u3002",
|
||||
"server_evidence_points": [
|
||||
"\u5e94\u7528\u65e5\u5fd7\u4e2d\u7684\u547d\u4e2d\u8def\u5f84\u3001\u9274\u6743\u51b3\u7b56\u548c\u5f02\u5e38\u6808",
|
||||
"\u53cd\u5411\u4ee3\u7406\u6216\u8fb9\u754c\u5c42\u65e5\u5fd7\u4e2d\u7684\u8bf7\u6c42\u5934\u3001\u6765\u6e90 IP \u4e0e\u8def\u7531\u51b3\u7b56"
|
||||
@@ -150,10 +151,10 @@
|
||||
],
|
||||
"mitigation_summary": "\u4f18\u5148\u5347\u7ea7\u5230\u4fee\u590d\u7248\u672c\uff0c\u5e76\u540c\u65f6\u6536\u7d27\u8f93\u5165\u6821\u9a8c\u3001\u670d\u52a1\u7aef\u9274\u6743\u3001\u4ee3\u7406\u4fe1\u4efb\u8fb9\u754c\u3001\u6269\u5c55\u5b89\u88c5\u4fe1\u4efb\u548c\u5ba1\u8ba1\u65e5\u5fd7\u3002",
|
||||
"patch_validation_steps": [
|
||||
"\u786e\u8ba4\u76ee\u6807\u7248\u672c\u4ece `introduced=2.11.9, fixed<2.11.38, introduced=3.1.3, fixed<3.6.9` \u5347\u7ea7\u6216\u56de\u79fb\u5230 `2.11.38`\u3002",
|
||||
"\u786e\u8ba4\u76ee\u6807\u7248\u672c\u4ece `introduced=0, introduced=2.11.9, fixed<2.11.38, introduced=3.1.3, fixed<3.6.9` \u5347\u7ea7\u6216\u56de\u79fb\u5230 `2.11.38`\u3002",
|
||||
"\u4fdd\u7559\u540c\u4e00\u7ec4\u53d7\u63a7\u8f93\u5165\uff0c\u5728\u4fee\u590d\u524d\u540e\u5206\u522b\u6267\u884c\u5e76\u6bd4\u5bf9\u54cd\u5e94\u3001\u65e5\u5fd7\u4e0e\u6d4f\u89c8\u5668\u8bc1\u636e\u3002",
|
||||
"\u786e\u8ba4\u4fee\u590d\u540e\u4ec5\u4fdd\u7559\u9884\u671f\u4e1a\u52a1\u884c\u4e3a\uff0c\u4e0d\u518d\u89e6\u53d1\u8d8a\u6743\u3001\u56de\u663e\u3001\u5f02\u5e38\u6e32\u67d3\u6216\u9519\u8bef\u8bf7\u6c42\u3002",
|
||||
"\u8865\u5145 `authz-bypass` \u65cf\u81ea\u52a8\u5316\u56de\u5f52\uff0c\u907f\u514d\u540c\u7c7b\u8def\u5f84\u5728\u63d2\u4ef6\u3001\u4e3b\u9898\u6216\u4ee3\u7406\u94fe\u4e2d\u56de\u5f52\u3002"
|
||||
"\u8865\u5145 `session-token` \u65cf\u81ea\u52a8\u5316\u56de\u5f52\uff0c\u907f\u514d\u540c\u7c7b\u8def\u5f84\u5728\u63d2\u4ef6\u3001\u4e3b\u9898\u6216\u4ee3\u7406\u94fe\u4e2d\u56de\u5f52\u3002"
|
||||
],
|
||||
"lab_safety_notes": [
|
||||
"\u53ea\u4f7f\u7528\u56de\u73af\u5730\u5740\u3001\u54e8\u5175\u76ee\u6807\u3001\u65e0\u5bb3\u6837\u672c\u6216\u53ef\u56de\u6eda\u6d4b\u8bd5\u6570\u636e\u3002",
|
||||
@@ -174,7 +175,7 @@
|
||||
"present": false,
|
||||
"refs": []
|
||||
},
|
||||
"repro_profile_id": "authz-bypass-generic",
|
||||
"repro_profile_id": "proxy-boundary-generic",
|
||||
"artifact_mode": "synthetic",
|
||||
"blocked_reason": null,
|
||||
"metadata": {
|
||||
|
||||
在新工单中引用
屏蔽一个用户