On Sep 9, 2007, at 1:00 PM, Ruediger Pluem wrote:
On 09/09/2007 04:30 PM, Nick Kew wrote:
On Sun, 09 Sep 2007 11:25:26 +0200
Ruediger Pluem <[EMAIL PROTECTED]> wrote:


On 09/09/2007 02:21 AM, Nick Kew wrote:
PR 41798 and many related ones (eg 39746, 38980 - both of which I've
closed today) show a history of incorrect URL-unescaping in
mod_proxy.

For PR41798, the attached patch looks like a fix: it just uses
r->unparsed_uri (escaped) instead of r->uri (unescaped) in
proxy_trans.  I'm wondering if using unparsed_uri here risks
breaking something or has security implications we need to
consider, bearing in mind we already unescaped it and thus
verified it is well-formed.
I think it has security implications, because

1. We do the proxy_walk *after* proxy_trans and the normal
configuration expects that all the shrinking transformations happened
correctly.

proxy_trans determines whether the request is to be ProxyPassed: if not, the patch has no effect on the request. The "filename" we just parsed is not used locally, it's passed to the backend. To pass it escaped is
indeed an RFC bug.

As an additional safeguard, we already checked the incoming URL was
well-formed when we parsed r->uri.

2. It can be used to circumvent ProxyPass / ProxyPassmatch settings by tricky encodings in order to sent requests to unintended locations.

How so?

ProxyPass /a http://backend/
ProxyPass /b http://backend/


<Proxy http://backend/a>
       allow from someip
       deny from all
</Proxy>

<Proxy http://backend/b>
       allow from someotherip
       deny from all
</Proxy>

Request:

GET /a/%2E%2E/b/somewhere
GET /a/../b/somewhere

This allows someip to access http://backend/b/somewhere with the patch.
It does not without because r->uri would be /b/somewhere.

Changes to the request URI must be referred back to the client in the
form of a redirect.  Any other choice will cause security holes in
the request chain, somewhere.

The proxy (when acting as a proxy) must not change the URI.

The reverse proxy (gateway) is just an origin server with a
stupid name -- it must send a redirect if it makes the above
change to a URI.

....Roy

Reply via email to