@@ -106,6 +106,8 @@ static char *prev_user;
106106static char * runas_user ;
107107static char * runas_group ;
108108static struct sudo_nss_list * snl ;
109+ static bool unknown_runas_uid ;
110+ static bool unknown_runas_gid ;
109111
110112#ifdef __linux__
111113static struct rlimit nproclimit ;
@@ -376,6 +378,22 @@ sudoers_policy_main(int argc, char * const argv[], int pwflag, char *env_add[],
376378 }
377379 }
378380
381+ /* Defer uid/gid checks until after defaults have been updated. */
382+ if (unknown_runas_uid && !def_runas_allow_unknown_id ) {
383+ audit_failure (NewArgc , NewArgv , N_ ("unknown user: %s" ),
384+ runas_pw -> pw_name );
385+ sudo_warnx (U_ ("unknown user: %s" ), runas_pw -> pw_name );
386+ goto done ;
387+ }
388+ if (runas_gr != NULL ) {
389+ if (unknown_runas_gid && !def_runas_allow_unknown_id ) {
390+ audit_failure (NewArgc , NewArgv , N_ ("unknown group: %s" ),
391+ runas_gr -> gr_name );
392+ sudo_warnx (U_ ("unknown group: %s" ), runas_gr -> gr_name );
393+ goto done ;
394+ }
395+ }
396+
379397 /*
380398 * Look up the timestamp dir owner if one is specified.
381399 */
@@ -1192,12 +1210,15 @@ set_runaspw(const char *user, bool quiet)
11921210 struct passwd * pw = NULL ;
11931211 debug_decl (set_runaspw , SUDOERS_DEBUG_PLUGIN )
11941212
1213+ unknown_runas_uid = false;
11951214 if (* user == '#' ) {
11961215 const char * errstr ;
11971216 uid_t uid = sudo_strtoid (user + 1 , & errstr );
11981217 if (errstr == NULL ) {
1199- if ((pw = sudo_getpwuid (uid )) == NULL )
1218+ if ((pw = sudo_getpwuid (uid )) == NULL ) {
1219+ unknown_runas_uid = true;
12001220 pw = sudo_fakepwnam (user , user_gid );
1221+ }
12011222 }
12021223 }
12031224 if (pw == NULL ) {
@@ -1223,12 +1244,15 @@ set_runasgr(const char *group, bool quiet)
12231244 struct group * gr = NULL ;
12241245 debug_decl (set_runasgr , SUDOERS_DEBUG_PLUGIN )
12251246
1247+ unknown_runas_gid = false;
12261248 if (* group == '#' ) {
12271249 const char * errstr ;
12281250 gid_t gid = sudo_strtoid (group + 1 , & errstr );
12291251 if (errstr == NULL ) {
1230- if ((gr = sudo_getgrgid (gid )) == NULL )
1252+ if ((gr = sudo_getgrgid (gid )) == NULL ) {
1253+ unknown_runas_gid = true;
12311254 gr = sudo_fakegrnam (group );
1255+ }
12321256 }
12331257 }
12341258 if (gr == NULL ) {
0 commit comments