setuid(2)

NUME
setuid - stabilește identitatea utilizatorului

BIBLIOTECA
Biblioteca C standard (libc, -lc)

SINOPSIS
#include <unistd.h>

int setuid(uid_t uid);

DESCRIERE
setuid() stabilește ID-ul de utilizator efectiv al procesului apelant. În cazul în care procesul apelant este privilegiat (mai precis: dacă procesul are capacitatea CAP_SETUID în spațiul său de nume de utilizator), se stabilesc, de asemenea, UID real și set-user-ID salvat.

În Linux, setuid() este implementat ca versiunea POSIX cu caracteristica _POSIX_SAVED_IDS. Acest lucru permite unui program set-user-ID (altul decât root) să renunțe la toate privilegiile de utilizator, să facă unele lucrări fără privilegii și apoi să reangajeze ID-ul de utilizator efectiv inițial într-un mod sigur.

Dacă utilizatorul este root sau dacă programul este set-user-ID-root, trebuie să se acorde o atenție specială: setuid() verifică ID-ul de utilizator efectiv al apelantului și, dacă acesta este superutilizatorul, toate ID-urile de utilizator legate de proces sunt stabilite la uid. După ce acest lucru s-a întâmplat, este imposibil ca programul să recâștige privilegiile de root.

Astfel, un program set-user-ID-root care dorește să renunțe temporar la privilegiile de root, să își asume identitatea unui utilizator neprivilegiat și apoi să redobândească privilegiile de root nu poate utiliza setuid(). Puteți realiza acest lucru cu seteuid(2).

VALOAREA RETURNATĂ
În caz de succes, se returnează zero. În caz de eroare, se returnează -1, iar errno este configurată pentru a indica eroarea.

Notă: există cazuri în care setuid() poate eșua chiar și atunci când apelantul este UID 0; este o gravă eroare de securitate să se omită verificarea pentru o returnare a unui eșec de la setuid().

ERORI-IEȘIRE

EAGAIN
    Apelul ar schimba UID-ul real al apelantului (adică uid nu se potrivește cu UID-ul real al apelantului), dar a existat un eșec temporar în alocarea structurilor de date necesare ale nucleului.

EAGAIN
    uid nu se potrivește cu ID-ul real al apelantului și acest apel ar face ca numărul de procese aparținând ID-ului real al utilizatorului uid să depășească limita de resurse RLIMIT_NPROC a apelantului. Începând cu Linux 3.1, acest caz de eroare nu mai apare (dar aplicațiile robuste ar trebui să verifice dacă există această eroare); a se vedea descrierea lui EAGAIN din execve(2).

EINVAL
    ID-ul de utilizator specificat în uid nu este valid în acest spațiu de nume de utilizator.

EPERM
    Utilizatorul nu este privilegiat (Linux: nu are capacitatea CAP_SETUID în spațiul său de nume de utilizator) și uid nu se potrivește cu UID-ul real sau cu set-user-ID-ul salvat al procesului de apelare.

VERSIUNI

  Diferențe între biblioteca C și nucleu
La nivelul nucleului, ID-urile de utilizator și ID-urile de grup sunt un atribut pentru fiecare fir de execuție. Cu toate acestea, POSIX impune ca toate firele dintr-un proces să aibă aceleași credențiale. Implementarea „NPTL threading” se ocupă de cerințele POSIX prin furnizarea de funcții de învăluire pentru diferitele apeluri de sistem care modifică UID și GID ale proceselor. Aceste funcții învăluitoare (inclusiv cea pentru setuid()) utilizează o tehnică bazată pe semnale pentru a se asigura că, atunci când un fir de execuție își schimbă acreditările, toate celelalte fire de execuție din proces își schimbă și ele acreditările. Pentru detalii, a se vedea nptl(7).

STANDARDE
POSIX.1-2024.

ISTORIC
POSIX.1-2001, SVr4.

Nu este foarte compatibil cu apelul 4.4BSD, care stabilește toate ID-urile de utilizator reale, salvate și efective.

Apelul de sistem original Linux setuid() suporta doar ID-uri de utilizator pe 16 biți. Ulterior, Linux 2.4 a adăugat setuid32() care acceptă ID-uri pe 32 de biți. Funcția învăluitoare glibc setuid() tratează în mod transparent variația dintre versiunile de kernel.

NOTE
Linux are conceptul de ID de utilizator al sistemului de fișiere, în mod normal egal cu ID-ul efectiv al utilizatorului. Apelul setuid() stabilește, de asemenea, ID-ul de utilizator din sistemul de fișiere al procesului care îl apelează. A se vedea setfsuid(2).

Dacă uid este diferit de vechiul UID efectiv, procesului îi va fi interzis să lase descărcări de imagine de memorie.

CONSULTAȚI ȘI
getuid(2), seteuid(2), setfsuid(2), setreuid(2), capabilities(7), credentials(7), user_namespaces(7)

TRADUCERE
Traducerea în limba română a acestui manual a fost făcută de Remus-Gabriel Chelu <remusgabriel.chelu@disroot.org>

Această traducere este documentație gratuită; citiți Licența publică generală GNU Versiunea 3 (https://www.gnu.org/licenses/gpl-3.0.html) sau o versiune ulterioară cu privire la condiții privind drepturile de autor. NU se asumă NICIO RESPONSABILITATE.

Dacă găsiți erori în traducerea acestui manual, vă rugăm să trimiteți un e-mail la translation-team-ro@lists.sourceforge.net.