]> git.ipfire.org Git - thirdparty/krb5.git/commitdiff
Allow gss_unwrap_iov() of unpadded RC4 tokens 1093/head
authorGreg Hudson <ghudson@mit.edu>
Sun, 12 Jul 2020 01:57:30 +0000 (21:57 -0400)
committerGreg Hudson <ghudson@mit.edu>
Wed, 22 Jul 2020 19:16:27 +0000 (15:16 -0400)
Windows Remote Management, when used with an RC4 session key, appears
to generate GSS wrap tokens with no padding instead of the expected
one byte (RFC 4757 section 7.3).  These tokens cannot be decoded with
gss_unwrap() or a STREAM buffer (even with Microsoft SSPI), but SSPI
allows them to be decoded using explicit IOVs with either a
zero-length padding buffer or no padding buffer.  Allow these cases to
work in kg_fixup_padding_iov().  (It is already possible to make this
work with HEADER | DATA | DATA, but only by
accident--kg_fixup_padding_iov() doesn't find a data buffer because
kg_locate_iov() only looks for singleton buffers, so it exits early.)

ticket: 8926 (new)
tags: pullup
target_version: 1.18-next

src/lib/gssapi/krb5/util_crypt.c

index c9aaafd11d3066c98473ba5022458e06183b8bf9..84f19498874abcc480a11513f6da85459833a527 100644 (file)
@@ -649,16 +649,13 @@ kg_fixup_padding_iov(OM_uint32 *minor_status, gss_iov_buffer_desc *iov,
     data = kg_locate_iov(iov, iov_count, GSS_IOV_BUFFER_TYPE_DATA);
     padding = kg_locate_iov(iov, iov_count, GSS_IOV_BUFFER_TYPE_PADDING);
 
-    if (data == NULL) {
+    /* Do nothing if padding is absent or empty, to allow unwrapping of WinRM
+     * unpadded RC4 tokens using an explicit IOV array. */
+    if (data == NULL || padding == NULL || padding->buffer.length == 0) {
         *minor_status = 0;
         return GSS_S_COMPLETE;
     }
 
-    if (padding == NULL || padding->buffer.length == 0) {
-        *minor_status = EINVAL;
-        return GSS_S_FAILURE;
-    }
-
     p = (unsigned char *)padding->buffer.value;
     padlength = p[padding->buffer.length - 1];