diff -up sudo-1.8.6p7/plugins/sudoers/defaults.c.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/defaults.c --- sudo-1.8.6p7/plugins/sudoers/defaults.c.netgroup_tuple 2016-05-09 15:34:41.059246583 +0200 +++ sudo-1.8.6p7/plugins/sudoers/defaults.c 2016-05-09 15:34:41.066246485 +0200 @@ -362,6 +362,7 @@ init_defaults(void) } /* First initialize the flags. */ + def_netgroup_tuple = false; def_legacy_group_processing = true; #ifdef LONG_OTP_PROMPT def_long_otp_prompt = true; diff -up sudo-1.8.6p7/plugins/sudoers/def_data.c.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/def_data.c --- sudo-1.8.6p7/plugins/sudoers/def_data.c.netgroup_tuple 2016-05-09 15:34:41.059246583 +0200 +++ sudo-1.8.6p7/plugins/sudoers/def_data.c 2016-05-09 15:34:41.066246485 +0200 @@ -359,6 +359,10 @@ struct sudo_defs_types sudo_defs_table[] N_("Don't pre-resolve all group names"), NULL, }, { + "netgroup_tuple", T_FLAG, + N_("Use both user and host/domain fields when matching netgroups"), + NULL, + }, { NULL, 0, NULL } }; diff -up sudo-1.8.6p7/plugins/sudoers/def_data.h.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/def_data.h --- sudo-1.8.6p7/plugins/sudoers/def_data.h.netgroup_tuple 2016-05-09 15:34:41.059246583 +0200 +++ sudo-1.8.6p7/plugins/sudoers/def_data.h 2016-05-09 15:34:41.066246485 +0200 @@ -166,6 +166,8 @@ #define I_CMND_NO_WAIT 82 #define def_legacy_group_processing (sudo_defs_table[83].sd_un.flag) #define I_LEGACY_GROUP_PROCESSING 83 +#define def_netgroup_tuple (sudo_defs_table[84].sd_un.flag) +#define I_NETGROUP_TUPLE 84 enum def_tuple { never, diff -up sudo-1.8.6p7/plugins/sudoers/ldap.c.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/ldap.c --- sudo-1.8.6p7/plugins/sudoers/ldap.c.netgroup_tuple 2016-05-09 15:34:41.065246499 +0200 +++ sudo-1.8.6p7/plugins/sudoers/ldap.c 2016-05-09 15:34:41.066246485 +0200 @@ -636,8 +636,12 @@ sudo_ldap_check_user_netgroup(LDAP *ld, for (p = bv; *p != NULL && !ret; p++) { val = (*p)->bv_val; /* match any */ - if (netgr_matches(val, NULL, NULL, user)) - ret = true; + if (netgr_matches(val, + def_netgroup_tuple ? user_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + user)) { + ret = true; + } DPRINTF(("ldap sudoUser netgroup '%s' ... %s", val, ret ? "MATCH!" : "not"), 2 + ((ret) ? 0 : 1)); } @@ -652,7 +656,7 @@ sudo_ldap_check_user_netgroup(LDAP *ld, * host match, else false. */ static bool -sudo_ldap_check_host(LDAP *ld, LDAPMessage *entry) +sudo_ldap_check_host(LDAP *ld, LDAPMessage *entry, char *user) { struct berval **bv, **p; char *val; @@ -672,7 +676,7 @@ sudo_ldap_check_host(LDAP *ld, LDAPMessa val = (*p)->bv_val; /* match any or address or netgroup or hostname */ if (!strcmp(val, "ALL") || addr_matches(val) || - netgr_matches(val, user_host, user_shost, NULL) || + netgr_matches(val, user_host, user_shost, def_netgroup_tuple ? user : NULL) || hostname_matches(user_shost, user_host, val)) ret = true; DPRINTF(("ldap sudoHost '%s' ... %s", val, @@ -729,7 +733,10 @@ sudo_ldap_check_runas_user(LDAP *ld, LDA 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_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + runas_pw->pw_name)) ret = true; break; case '%': @@ -2755,13 +2762,13 @@ sudo_ldap_result_get(struct sudo_nss *ns LDAP_FOREACH(entry, ld, result) { if (do_netgr) { if (sudo_ldap_check_user_netgroup(ld, entry, pw->pw_name) && - sudo_ldap_check_host(ld, entry)) { + sudo_ldap_check_host(ld, entry, pw->pw_name)) { lres->host_matches = true; lres->user_matches = true; sudo_ldap_result_add_entry(lres, entry); } } else { - if (sudo_ldap_check_host(ld, entry)) { + if (sudo_ldap_check_host(ld, entry, pw->pw_name)) { lres->host_matches = true; sudo_ldap_result_add_entry(lres, entry); } diff -up sudo-1.8.6p7/plugins/sudoers/match.c.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/match.c --- sudo-1.8.6p7/plugins/sudoers/match.c.netgroup_tuple 2016-05-09 15:34:41.062246541 +0200 +++ sudo-1.8.6p7/plugins/sudoers/match.c 2016-05-09 15:34:41.067246471 +0200 @@ -117,7 +117,10 @@ userlist_matches(struct passwd *pw, stru 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_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + pw->pw_name)) matched = !m->negated; break; case USERGROUP: @@ -172,7 +175,10 @@ runaslist_matches(struct member_list *us 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_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + runas_pw->pw_name)) user_matched = !m->negated; break; case USERGROUP: @@ -269,7 +275,7 @@ hostlist_matches(struct member_list *lis matched = !m->negated; break; case NETGROUP: - if (netgr_matches(m->name, user_host, user_shost, NULL)) + if (netgr_matches(m->name, user_host, user_shost, def_netgroup_tuple ? user_name : NULL)) matched = !m->negated; break; case NTWKADDR: diff -up sudo-1.8.6p7/plugins/sudoers/sssd.c.netgroup_tuple sudo-1.8.6p7/plugins/sudoers/sssd.c --- sudo-1.8.6p7/plugins/sudoers/sssd.c.netgroup_tuple 2016-05-09 15:34:41.056246625 +0200 +++ sudo-1.8.6p7/plugins/sudoers/sssd.c 2016-05-09 15:34:41.067246471 +0200 @@ -452,7 +452,10 @@ sudo_sss_check_runas_user(struct sudo_ss 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_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + runas_pw->pw_name)) { sudo_debug_printf(SUDO_DEBUG_DEBUG, "=> match"); ret = true; } @@ -551,7 +554,7 @@ sudo_sss_check_runas(struct sudo_sss_han debug_return_bool(ret); } -static bool sudo_sss_ipa_hostname_matches(const char *hostname_val) +static bool sudo_sss_ipa_hostname_matches(const char *hostname_val, char *user) { bool ret = false; char *ipa_hostname_val; @@ -559,7 +562,7 @@ static bool sudo_sss_ipa_hostname_matche if ((ipa_hostname_val = ipa_hostname()) != NULL) { ret = hostname_matches(ipa_hostname_val, ipa_hostname_val, hostname_val) || \ - netgr_matches(hostname_val, ipa_hostname_val, ipa_hostname_val, NULL); + netgr_matches(hostname_val, ipa_hostname_val, ipa_hostname_val, def_netgroup_tuple ? user : NULL); } sudo_debug_printf(SUDO_DEBUG_TRACE, "IPA hostname (%s) matches %s => %s", @@ -600,8 +603,9 @@ sudo_sss_check_host(struct sudo_sss_hand /* match any or address or netgroup or hostname */ if (!strcmp(val, "ALL") || addr_matches(val) || - sudo_sss_ipa_hostname_matches(val) || - netgr_matches(val, user_host, user_shost, NULL) || + sudo_sss_ipa_hostname_matches(val, handle->pw->pw_name) || + netgr_matches(val, user_host, user_shost, + def_netgroup_tuple ? handle->pw->pw_name : NULL) || hostname_matches(user_shost, user_host, val)) ret = true; @@ -649,7 +653,10 @@ bool sudo_sss_filter_sudoUser(struct sud sudo_debug_printf(SUDO_DEBUG_DEBUG, "val[%d]=%s", i, val); if (*val == '+') { /* Netgroup spec found, check netgroup membership */ - if (netgr_matches(val, NULL, NULL, handle->pw->pw_name)) { + if (netgr_matches(val, + def_netgroup_tuple ? user_host : NULL, + def_netgroup_tuple ? user_shost : NULL, + handle->pw->pw_name)) { ret = true; sudo_debug_printf(SUDO_DEBUG_DIAG, "sssd/ldap sudoUser '%s' ... MATCH! (%s)", val, handle->pw->pw_name);