https://issues.apache.org/bugzilla/show_bug.cgi?id=53801

          Priority: P2
            Bug ID: 53801
          Assignee: dev@tomcat.apache.org
           Summary: Nondeterministic behaviour of security constraints
          Severity: normal
    Classification: Unclassified
          Reporter: matteo.maria.casal...@sap.com
          Hardware: PC
            Status: NEW
           Version: 7.0.29
         Component: Servlet & JSP API
           Product: Tomcat 7

Created attachment 29303
  --> https://issues.apache.org/bugzilla/attachment.cgi?id=29303&action=edit
test web application that reproduces the issue

I'm experiencing a weird behaviour with certain combinations of security
constraints having
the following pattern:
(i) one security constraint applies to (at least) two overlapping URL patterns
ending in /*,
where one is more specific than the other (e.g., /a/* and /a/b/*)
(ii) a second security constraint applies only to the less specific URL pattern
(e.g. /a/*),
and
(iii) the two security constraints apply to different (possibly overlapping)
sets of methods.

One such example is as follows:

<servlet-mapping>
  <servlet-name>test</servlet-name>
  <url-pattern>/*</url-pattern>
</servlet-mapping>
<login-config>
  <auth-method>BASIC</auth-method>
  <realm-name>test</realm-name>
</login-config>

<security-constraint>
  <web-resource-collection>
    <web-resource-name/>
      <url-pattern>/a/*</url-pattern>
      <url-pattern>/a/b/*</url-pattern>
      <http-method>POST</http-method>
  </web-resource-collection>
</security-constraint>

<security-constraint>
  <web-resource-collection>
    <web-resource-name/>
      <url-pattern>/a/*</url-pattern>
        <http-method>GET</http-method>
    </web-resource-collection>
    <auth-constraint/>
</security-constraint>

The problem occurs for HTTP requests matching to the most specific URL pattern
(in the above
example, /a/b, /a/b/c, etc.), but on methods other than the ones mentioned in
the first security
constraint (in the above example, GET).

For instance, each time I deploy a web application with the above-mentioned
deployment descriptor
in Tomcat, or each time I redeploy it or restart the server in case it is
already deployed,
I get randomly either of the two following behaviours:

1) "GET /a/b" requests are allowed, i.e. no authentication is required
2) "GET /a/b" requests are denied, i.e. the response requires authentication
(HTTP 401)

Notice that the behaviour remains then constant until I restart the server or
re-deploy the
application. Also, adding arbitrary roles in either of the two
auth-constraints, does not
seem to change the result.

According to the Java Servlet Specification, 1) is the correct behaviour. In
fact, such requests
shall be allowed to any (possibly unauthenticated) users, because the
constraint with the
most specific pattern (the first one) matches to the request, but it does not
mention the
method of the request (GET).

I tested several different combinations of security constraints, but this issue
seems to occur
only with those of this kind.


Please find attached a WAR that produces the above behaviour.

Here are some HTTP requests I tested together with the expected and actual
results:

HTTP Request      Expected HTTP Response    Observed Behaviour
GET /test/a       403                       Always correct
GET /test/b       200                       Always correct
GET /test/a/b     200                       Sometimes incorrect (401 is given)
GET /test/a/b/    200                       Sometimes incorrect (401 is given)
GET /test/a/b/c   200                       Sometimes incorrect (401 is given)

-- 
You are receiving this mail because:
You are the assignee for the bug.

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org
For additional commands, e-mail: dev-h...@tomcat.apache.org

Reply via email to