On 07/02/17 18:13, csuth...@apache.org wrote:
Author: csutherl
Date: Tue Feb  7 18:13:40 2017
New Revision: 1782037

URL: http://svn.apache.org/viewvc?rev=1782037&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=60594
Adding implementation of whitelist patch

Modified:
    tomcat/tc8.5.x/trunk/conf/catalina.properties
    tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
    tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml
    tomcat/tc8.5.x/trunk/webapps/docs/config/systemprops.xml

Modified: tomcat/tc8.5.x/trunk/conf/catalina.properties
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/conf/catalina.properties?rev=1782037&r1=1782036&r2=1782037&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/conf/catalina.properties (original)
+++ tomcat/tc8.5.x/trunk/conf/catalina.properties Tue Feb  7 18:13:40 2017
@@ -146,3 +146,6 @@ tomcat.util.buf.StringCache.byte.enabled
 #tomcat.util.buf.StringCache.char.enabled=true
 #tomcat.util.buf.StringCache.trainThreshold=500000
 #tomcat.util.buf.StringCache.cacheSize=5000
+
+# Allow for changes to HTTP request validation

I'd add here:

# WARNING: Using this option will expose the server to CVE-2016-6816

+#tomcat.util.http.parser.HttpParser.requestTargetAllow=|

Modified: 
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java?rev=1782037&r1=1782036&r2=1782037&view=diff
==============================================================================
--- 
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java 
(original)
+++ 
tomcat/tc8.5.x/trunk/java/org/apache/tomcat/util/http/parser/HttpParser.java 
Tue Feb  7 18:13:40 2017
@@ -19,6 +19,9 @@ package org.apache.tomcat.util.http.pars
 import java.io.IOException;
 import java.io.StringReader;

+import org.apache.juli.logging.Log;
+import org.apache.juli.logging.LogFactory;
+
 /**
  * HTTP header value parser implementation. Parsing HTTP headers as per RFC2616
  * is not always as simple as it first appears. For headers that only use 
tokens
@@ -34,6 +37,8 @@ import java.io.StringReader;
  */
 public class HttpParser {

+    private static final Log log = LogFactory.getLog(HttpParser.class);
+
     private static final int ARRAY_SIZE = 128;

     private static final boolean[] IS_CONTROL = new boolean[ARRAY_SIZE];
@@ -42,8 +47,22 @@ public class HttpParser {
     private static final boolean[] IS_HEX = new boolean[ARRAY_SIZE];
     private static final boolean[] IS_NOT_REQUEST_TARGET = new 
boolean[ARRAY_SIZE];
     private static final boolean[] IS_HTTP_PROTOCOL = new boolean[ARRAY_SIZE];
+    private static final boolean[] REQUEST_TARGET_ALLOW = new 
boolean[ARRAY_SIZE];

     static {
+        String prop = 
System.getProperty("tomcat.util.http.parser.HttpParser.requestTargetAllow");
+        if (prop != null) {
+            for (int i = 0; i < prop.length(); i++) {
+                char c = prop.charAt(i);
+                if (c == '{' || c == '}' || c == '|') {
+                    REQUEST_TARGET_ALLOW[c] = true;
+                } else {
+                    log.warn("HttpParser: Character '" + c + "' is not allowed and 
will continue "
+                        + "being rejected.");

This should use the StringManager for i18n support.

Also "... will continue to be rejected." sounds better.

+                }
+            }
+        }
+
         for (int i = 0; i < ARRAY_SIZE; i++) {
             // Control> 0-31, 127
             if (i < 32 || i == 127) {
@@ -74,7 +93,9 @@ public class HttpParser {
             if (IS_CONTROL[i] || i > 127 ||
                     i == ' ' || i == '\"' || i == '#' || i == '<' || i == '>' 
|| i == '\\' ||
                     i == '^' || i == '`'  || i == '{' || i == '|' || i == '}') 
{
-                IS_NOT_REQUEST_TARGET[i] = true;
+                if (!REQUEST_TARGET_ALLOW[i]) {
+                    IS_NOT_REQUEST_TARGET[i] = true;
+                }
             }

             // Not valid for HTTP protocol

Modified: tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml?rev=1782037&r1=1782036&r2=1782037&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/tc8.5.x/trunk/webapps/docs/changelog.xml Tue Feb  7 18:13:40 2017
@@ -103,6 +103,12 @@
         Ensure that executor thread pools used with connectors, pre-start the
         configured minimum number of idle threads. (markt)
       </fix>
+      <add>
+        <bug>60594</bug>: Allow some invalid characters that were recently
+        restricted to be processed in requests by using the system property
+        <code>tomcat.util.http.parser.HttpParser.requestTargetAllow</code>.
+        (csutherl)
+      </add>
     </changelog>
   </subsection>
   <subsection name="Jasper">

Modified: tomcat/tc8.5.x/trunk/webapps/docs/config/systemprops.xml
URL: 
http://svn.apache.org/viewvc/tomcat/tc8.5.x/trunk/webapps/docs/config/systemprops.xml?rev=1782037&r1=1782036&r2=1782037&view=diff
==============================================================================
--- tomcat/tc8.5.x/trunk/webapps/docs/config/systemprops.xml (original)
+++ tomcat/tc8.5.x/trunk/webapps/docs/config/systemprops.xml Tue Feb  7 
18:13:40 2017
@@ -639,6 +639,14 @@
       <p>If not specified, the default value of <code>3</code> will be 
used.</p>
     </property>

+    <property name="tomcat.util.http.parser.HttpParser.requestTargetAllow">
+      <p>A string comprised of characters the server should allow even when 
they are not encoded.
+      These characters would normally result in a 400 status.</p>
+      <p>The acceptable characters for this property are: <code>|</code>, 
<code>{</code>
+      , and <code>}</code></p>
+      <p>If not specified, the default value of <code>null</code> will be 
used.</p>

Again, I'd add something along the lines of:

<strong>WARNING</strong>: Use of this option will expose the server to CVE-2016-6816.

+    </property>
+
   </properties>

 </section>



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



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

Reply via email to