Processi e ID
Table of Contents
In Linux, ogni processo ha associati vari identificatori utente e di gruppo che determinano i suoi permessi. Questi ID sono cruciali per gestire la sicurezza e il controllo degli accessi.
1. Permessi utente
1.1. Real User ID (RUID)
- È l’ID dell’utente che ha avviato il processo.
- Serve a sapere chi è il proprietario originale del processo.
- Viene copiato dal processo padre al figlio durante la `fork()`.
- Non viene usato per i controlli di accesso direttamente.
1.2. Effective User ID (EUID)
- È l’ID con cui il sistema verifica i permessi durante l’esecuzione.
- Di solito uguale al RUID, ma può essere diverso se il file eseguibile ha il bit setuid attivo.
- Esempio: il comando `passwd` ha EUID = `root` anche se viene eseguito da un utente normale.
1.3. Saved Set User ID (SUID)
- È una copia temporanea dell’EUID.
- Serve a ripristinare i privilegi se un processo li ha abbassati temporaneamente.
- Utile per i programmi che cambiano utente (es. `sudo`) ma poi vogliono tornare a usare i privilegi elevati.
2. Permessi Gruppi
Tipo | Descrizione |
---|---|
RGID (Real GID) | Gruppo reale che ha avviato il processo |
EGID (Effective GID) | Gruppo usato per i permessi |
SGID (Saved GID) | Copia salvata del gruppo efficace |
Supplementary groups | Gruppi addizionali cui l’utente appartiene (es. gruppo `sudo`, `docker`, ecc.) |
3. Esempio
L’utente `marco` (UID=1000) esegue il comando `/usr/bin/passwd` (che ha il bit setuid impostato a root, UID=0)
Risultato:
Campo | Valore |
---|---|
RUID | 1000 |
EUID | 0 |
SUID | 0 |
Quindi `passwd` può modificare `/etc/shadow` (permesso solo a root), anche se `marco` non è root.
4. Funzioni C/C++
4.1. Esempio base
#include <unistd.h> #include <stdio.h> int main() { printf("Real UID: %d\n", getuid()); printf("Effective UID: %d\n", geteuid()); return 0; }
Compila con:
gcc id_test.c -o id_test
Poi prova a eseguire con e senza `setuid`.
In C su sistemi POSIX (Linux, Unix…), puoi gestire e interrogare i vari ID utente e di gruppo associati a un processo usando delle funzioni di libreria standard. Ecco un riepilogo chiaro e completo:
—
4.2. FUNZIONI per gestire gli ID utente e di gruppo in C
4.2.1. ID Utente (User ID)
Funzione C | Descrizione |
---|---|
`uidt getuid(void)` | Restituisce il Real UID |
`uidt geteuid(void)` | Restituisce l'Effective UID |
`int setuid(uidt uid)` | Imposta real + effective + saved UID |
`int seteuid(uidt uid)` | Imposta solo l’EUID |
4.2.2. ID di Gruppo (Group ID)
Funzione C | Descrizione |
---|---|
`gidt getgid(void)` | Restituisce il Real GID |
`gidt getegid(void)` | Restituisce l'Effective GID |
`int setgid(gidt gid)` | Imposta real + effective + saved GID |
`int setegid(gidt gid)` | Imposta solo l’EGID |
4.2.3. Gruppi supplementari
Funzione C | Descrizione |
---|---|
`int getgroups(int size, gidt list[])` | Restituisce i gruppi supplementari |
`int setgroups(sizet size, const gidt list[])` | Imposta i gruppi supplementari |
4.2.4. Esempio completo in C
#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("UID real: %d\n", getuid()); printf("UID effective: %d\n", geteuid()); printf("GID real: %d\n", getgid()); printf("GID effective: %d\n", getegid()); return 0; }
Compila: gcc idinfo.c -o idinfo
4.2.5. Cambiare UID/GID
Esempio:
#include <stdio.h> #include <unistd.h> #include <stdlib.h> int main() { printf("Prima: EUID = %d\n", geteuid()); if (seteuid(1000) == -1) { perror("seteuid"); exit(EXIT_FAILURE); } printf("Dopo: EUID = %d\n", geteuid()); return 0; }
Nota: Puoi cambiare UID solo se sei root, o se il nuovo UID corrisponde al tuo Saved UID. setuid() può fallire se il kernel ha disabilitato il set-uid dopo il drop dei privilegi.
5. Esempio in shell
$ ps -o pid,user,euser,uid,euid,comm -p <PID> E per il tuo processo corrente: $ id Output: uid=1000(marco) gid=1000(marco) groups=1000(marco),27(sudo)
testare setuid
Puoi creare un programma C, compilarlo, e fare:
sudo chown root:root ./programma sudo chmod u+s ./programma
6. Riepilogo finale
ID | Cos'è | Quando si usa |
---|---|---|
RUID | Chi ha lanciato il processo | Proprietà |
EUID | Per i controlli di permesso | Accesso a file, porte, ecc. |
SUID | Per tornare a privilegi elevati | Gestione temporanea dei privilegi |
GID/EGID | Come sopra ma per i gruppi | Accesso a risorse di gruppo |