Hello,

I recently learned that when a server that supports path parameters [0] — like 
Tomcat (I found Jetty also does) — is run behind a reverse proxy that does 
path-based access control checks and does not support path parameters, your 
combined setup could be vulnerable.

Consider this setup:

1. A Tomcat application without access restrictions
2. An reverse proxy that only allows requests to /v1/* on the Tomcat 
application. I’ve used Envoy on Kubernetes, configured via Istio’s Role-Based 
Access Control (RBAC), but also observed this issue with other proxies.

Now I send a request for /v1/..;color=red/internal/secret to the proxy.

- Envoy allows the request based on the /v1/* rule, because it does not support 
path parameters, because they are not part of any recent standard (RFC 2396 
dropped them in 1998 [1])
- Tomcat parses ;color=red as a path parameter, resolves the rest of the path 
to /v1/../internal/secret and consequently serves /internal/secret
- I’m pretty sure that whoever configured that RBAC policy did not want this to 
be possible

Note that:
- The client can request any URL on the Tomcat server via this path traversal 
attack.
- This also works with ‘empty’ path parameters, e.g. /v1/..;/internal/secret
- The URL doesn’t necessarily need to contain ‘..’ for naughtiness to be 
possible. When access to /public/secret would be restricted by the proxy, but 
other /public/* paths would be allowed, then an attacker would still be able to 
get the contents of /public/secret by requesting /public;/secret

The fact that different servers handle paths with path parameters differently 
seems to be known [2], but especially setups in which reverse proxies don’t 
support path parameters, but the servers behind them do, seems risky.

Would it be reasonable to create a ticket with a feature request for a flag to 
disable path parameter support in Tomcat? Or an even more secure suggestion: 
make path parameter support an opt-in feature, because it was dropped from the 
URI standard in 1998 and can make setups like I described vulnerable?

Thanks, Nils.

[0] RFC 1738 https://tools.ietf.org/html/rfc1738 
<https://tools.ietf.org/html/rfc1738> (1994) and RFC 1808 
https://tools.ietf.org/html/rfc1808 <https://tools.ietf.org/html/rfc1808> 
(1995).
[1] RFC 2396 G.4. Modifications from RFC 1808 
https://tools.ietf.org/html/rfc2396 <https://tools.ietf.org/html/rfc2396> 
(1998). Path parameters are also absent in RFC 3986 
https://tools.ietf.org/html/rfc3986 <https://tools.ietf.org/html/rfc3986> 
(2005).
[2] 
https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf
 
<https://i.blackhat.com/us-18/Wed-August-8/us-18-Orange-Tsai-Breaking-Parser-Logic-Take-Your-Path-Normalization-Off-And-Pop-0days-Out-2.pdf>
 slides 41 and further

Reply via email to