]> granicus.if.org Git - sudo/commitdiff
Add support for matching the entire netgroup tuple (user, host, domain).
authorTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 12 Jan 2016 21:59:44 +0000 (14:59 -0700)
committerTodd C. Miller <Todd.Miller@courtesan.com>
Tue, 12 Jan 2016 21:59:44 +0000 (14:59 -0700)
13 files changed:
doc/sudoers.cat
doc/sudoers.man.in
doc/sudoers.mdoc.in
plugins/sudoers/def_data.c
plugins/sudoers/def_data.h
plugins/sudoers/def_data.in
plugins/sudoers/defaults.c
plugins/sudoers/ldap.c
plugins/sudoers/match.c
plugins/sudoers/parse.c
plugins/sudoers/parse.h
plugins/sudoers/sssd.c
plugins/sudoers/testsudoers.c

index c5ce069f5b053075d8860b5c08b50eb8da5da26d..ea1eb968cd86eed038b5452369fdcbc3680b9622 100644 (file)
@@ -890,14 +890,6 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        This flag is _\bo_\bn by default when s\bsu\bud\bdo\bo is compiled with
                        z\bzl\bli\bib\bb support.
 
-     use_netgroups     If set, netgroups (prefixed with `+'), may be used in
-                       place of a user or host.  For LDAP-based sudoers,
-                       netgroup support requires an expensive substring match
-                       on the server unless the N\bNE\bET\bTG\bGR\bRO\bOU\bUP\bP_\b_B\bBA\bAS\bSE\bE directive is
-                       present in the _\b/_\be_\bt_\bc_\b/_\bl_\bd_\ba_\bp_\b._\bc_\bo_\bn_\bf file.  If netgroups are
-                       not needed, this option can be disabled to reduce the
-                       load on the LDAP server.  This flag is _\bo_\bn by default.
-
      exec_background   By default, s\bsu\bud\bdo\bo runs a command as the foreground
                        process as long as s\bsu\bud\bdo\bo itself is running in the
                        foreground.  When the _\be_\bx_\be_\bc_\b__\bb_\ba_\bc_\bk_\bg_\br_\bo_\bu_\bn_\bd flag is enabled
@@ -1140,6 +1132,13 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        invoking user is not in the _\bs_\bu_\bd_\bo_\be_\br_\bs file.  This flag is
                        _\bo_\bn by default.
 
+     netgroup_tuple    If set, netgroup lookups will be performed using the
+                       full netgroup tuple: host name, user name and domain
+                       (if one is set).  Historically, s\bsu\bud\bdo\bo only matched the
+                       user name and domain for netgroups used in a User_List
+                       and only matched the host name and domain for netgroups
+                       used in a Host_List.  This flag is _\bo_\bf_\bf by default.
+
      noexec            If set, all commands run via s\bsu\bud\bdo\bo will behave as if the
                        NOEXEC tag has been set, unless overridden by an EXEC
                        tag.  See the description of _\bE_\bX_\bE_\bC _\ba_\bn_\bd _\bN_\bO_\bE_\bX_\bE_\bC above as
@@ -1337,6 +1336,14 @@ S\bSU\bUD\bDO\bOE\bER\bRS\bS O\bOP\bPT\bTI\bIO\bON\bNS\bS
                        available if s\bsu\bud\bdo\bo is configured with the
                        --with-logincap option.  This flag is _\bo_\bf_\bf by default.
 
+     use_netgroups     If set, netgroups (prefixed with `+'), may be used in
+                       place of a user or host.  For LDAP-based sudoers,
+                       netgroup support requires an expensive substring match
+                       on the server unless the N\bNE\bET\bTG\bGR\bRO\bOU\bUP\bP_\b_B\bBA\bAS\bSE\bE directive is
+                       present in the _\b/_\be_\bt_\bc_\b/_\bl_\bd_\ba_\bp_\b._\bc_\bo_\bn_\bf file.  If netgroups are
+                       not needed, this option can be disabled to reduce the
+                       load on the LDAP server.  This flag is _\bo_\bn by default.
+
      use_pty           If set, s\bsu\bud\bdo\bo will run the command in a pseudo-pty even
                        if no I/O logging is being gone.  A malicious program
                        run under s\bsu\bud\bdo\bo could conceivably fork a background
@@ -2498,4 +2505,4 @@ D\bDI\bIS\bSC\bCL\bLA\bAI\bIM\bME\bER\bR
      file distributed with s\bsu\bud\bdo\bo or https://www.sudo.ws/license.html for
      complete details.
 
-Sudo 1.8.16                     January 9, 2016                    Sudo 1.8.16
+Sudo 1.8.16                    January 12, 2016                    Sudo 1.8.16
index 3c7c9728fb5c9f8d7b38081245d8f4a08c652c79..00af9a3e231d996eb1409a283dbe478c8174c071 100644 (file)
@@ -21,7 +21,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.TH "SUDOERS" "5" "January 9, 2016" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
+.TH "SUDOERS" "5" "January 12, 2016" "Sudo @PACKAGE_VERSION@" "File Formats Manual"
 .nh
 .if n .ad l
 .SH "NAME"
@@ -1926,22 +1926,6 @@ is compiled with
 \fBzlib\fR
 support.
 .TP 18n
-use_netgroups
-If set, netgroups (prefixed with
-\(oq+\(cq),
-may be used in place of a user or host.
-For LDAP-based sudoers, netgroup support requires an expensive
-substring match on the server unless the
-\fBNETGROUP_BASE\fR
-directive is present in the
-\fI@ldap_conf@\fR
-file.
-If netgroups are not needed, this option can be disabled to reduce the
-load on the LDAP server.
-This flag is
-\fIon\fR
-by default.
-.TP 18n
 exec_background
 By default,
 \fBsudo\fR
@@ -2424,6 +2408,19 @@ This flag is
 \fI@mail_no_user@\fR
 by default.
 .TP 18n
+netgroup_tuple
+If set, netgroup lookups will be performed using the full netgroup
+tuple: host name, user name and domain (if one is set).
+Historically,
+\fBsudo\fR
+only matched the user name and domain for netgroups used in a
+\fRUser_List\fR
+and only matched the host name and domain for netgroups used in a
+\fRHost_List\fR.
+This flag is
+\fIoff\fR
+by default.
+.TP 18n
 noexec
 If set, all commands run via
 \fBsudo\fR
@@ -2842,6 +2839,22 @@ This flag is
 \fIoff\fR
 by default.
 .TP 18n
+use_netgroups
+If set, netgroups (prefixed with
+\(oq+\(cq),
+may be used in place of a user or host.
+For LDAP-based sudoers, netgroup support requires an expensive
+substring match on the server unless the
+\fBNETGROUP_BASE\fR
+directive is present in the
+\fI@ldap_conf@\fR
+file.
+If netgroups are not needed, this option can be disabled to reduce the
+load on the LDAP server.
+This flag is
+\fIon\fR
+by default.
+.TP 18n
 use_pty
 If set,
 \fBsudo\fR
index 4aff03ca8ea8e7934304ecead742eeb5771dd346..0d5c9fa3655a8073d63b02410fc05677f27867cc 100644 (file)
@@ -19,7 +19,7 @@
 .\" Agency (DARPA) and Air Force Research Laboratory, Air Force
 .\" Materiel Command, USAF, under agreement number F39502-99-1-0512.
 .\"
-.Dd January 9, 2016
+.Dd January 12, 2016
 .Dt SUDOERS @mansectform@
 .Os Sudo @PACKAGE_VERSION@
 .Sh NAME
@@ -1796,21 +1796,6 @@ by default when
 is compiled with
 .Sy zlib
 support.
-.It use_netgroups
-If set, netgroups (prefixed with
-.Ql + ) ,
-may be used in place of a user or host.
-For LDAP-based sudoers, netgroup support requires an expensive
-substring match on the server unless the
-.Sy NETGROUP_BASE
-directive is present in the
-.Pa @ldap_conf@
-file.
-If netgroups are not needed, this option can be disabled to reduce the
-load on the LDAP server.
-This flag is
-.Em on
-by default.
 .It exec_background
 By default,
 .Nm sudo
@@ -2276,6 +2261,18 @@ file.
 This flag is
 .Em @mail_no_user@
 by default.
+.It netgroup_tuple
+If set, netgroup lookups will be performed using the full netgroup
+tuple: host name, user name and domain (if one is set).
+Historically,
+.Nm sudo
+only matched the user name and domain for netgroups used in a
+.Li User_List
+and only matched the host name and domain for netgroups used in a
+.Li Host_List .
+This flag is
+.Em off
+by default.
 .It noexec
 If set, all commands run via
 .Nm sudo
@@ -2670,6 +2667,21 @@ option.
 This flag is
 .Em off
 by default.
+.It use_netgroups
+If set, netgroups (prefixed with
+.Ql + ) ,
+may be used in place of a user or host.
+For LDAP-based sudoers, netgroup support requires an expensive
+substring match on the server unless the
+.Sy NETGROUP_BASE
+directive is present in the
+.Pa @ldap_conf@
+file.
+If netgroups are not needed, this option can be disabled to reduce the
+load on the LDAP server.
+This flag is
+.Em on
+by default.
 .It use_pty
 If set,
 .Nm sudo
index e983263e43518e7ed90184a0991c486becebd2a4..6d7178232de0b92305f0aa6d5fcbf9dd2dc359dc 100644 (file)
@@ -398,6 +398,10 @@ struct sudo_defs_types sudo_defs_table[] = {
        "always_query_group_plugin", T_FLAG,
        N_("Query the group plugin for unknown system groups"),
        NULL,
+    }, {
+       "netgroup_tuple", T_FLAG,
+       N_("Match netgroups based on the entire tuple: user, host and domain"),
+       NULL,
     }, {
        NULL, 0, NULL
     }
index 5005812cf9f9dfbdcc777cfff68ffb861b54f10f..85f43c23a23d473615e4611db9dda6dcc62e1bfc 100644 (file)
 #define I_SUDOEDIT_FOLLOW       92
 #define def_always_query_group_plugin (sudo_defs_table[93].sd_un.flag)
 #define I_ALWAYS_QUERY_GROUP_PLUGIN93
+#define def_netgroup_tuple      (sudo_defs_table[94].sd_un.flag)
+#define I_NETGROUP_TUPLE        94
 
 enum def_tuple {
        never,
index 75e96079c42f5bd2602ff5877872c3289d834e13..db76d53426a3caf494d57ef0e91342995960343c 100644 (file)
@@ -295,3 +295,6 @@ sudoedit_follow
 always_query_group_plugin
        T_FLAG
        "Query the group plugin for unknown system groups"
+netgroup_tuple
+       T_FLAG
+       "Match netgroups based on the entire tuple: user, host and domain"
index 58960c09d9d35c1af80dae41ad33c07bdc015e33..2309c64c40283784692d94bb47112799e8445c09 100644 (file)
@@ -439,6 +439,7 @@ init_defaults(void)
 #ifdef HAVE_INNETGR
     def_use_netgroups = true;
 #endif
+    def_netgroup_tuple = false;
 
     /* Syslog options need special care since they both strings and ints */
 #if (LOGGING & SLOG_SYSLOG)
@@ -549,7 +550,7 @@ update_defaults(int what)
                break;
            case DEFAULTS_HOST:
                if (ISSET(what, SETDEF_HOST) &&
-                   hostlist_matches(def->binding) == ALLOW &&
+                   hostlist_matches(sudo_user.pw, def->binding) == ALLOW &&
                    !set_default(def->var, def->val, def->op))
                    rc = false;
                break;
index f5f62c14a7a6846171a4a9ddf7d99f77742fef48..11eef0eca2ffc2fe13f962d38266d2529779115b 100644 (file)
@@ -694,7 +694,8 @@ sudo_ldap_check_non_unix_group(LDAP *ld, LDAPMessage *entry, struct passwd *pw)
     for (p = bv; *p != NULL && !ret; p++) {
        val = (*p)->bv_val;
        if (*val == '+') {
-           if (netgr_matches(val, NULL, NULL, pw->pw_name))
+           if (netgr_matches(val, def_netgroup_tuple ? user_runhost : NULL,
+               def_netgroup_tuple ? user_srunhost : NULL, pw->pw_name))
                ret = true;
            DPRINTF2("ldap sudoUser netgroup '%s' ... %s", val,
                ret ? "MATCH!" : "not");
@@ -716,7 +717,7 @@ sudo_ldap_check_non_unix_group(LDAP *ld, LDAPMessage *entry, struct passwd *pw)
 * host match, else false.
 */
 static bool
-sudo_ldap_check_host(LDAP *ld, LDAPMessage *entry)
+sudo_ldap_check_host(LDAP *ld, LDAPMessage *entry, struct passwd *pw)
 {
     struct berval **bv, **p;
     char *val;
@@ -736,7 +737,8 @@ sudo_ldap_check_host(LDAP *ld, LDAPMessage *entry)
        val = (*p)->bv_val;
        /* match any or address or netgroup or hostname */
        if (!strcmp(val, "ALL") || addr_matches(val) ||
-           netgr_matches(val, user_runhost, user_srunhost, NULL) ||
+           netgr_matches(val, user_runhost, user_srunhost,
+           def_netgroup_tuple ? pw->pw_name : NULL) ||
            hostname_matches(user_srunhost, user_runhost, val))
            ret = true;
        DPRINTF2("ldap sudoHost '%s' ... %s", val, ret ? "MATCH!" : "not");
@@ -792,7 +794,8 @@ sudo_ldap_check_runas_user(LDAP *ld, LDAPMessage *entry)
        val = (*p)->bv_val;
        switch (val[0]) {
        case '+':
-           if (netgr_matches(val, NULL, NULL, runas_pw->pw_name))
+           if (netgr_matches(val, def_netgroup_tuple ? user_runhost : NULL,
+               def_netgroup_tuple ? user_srunhost : NULL, runas_pw->pw_name))
                ret = true;
            break;
        case '%':
@@ -1401,8 +1404,8 @@ sudo_netgroup_lookup(LDAP *ld, struct passwd *pw,
     struct timeval tv, *tvp = NULL;
     LDAPMessage *entry, *result = NULL;
     const char *domain;
-    char *escaped_domain, *escaped_host, *escaped_shost, *escaped_user;
-    char *filt = NULL;
+    char *escaped_domain = NULL, *escaped_user = NULL;
+    char *escaped_host = NULL, *escaped_shost = NULL, *filt = NULL;
     int filt_len, rc;
     debug_decl(sudo_netgroup_lookup, SUDOERS_DEBUG_LDAP);
 
@@ -1416,29 +1419,70 @@ sudo_netgroup_lookup(LDAP *ld, struct passwd *pw,
     domain = sudo_getdomainname();
 
     /* Escape the domain, host names, and user name per RFC 4515. */
-    escaped_domain = domain ? sudo_ldap_value_dup(domain) : NULL;
-    escaped_host = sudo_ldap_value_dup(user_runhost);
-    if (user_runhost == user_srunhost)
-       escaped_shost = escaped_host;
-    else 
-       escaped_shost = sudo_ldap_value_dup(user_srunhost);
-    escaped_user = sudo_ldap_value_dup(pw->pw_name);
-    if (escaped_domain == NULL || escaped_host == NULL ||
-       escaped_shost == NULL || escaped_user == NULL)
-       goto oom;
+    if (domain != NULL) {
+       if ((escaped_domain = sudo_ldap_value_dup(domain)) == NULL)
+           goto oom;
+    }
+    if ((escaped_user = sudo_ldap_value_dup(pw->pw_name)) == NULL)
+           goto oom;
+    if (def_netgroup_tuple) {
+       escaped_host = sudo_ldap_value_dup(user_runhost);
+       if (user_runhost == user_srunhost)
+           escaped_shost = escaped_host;
+       else 
+           escaped_shost = sudo_ldap_value_dup(user_srunhost);
+       if (escaped_host == NULL || escaped_shost == NULL)
+           goto oom;
+    }
 
     /* Build query, using NIS domain if it is set. */
     if (domain != NULL) {
-       if (user_runhost != user_srunhost) {
-           filt_len = asprintf(&filt, "(&%s(|(nisNetgroupTriple=\\28,%s,%s\\29)(nisNetgroupTriple=\\28%s,%s,%s\\29)(nisNetgroupTriple=\\28%s,%s,%s\\29)(nisNetgroupTriple=\\28,%s,\\29)(nisNetgroupTriple=\\28%s,%s,\\29)(nisNetgroupTriple=\\28%s,%s,\\29)))", ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, escaped_shost, escaped_user, escaped_domain, escaped_host, escaped_user, escaped_domain, escaped_user, escaped_shost, escaped_user, escaped_host, escaped_user);
+       if (escaped_host != escaped_shost) {
+           filt_len = asprintf(&filt, "(&%s(|"
+               "(nisNetgroupTriple=\\28,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28,%s,\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user, escaped_domain,
+               escaped_shost, escaped_user, escaped_domain,
+               escaped_host, escaped_user, escaped_domain, escaped_user,
+               escaped_shost, escaped_user, escaped_host, escaped_user);
+       } else if (escaped_shost != NULL) {
+           filt_len = asprintf(&filt, "(&%s(|"
+               "(nisNetgroupTriple=\\28,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28,%s,\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user, escaped_domain,
+               escaped_shost, escaped_user, escaped_domain,
+               escaped_user, escaped_shost, escaped_user);
        } else {
-           filt_len = asprintf(&filt, "(&%s(|(nisNetgroupTriple=\\28,%s,%s\\29)(nisNetgroupTriple=\\28%s,%s,%s\\29)(nisNetgroupTriple=\\28,%s,\\29)(nisNetgroupTriple=\\28%s,%s,\\29)))", ldap_conf.netgroup_search_filter, escaped_user, escaped_domain, escaped_shost, escaped_user, escaped_domain, escaped_user, escaped_shost, escaped_user);
+           filt_len = asprintf(&filt, "(&%s(|"
+               "(nisNetgroupTriple=\\28*,%s,%s\\29)"
+               "(nisNetgroupTriple=\\28*,%s,\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user, escaped_domain,
+               escaped_user);
        }
     } else {
-       if (user_runhost != user_srunhost) {
-           filt_len = asprintf(&filt, "(&%s(|(nisNetgroupTriple=\\28,%s,*\\29)(nisNetgroupTriple=\\28%s,%s,*\\29)(nisNetgroupTriple=\\28%s,%s,*\\29)))", ldap_conf.netgroup_search_filter, escaped_user, escaped_shost, escaped_user, escaped_host, escaped_user);
+       if (escaped_host != escaped_shost) {
+           filt_len = asprintf(&filt, "(&%s(|"
+               "(nisNetgroupTriple=\\28,%s,*\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,*\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,*\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user,
+               escaped_shost, escaped_user, escaped_host, escaped_user);
+       } else if (escaped_shost != NULL) {
+           filt_len = asprintf(&filt, "(&%s(|"
+               "(nisNetgroupTriple=\\28,%s,*\\29)"
+               "(nisNetgroupTriple=\\28%s,%s,*\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user,
+               escaped_shost, escaped_user);
        } else {
-           filt_len = asprintf(&filt, "(&%s(|(nisNetgroupTriple=\\28,%s,*\\29)(nisNetgroupTriple=\\28%s,%s,*\\29)))", ldap_conf.netgroup_search_filter, escaped_user, escaped_shost, escaped_user);
+           filt_len = asprintf(&filt,
+               "(&%s(|(nisNetgroupTriple=\\28*,%s,*\\29)))",
+               ldap_conf.netgroup_search_filter, escaped_user);
        }
     }
     if (filt_len == -1)
@@ -1497,10 +1541,10 @@ sudo_netgroup_lookup(LDAP *ld, struct passwd *pw,
 oom:
     sudo_warnx(U_("%s: %s"), __func__, U_("unable to allocate memory"));
     free(escaped_domain);
+    free(escaped_user);
     free(escaped_host);
     if (escaped_host != escaped_shost)
        free(escaped_shost);
-    free(escaped_user);
     free(filt);
     ldap_msgfree(result);
     debug_return_bool(false);
@@ -3399,7 +3443,7 @@ sudo_ldap_result_get(struct sudo_nss *nss, struct passwd *pw)
                        continue;
                    lres->user_matches = true;
                    /* Check host. */
-                   if (!sudo_ldap_check_host(ld, entry))
+                   if (!sudo_ldap_check_host(ld, entry, pw))
                        continue;
                    lres->host_matches = true;
                    if (sudo_ldap_result_add_entry(lres, entry) == NULL) {
index fcd24df9b384dc5ff8d9614300becdd3ffa55b1c..fdbe2628eb686cb934336ec53c6d1089e1a9fbc1 100644 (file)
@@ -107,7 +107,9 @@ userlist_matches(const struct passwd *pw, const struct member_list *list)
                matched = !m->negated;
                break;
            case NETGROUP:
-               if (netgr_matches(m->name, NULL, NULL, pw->pw_name))
+               if (netgr_matches(m->name,
+                   def_netgroup_tuple ? user_runhost : NULL,
+                   def_netgroup_tuple ? user_srunhost : NULL, pw->pw_name))
                    matched = !m->negated;
                break;
            case USERGROUP:
@@ -163,7 +165,10 @@ runaslist_matches(const struct member_list *user_list,
                        user_matched = !m->negated;
                        break;
                    case NETGROUP:
-                       if (netgr_matches(m->name, NULL, NULL, runas_pw->pw_name))
+                       if (netgr_matches(m->name,
+                           def_netgroup_tuple ? user_runhost : NULL,
+                           def_netgroup_tuple ? user_srunhost : NULL,
+                           runas_pw->pw_name))
                            user_matched = !m->negated;
                        break;
                    case USERGROUP:
@@ -250,7 +255,7 @@ runaslist_matches(const struct member_list *user_list,
  * Returns ALLOW, DENY or UNSPEC.
  */
 int
-hostlist_matches(const struct member_list *list)
+hostlist_matches(const struct passwd *pw, const struct member_list *list)
 {
     struct member *m;
     struct alias *a;
@@ -263,7 +268,8 @@ hostlist_matches(const struct member_list *list)
                matched = !m->negated;
                break;
            case NETGROUP:
-               if (netgr_matches(m->name, user_runhost, user_srunhost, NULL))
+               if (netgr_matches(m->name, user_runhost, user_srunhost,
+                   pw->pw_name))
                    matched = !m->negated;
                break;
            case NTWKADDR:
@@ -272,7 +278,7 @@ hostlist_matches(const struct member_list *list)
                break;
            case ALIAS:
                if ((a = alias_get(m->name, HOSTALIAS)) != NULL) {
-                   rval = hostlist_matches(&a->members);
+                   rval = hostlist_matches(pw, &a->members);
                    if (rval != UNSPEC)
                        matched = m->negated ? !rval : rval;
                    alias_put(a);
index b8f04b1629be6a8aacd3063066dad4791e97c2cb..0ac4f808a8139a8ccfdf40c17c7f9b3f86bb08f5 100644 (file)
@@ -176,7 +176,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
            if (userlist_matches(sudo_user.pw, &us->users) != ALLOW)
                continue;
            TAILQ_FOREACH(priv, &us->privileges, entries) {
-               if (hostlist_matches(&priv->hostlist) != ALLOW)
+               if (hostlist_matches(sudo_user.pw, &priv->hostlist) != ALLOW)
                    continue;
                TAILQ_FOREACH(cs, &priv->cmndlist, entries) {
                    /* Only check the command when listing another user. */
@@ -212,7 +212,7 @@ sudo_file_lookup(struct sudo_nss *nss, int validated, int pwflag)
            continue;
        CLR(validated, FLAG_NO_USER);
        TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) {
-           host_match = hostlist_matches(&priv->hostlist);
+           host_match = hostlist_matches(sudo_user.pw, &priv->hostlist);
            if (host_match == ALLOW)
                CLR(validated, FLAG_NO_HOST);
            else
@@ -415,7 +415,7 @@ sudo_file_display_priv_short(struct passwd *pw, struct userspec *us,
     /* gcc -Wuninitialized false positive */
     TAGS_INIT(tags);
     TAILQ_FOREACH(priv, &us->privileges, entries) {
-       if (hostlist_matches(&priv->hostlist) != ALLOW)
+       if (hostlist_matches(pw, &priv->hostlist) != ALLOW)
            continue;
        prev_cs = NULL;
        TAILQ_FOREACH(cs, &priv->cmndlist, entries) {
@@ -494,7 +494,7 @@ sudo_file_display_priv_long(struct passwd *pw, struct userspec *us,
     debug_decl(sudo_file_display_priv_long, SUDOERS_DEBUG_NSS)
 
     TAILQ_FOREACH(priv, &us->privileges, entries) {
-       if (hostlist_matches(&priv->hostlist) != ALLOW)
+       if (hostlist_matches(pw, &priv->hostlist) != ALLOW)
            continue;
        prev_cs = NULL;
        TAILQ_FOREACH(cs, &priv->cmndlist, entries) {
@@ -616,7 +616,7 @@ sudo_file_display_defaults(struct sudo_nss *nss, struct passwd *pw,
     TAILQ_FOREACH(d, &defaults, entries) {
        switch (d->type) {
            case DEFAULTS_HOST:
-               if (hostlist_matches(d->binding) != ALLOW)
+               if (hostlist_matches(pw, d->binding) != ALLOW)
                    continue;
                break;
            case DEFAULTS_USER:
@@ -753,7 +753,7 @@ sudo_file_display_cmnd(struct sudo_nss *nss, struct passwd *pw)
            continue;
 
        TAILQ_FOREACH_REVERSE(priv, &us->privileges, privilege_list, entries) {
-           host_match = hostlist_matches(&priv->hostlist);
+           host_match = hostlist_matches(pw, &priv->hostlist);
            if (host_match != ALLOW)
                continue;
            TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) {
index 85e02297afd312fee2a587b1b41ae60311f61e08..9f8cfdec4098feb887da473e08d59de3ed0b809c 100644 (file)
@@ -258,7 +258,7 @@ bool usergr_matches(const char *group, const char *user, const struct passwd *pw
 bool userpw_matches(const char *sudoers_user, const char *user, const struct passwd *pw);
 int cmnd_matches(const struct member *m);
 int cmndlist_matches(const struct member_list *list);
-int hostlist_matches(const struct member_list *list);
+int hostlist_matches(const struct passwd *pw, const struct member_list *list);
 int runaslist_matches(const struct member_list *user_list, const struct member_list *group_list, struct member **matching_user, struct member **matching_group);
 int userlist_matches(const struct passwd *pw, const struct member_list *list);
 const char *sudo_getdomainname(void);
index 30892bdff812b7c6d6ed1656806adba9680a9f65..2bf3198b0b5b45046ab7c602e1ef1d95e9bd65bb 100644 (file)
@@ -544,7 +544,8 @@ sudo_sss_check_runas_user(struct sudo_sss_handle *handle, struct sss_sudo_rule *
        switch (val[0]) {
        case '+':
            sudo_debug_printf(SUDO_DEBUG_DEBUG, "netgr_");
-           if (netgr_matches(val, NULL, NULL, runas_pw->pw_name)) {
+           if (netgr_matches(val, def_netgroup_tuple ? user_runhost : NULL,
+               def_netgroup_tuple ? user_srunhost : NULL, runas_pw->pw_name)) {
                sudo_debug_printf(SUDO_DEBUG_DEBUG, "=> match");
                ret = true;
            }
@@ -655,8 +656,7 @@ sudo_sss_check_host(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule)
        debug_return_bool(ret);
 
     /* get the values from the rule */
-    switch (handle->fn_get_values(rule, "sudoHost", &val_array))
-    {
+    switch (handle->fn_get_values(rule, "sudoHost", &val_array)) {
     case 0:
        break;
     case ENOENT:
@@ -673,8 +673,8 @@ sudo_sss_check_host(struct sudo_sss_handle *handle, struct sss_sudo_rule *rule)
        sudo_debug_printf(SUDO_DEBUG_DEBUG, "val[%d]=%s", i, val);
 
        /* match any or address or netgroup or hostname */
-       if (!strcmp(val, "ALL") || addr_matches(val) ||
-           netgr_matches(val, user_runhost, user_srunhost, NULL) ||
+       if (!strcmp(val, "ALL") || addr_matches(val) || netgr_matches(val,
+           user_runhost, user_srunhost, handle->pw->pw_name) ||
            hostname_matches(user_srunhost, user_runhost, val))
            ret = true;
 
@@ -724,7 +724,9 @@ sudo_sss_filter_user_netgroup(struct sudo_sss_handle *handle, struct sss_sudo_ru
            netgroup_spec_found = true;
        }
        sudo_debug_printf(SUDO_DEBUG_DEBUG, "val[%d]=%s", i, val);
-       if (strcmp(val, "ALL") == 0 || netgr_matches(val, NULL, NULL, handle->pw->pw_name)) {
+       if (strcmp(val, "ALL") == 0 || netgr_matches(val,
+           def_netgroup_tuple ? user_runhost : NULL,
+           def_netgroup_tuple ? user_srunhost : NULL, handle->pw->pw_name)) {
            ret = true;
            sudo_debug_printf(SUDO_DEBUG_DIAG,
                "sssd/ldap sudoUser '%s' ... MATCH! (%s)",
index 1feee9a4a013e6a848e401f853fced081a31480a..28f514709f4ccc235be8770d2f31b8769bb01870 100644 (file)
@@ -305,7 +305,7 @@ main(int argc, char *argv[])
            putchar('\n');
            print_privilege(priv);
            putchar('\n');
-           host_match = hostlist_matches(&priv->hostlist);
+           host_match = hostlist_matches(sudo_user.pw, &priv->hostlist);
            if (host_match == ALLOW) {
                puts("\thost  matched");
                TAILQ_FOREACH_REVERSE(cs, &priv->cmndlist, cmndspec_list, entries) {