caddyhttp: Sanitize the path before evaluating path matchers #4407
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I found an issue where it's possible to bypass path matchers by crafting a request with a path that doubles up slashes, or uses URL-encoded characters to smuggle the request past the path matcher.
This becomes a security issue, because auth gates using
basicauth
can be bypassed 😬The solution is to unescape (convert URL-encoded characters) then clean the path, before matching.
This could be a breaking change if exact behaviour of the matcher is required (without cleaning the path). In that case, then it's possible to use the
expression
matcher to do a direct string comparison or regexp on the{http.request.uri.path}
placeholder (or simply{path}
in the Caddyfile). For example:Example of an exploitable situation:
It's expected that the path matcher
/secret-files*
will always requirebob
to be authenticated before they're let through to thefile_server
. But a request like//secret-files/uh-oh.txt
would punch through unmatched, reachingfile_server
. Thefile_server
handler does clean the path though (collapsing the doubled-up slashes), so it would serve/srv/secret-files/uh-oh.txt
back to the client.