Author: markt
Date: Tue Jan  2 21:32:41 2018
New Revision: 1819903

URL: http://svn.apache.org/viewvc?rev=1819903&view=rev
Log:
Fix https://bz.apache.org/bugzilla/show_bug.cgi?id=61948
Improve the handling of malformed ClientHello messages in the code that 
extracts the SNI information from a TLS handshake for the JSSE based NIO and 
NIO2 connectors.

Added:
    
tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java   
(with props)
Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties
    tomcat/trunk/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java
    tomcat/trunk/webapps/docs/changelog.xml

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties?rev=1819903&r1=1819902&r2=1819903&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/LocalStrings.properties Tue 
Jan  2 21:32:41 2018
@@ -126,6 +126,7 @@ jsse.invalid_truststore_password=The pro
 jsse.keystore_load_failed=Failed to load keystore type [{0}] with path [{1}] 
due to [{2}]
 jsse.ssl3=SSLv3 has been explicitly enabled. This protocol is known to be 
insecure.
 
+sniExtractor.clientHelloInvalid=The ClientHello message was not correctly 
formatted
 sniExtractor.clientHelloTooBig=The ClientHello was not presented in a single 
TLS record so no SNI information could be extracted
 
 socket.closed=The socket associated with this connection has been closed.

Modified: 
tomcat/trunk/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java?rev=1819903&r1=1819902&r2=1819903&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java 
(original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/TLSClientHelloExtractor.java 
Tue Jan  2 21:32:41 2018
@@ -16,6 +16,8 @@
  */
 package org.apache.tomcat.util.net;
 
+import java.io.IOException;
+import java.nio.BufferUnderflowException;
 import java.nio.ByteBuffer;
 import java.nio.charset.StandardCharsets;
 import java.util.ArrayList;
@@ -52,8 +54,9 @@ public class TLSClientHelloExtractor {
      * exits.
      *
      * @param netInBuffer The buffer containing the TLS data to process
+     * @throws IOException If the client hello message is malformed
      */
-    public TLSClientHelloExtractor(ByteBuffer netInBuffer) {
+    public TLSClientHelloExtractor(ByteBuffer netInBuffer) throws IOException {
         // TODO: Detect use of http on a secure connection and provide a simple
         //       error page.
 
@@ -143,6 +146,8 @@ public class TLSClientHelloExtractor {
                 }
             }
             result = ExtractorResult.COMPLETE;
+        } catch (BufferUnderflowException | IllegalArgumentException e) {
+            throw new 
IOException(sm.getString("sniExtractor.clientHelloInvalid"), e);
         } finally {
             this.result = result;
             this.clientRequestedCiphers = clientRequestedCiphers;

Added: 
tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java?rev=1819903&view=auto
==============================================================================
--- 
tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java 
(added)
+++ 
tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java 
Tue Jan  2 21:32:41 2018
@@ -0,0 +1,89 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You under the Apache License, Version 2.0
+ *  (the "License"); you may not use this file except in compliance with
+ *  the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.tomcat.util.net;
+
+import java.io.IOException;
+import java.nio.ByteBuffer;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+import org.apache.tomcat.util.net.TLSClientHelloExtractor.ExtractorResult;
+
+public class TestTLSClientHelloExtractor {
+
+    @Test
+    public void testInputNeedRead01() throws IOException {
+        ByteBuffer testInput = ByteBuffer.allocate(1024);
+        doTestInputNeedRead(testInput);
+    }
+
+
+    @Test(expected=IOException.class)
+    public void testInputMalformed01() throws IOException {
+        ByteBuffer testInput = ByteBuffer.allocate(1024);
+
+        // TLS handshake
+        testInput.put((byte) 22);
+        // TLS 1.0
+        testInput.put((byte) 3);
+        testInput.put((byte) 1);
+        // Record length 0 (correct, but not legal)
+        testInput.put((byte) 0);
+        testInput.put((byte) 0);
+
+        doTestInputNeedRead(testInput);
+    }
+
+
+    @Test(expected=IOException.class)
+    public void testInputMalformed02() throws IOException {
+        ByteBuffer testInput = ByteBuffer.allocate(1024);
+
+        // TLS handshake
+        testInput.put((byte) 22);
+        // TLS 1.0
+        testInput.put((byte) 3);
+        testInput.put((byte) 1);
+        // Record length 4
+        testInput.put((byte) 0);
+        testInput.put((byte) 4);
+        // Type 1 (client hello)
+        testInput.put((byte) 1);
+        // Client hello size 0 (correct, but not legal)
+        testInput.put((byte) 0);
+        testInput.put((byte) 0);
+        testInput.put((byte) 0);
+
+        doTestInputNeedRead(testInput);
+    }
+
+
+    public void doTestInputMalformed(ByteBuffer input) throws IOException {
+        TLSClientHelloExtractor extractor = new TLSClientHelloExtractor(input);
+        // Expect this to fail
+        extractor.getResult();
+    }
+
+
+    public void doTestInputNeedRead(ByteBuffer input) throws IOException {
+        TLSClientHelloExtractor extractor = new TLSClientHelloExtractor(input);
+        // Expect this to fail
+        ExtractorResult result = extractor.getResult();
+        Assert.assertEquals(ExtractorResult.NEED_READ, result);
+    }
+}

Propchange: 
tomcat/trunk/test/org/apache/tomcat/util/net/TestTLSClientHelloExtractor.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/webapps/docs/changelog.xml
URL: 
http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/changelog.xml?rev=1819903&r1=1819902&r2=1819903&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/changelog.xml (original)
+++ tomcat/trunk/webapps/docs/changelog.xml Tue Jan  2 21:32:41 2018
@@ -83,6 +83,11 @@
         Add support for the OpenSSL ARIA ciphers to the OpenSSL to JSSE
         cipher mapping. (markt)
       </add>
+      <fix>
+        <bug>61948</bug>: Improve the handling of malformed ClientHello 
messages
+        in the code that extracts the SNI information from a TLS handshake for
+        the JSSE based NIO and NIO2 connectors. (markt)
+      </fix>
     </changelog>
   </subsection>
   <subsection name="Jasper">



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

Reply via email to