UP | HOME

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

Author: andrea venuti

Created: 2025-07-23 mer 14:45

Validate