Uploaded image for project: 'RHEL'
  1. RHEL
  2. RHEL-83833

RFE: Allow matching multiple wildcards

Linking RHIVOS CVEs to...Migration: Automation ...Sync from "Extern...XMLWordPrintable

    • Icon: Bug Bug
    • Resolution: Unresolved
    • Icon: Undefined Undefined
    • None
    • rhel-10.0
    • keyutils
    • None
    • rhel-fs-vfs
    • None
    • False
    • False
    • Hide

      None

      Show
      None
    • None
    • None
    • None
    • None
    • Unspecified
    • Unspecified
    • Unspecified
    • None

      Description of problem:

      In RHEL 7 and RHEL 8, the manpage for request-key.conf(5) states:

      <op> <type> <description> <callout-info> <prog> <arg1> <arg2> ...

      The first four fields are used to match the parameters passed to
      request-key by the kernel. op is the operation type; currently the
      only supported operation is "create".

      type, description and callout-info match the three parameters
      passed to keyctl request2 or the request_key() system call. Each of
      these may contain one or more asterisk '*' characters as wildcards
      anywhere within the string.

      However the code in keyutils.c states that only one asterisk is allowed in the entire pattern:

          /*****************************************************************************/
          /*
           * attempt to match a datum to a pattern
           * - one asterisk is allowed anywhere in the pattern to indicate a wildcard
           * - returns true if matched, false if not
           */
          static int match(const char *pattern, int plen, const char *datum, int dlen)
      

      And the manpage was (correctly) updated in RHEL 9 to state that only one asterisk was allowed.

      This is a request for enhancement to support multiple wildcards.

      Multiple wildcards are necessary in some cases where multiple dynamic fields exist, for example with cifs.spnego:

      ver=0x2;host=SERVER_HOSTNAME;ip4=SERVER_IP;sec=krb5;uid=0x0;creduid=0x0;user=USERNAME;pid=PID
      

      Version-Release number of selected component (if applicable):

      keyutils-1.5.10-9.el8.x86_64

      How reproducible:

      easy

      Steps to Reproduce:

      Attempt to match with multiple asterisks in the relevant request-key file:
      /etc/request-key.d/cifs.spnego.conf

      create  cifs.spnego    ver=*;host=*;ip4=*;sec=krb5;uid=0x0;creduid=0x0;user=MYUSER1@*,pid=* /usr/sbin/cifs.upcall -t /path/to/MYUSER1.keytab %k
      create  cifs.spnego    ver=*;host=*;ip4=*;sec=krb5;uid=0x0;creduid=0x0;user=MYUSER2@*,pid=* /usr/sbin/cifs.upcall -t /path/to/MYUSER2.keytab %k
      

      attempt to mount a cifs share using krb5 (it is not necessary to actually have cifs+kerberos set up correctly):

      # mount //server/share /mnt/tmp -o sec=krb5,user=MYUSER1
      # mount //server/share /mnt/tmp -o sec=krb5,user=MYUSER2
      

      Actual results:

      strings with multiple wildcards will not match

      Expected results:

      multiple wildcards are accepted, and work as described in the manpage

      Additional info:

      The RHEL 8 manpage says:

      Each of these may contain one or more asterisk '*' characters as wildcards anywhere within the string."
      

      but this was changed, and it now reads:

      Each of these may contain one asterisk '*' character as a wildcard anywhere within the string.
      

      in RHEL 9+

      the commit changing the manpage was:

      commit e8234d788e3be1801e5eebe4096b1d9e839023a6
      Author: David Howells <dhowells@redhat.com>
      Date:   Tue Sep 4 11:07:59 2018 +0100
      
          request-key: Find best match rather than first match
          
          When an upcall happens currently, either a file by the name
          "/etc/request-key.d/<type>.conf" is scanned or the default file
          "/etc/request-key.conf" is scanned and then the first match (including
          wildcards) is selected.
          
          Change this to read all the files in the conf directory and then read the
          default file.  The best rule is then chosen and executed.
          
          "Best" is defined as the rule with the least number of characters that are
          skipped by matching a wildcard (e.g. string "foo:bar" matches pattern
          "foo:*" with the number of characters being skipped being 3).
          
          Further, the operation, type, description and callout_info columns are
          matched individually and in order, so that a skip of 1 in the operation
          column, say, is less preferable than an exact match there and a skip of 2
          in the type column.
          
          For example, take:
          
                  create  dns_resolver afsdb:*    *       /sbin/key.afsdb %k
                  create  dns_resolver afsdb:*    hello*  /sbin/key.xxxx %k
          
          if both lines match, the second one will be picked, but, on the other hand,
          with:
          
                  create  dns_resolver afsdb:*    *       /sbin/key.afsdb %k
                  creat*  dns_resolver afsdb:*    hello*  /sbin/key.xxxx %k
          
          the first will be picked.
          
          Signed-off-by: David Howells <dhowells@redhat.com>
          Tested-by: Dave Jiang <dave.jiang@intel.com>
      

              rhn-support-dhowells David Howells
              rhn-support-rahsingh Rahul Singh
              David Howells David Howells
              Kun Wang Kun Wang
              Votes:
              1 Vote for this issue
              Watchers:
              6 Start watching this issue

                Created:
                Updated: