Il salvataggio dell'ID utente effettivo in una variabile all'inizio del programma non renderebbe superfluo l'ID utente salvato?
Non è una questione di ciò che il programma in spazio utente ricorda, ma di quali diritti il kernel gli consente di utilizzare. Affinché la separazione tra gli utenti funzioni, deve esserci un sistema che controlla quali ID utente possono essere utilizzati da un processo. Altrimenti qualsiasi processo potrebbe semplicemente chiedere di diventare root.
Come posso recuperare l'ID utente salvato in un programma C? Non sono riuscito a trovare alcuna funzione che lo faccia.
Con le funzioni standard non puoi (c'è solo getuid()
e geteuid()
). Almeno Linux ha getresuid()
che restituiscono tutti e tre gli ID utente.
Comunque, di solito non avresti bisogno di leggerlo. È lì per consentire il passaggio tra l'ID utente reale e l'ID utente effettivo nel caso di un programma setuid, quindi inizia come una copia dell'ID utente effettivo.
In un programma setuid, l'ID utente reale è quello dell'utente che lo esegue e gli ID utente effettivi e salvati sono quelli dell'utente proprietario del programma. L'ID utente effettivo è quello che conta per i controlli dei privilegi, quindi se il processo desidera eliminare temporaneamente i privilegi, cambia l'ID utente effettivo tra l'ID utente reale e quello salvato.
In che modo il kernel utilizza l'ID utente salvato per verificare se un processo può o meno modificare il proprio ID utente? Questo significa che quando un processo tenta di modificare il proprio ID utente effettivo, il kernel controlla l'ID utente salvato per assicurarsi che il processo sia autorizzato a farlo?
Sì. La pagina man di Linux per setuid()
menziona questo, ma è in qualche modo nascosto:
ERRORS
EPERM The user is not privileged and uid does not match the real
UID or saved set-user-ID of the calling process.
In altre parole, puoi solo impostare l'ID utente (effettivo) su uno degli ID reali o salvati.
La pagina man per setreuid()
è più chiaro su questo:
Unprivileged processes may only set the effective user ID to the real
user ID, the effective user ID, or the saved set-user-ID.