{"id":"GHSA-43jv-5j4x-qv67","revision":"576ee85472a640689e5e7acc8fc78469","records":[{"revision":"576ee85472a640689e5e7acc8fc78469","observedAt":"2026-10-24T13:19:41.952+00:00","statement":{"source":"osv","id":"GHSA-43jv-5j4x-qv67","aliases":["CVE-2026-42272","GO-2026-5108"],"title":"Heimdall: Case-sensitive handling of URL-encoded slashes may lead to inconsistent path interpretation","description":"### Summary\n\nHeimdall handles URL-encoded slashes (`%2F`) in a case-sensitive manner, while percent-encoding is defined to be case-insensitive. As a result, the lowercase equivalent (`%2f`) is not recognized and therefore not processed as expected when `allow_encoded_slashes` is set to `off` (the default setting).\n\nThis discrepancy can lead to differences in how request paths are interpreted by heimdall and upstream components, which may result in authorization bypass.\n\n**Note:** The issue can only lead to unintended access if heimdall is configured with an \"allow all\" default rule. Since v0.16.0, heimdall enforces secure defaults and refuses to start with such a configuration unless this enforcement is explicitly disabled (e.g. via `--insecure-skip-secure-default-rule-enforcement` or the broader `--insecure` flag).\n\n### Details\n\nConsider the following rule configuration:\n\n```yaml\nid: rule-1\nmatch:\n  routes:\n    - path: /admin/**\nexecute: # configured to require authentication and authorization\n  # ...\n```\n\nIf an adversary sends a request such as `/admin%2fsecret`, neither is the above rule matched, nor is the request rejected (as would be expected when `allow_encoded_slashes` is set to `off`). Instead, the default rule (if configured) will be executed.\n\nIf the configured default rule is overly permissive (e.g. allowing anonymous access), and the upstream service interprets `%2f` as a path separator, the request may ultimately be processed as `/admin/secret`.\n\nThis results in the request being authorized based on a different path than the one processed by the upstream service, leading to authorization bypass.\n\n### Impact\n\nBypass of access control policies enforced by heimdall may lead to the following consequences:\n\n* Access to or modification of data that should be restricted\n* Invocation of functionality that is expected to require authentication or authorization\n* In certain configurations, escalation of privileges depending on the exposed functionality\n\n\n### Workarounds\n\n* Developers should not use the `--insecure` or the `--insecure-skip-secure-default-rule-enforcement` flags and configure their default rule to implement \"deny by default\".\n* Reject HTTP paths containing encoded slashes in the layers in front of heimdall. Some proxies, like e.g., Traefik, do that by default.\n* Include the ID of the rule expected to be executed in the JWT issued by heimdall and verify that value in the project's service.","state":0,"publishedAt":"2026-04-25T23:29:40+00:00","modifiedAt":"2026-06-25T18:56:31.0513503+00:00","affected":[{"ecosystem":"Go","name":"github.com/dadrus/heimdall","ranges":[{"type":"SEMVER","events":[{"kind":"introduced","version":"0"},{"kind":"fixed","version":"0.17.14"}]}],"versions":[],"rawVersionEvidence":null}],"metrics":[{"system":"CVSS_V4","vector":"CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:N/VA:N/SC:H/SI:H/SA:N","score":null,"severity":null},{"system":"Publisher rating","vector":null,"score":null,"severity":"HIGH"}],"references":["https://github.com/dadrus/heimdall/security/advisories/GHSA-43jv-5j4x-qv67","https://nvd.nist.gov/vuln/detail/CVE-2026-42272","https://github.com/dadrus/heimdall/pull/3207","https://github.com/dadrus/heimdall/commit/8b0de6aba23a047cfee3081df878271bb17f4351","https://github.com/dadrus/heimdall","https://github.com/dadrus/heimdall/releases/tag/v0.17.14"],"sourceUrl":"https://github.com/advisories/GHSA-43jv-5j4x-qv67","license":"GitHub Advisory Database · CC-BY-4.0","key":"osv:GHSA-43jv-5j4x-qv67","identifiers":["GHSA-43jv-5j4x-qv67","CVE-2026-42272","GO-2026-5108"]},"retained":false,"historicalAffected":[]}],"coverage":[]}