Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

sssd: a negative sudoUser entry clears a grant it did not match

Chiusa Adatta ai principianti
#586 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
78/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
c
Ambito
backend, security

Direzione di ricerca

Leggi le righe 186–230 di plugins/sudoers/sssd.c, in particolare il controllo delle voci negative alla riga 226, e confronta la gestione di match per ogni voce nelle righe 318–347 di plugins/sudoers/ldap.c. Riproduci il caso indicato sudoUser: alice, !bob con una build abilitata per SSSD e controlla il risultato di sudo -l; il lavoro è concluso quando una voce negativa non corrispondente non revoca più l’autorizzazione di Alice, mentre le voci negative corrispondenti continuano a rifiutare l’utente.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary
sudo_sss_check_user() walks the sudoUser list and maintains a single boolean that it treats as "this entry matched" at the point where negative entries are evaluated. The boolean is not per-entry: it is set by any positive match and never reset for the following entries. A rule such as alice, !bob therefore rejects alice, because the unmatched !bob entry is evaluated against the grant that alice had already produced.

Affected code: plugins/sudoers/sssd.c:186–230, specifically the negative-entry test at line 226. Unchanged in current master 3595b1527db3122616dea2568e0c5f86a328f8eb.

Reachable rejection sequence

  1. sudo is built --with-sssd and nsswitch.conf contains sudoers: files sss.
  2. A sudoRole carries sudoUser: alice, !bob, and the role grants at least one command.
  3. alice runs sudo -l. sudoers_lookup() reaches sudo_nss_sss.query(), which parses the role and calls sudo_sss_check_user().
  4. The first entry matches alice, so ret becomes true at line 210 and the loop continues because the entry is not SPECIFIED(user_matched).
  5. The second entry is negative and does not match alice. Line 226 tests ret && negated — ret is still true from step 4 — so the grant is cleared and the loop breaks.
  6. The role is discarded. sudo -l reports that alice is not allowed to run sudo.

Reordering the list to !bob, alice restores the intended result, which shows the outcome depends on list order rather than on membership.

The direction is fail-closed: the affected user loses privileges they were granted, and no user gains privileges they were not. It requires a role whose positive entries precede an unrelated negative entry, so a role using only positive entries, or only negative ones, is unaffected. plugins/sudoers/ldap.c:318–347 performs the same evaluation with a per-entry match variable and does not have this behaviour.

This commit range is relevant: 00c60751 ("Fix evaluation of negative entries in sudoUser", 2026-01-25) removed !ret from the loop condition at line 190 but did not introduce a per-entry flag, so before that commit the negative entries were never evaluated at all and after it they are evaluated against the wrong state.

Suggested fix
Track whether the current entry matched, locally, and use that for the negative test. The rest of the loop can keep using the cumulative flag for its existing purposes.

	for (i = 0; val_array[i] != NULL; ++i) {
	    bool matched = false;
	    ...
	    if (/* this entry matches */) {
		matched = true;
		ret = true;
		...
	    }
	    if (matched && negated) {     /* was: if (ret && negated) */
		ret = false;
		break;
	    }
	}
Lingua principale
C
Stelle
1.7k
Fork
306
Merge medio
1g 2h
PR unite (30g)
22

Preparare l'ambiente

Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di sudo-project/sudo

Tutte le issue di sudo-project/sudo

Issue simili

Altre issue su C

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.