Cosa fa#
Il sistema di permessi Linux controlla chi può fare cosa su file e directory. Si basa su tre soggetti (User, Group, Others) e tre bit (r, w, x). Il kernel valuta i permessi in ordine gerarchico: User → Group → Others.
Architettura UGO#
# Stringa permessi completa:
- r w x r w x r w x
│ └──┬──┘└──┬──┘└──┬──┘
│ User Group Others
│
└── tipo: - = file, d = directory, l = symlink| Soggetto | Sigla | Chi è |
|---|---|---|
| User | U | Il proprietario del file |
| Group | G | Gli utenti nel gruppo associato al file |
| Others | O | Tutti gli altri — il perimetro più critico |
UID — User IDentifier: numero univoco che identifica l'utente nel kernel. root ha sempre UID 0.
GID — Group IDentifier: numero univoco che identifica il gruppo.
I tre bit: r, w, x#
Su un file#
| Bit | Cosa permette |
|---|---|
r | Leggere il contenuto (cat, less) |
w | Modificare il contenuto |
x | Eseguire il file come programma (./script.sh) |
Su una directory#
| Bit | Cosa permette |
|---|---|
r | Listare i file dentro (ls) |
w | Creare, rinominare, cancellare file dentro |
x | Attraversare la directory (cd) e accedere a file di cui conosci il path. Senza r non puoi fare ls |
La distinzione x su file vs directory è fondamentale:
# x su FILE = eseguire come processo
chmod +x script.sh && ./script.sh
# x su DIRECTORY = attraversare (traversing)
# puoi fare cd e accedere a file noti
# senza x → Permission Denied anche se conosci il pathRappresentazione ottale#
# Ogni bit ha un valore:
r = 4
w = 2
x = 1
# Somma per ogni soggetto:
rwx = 4+2+1 = 7
r-x = 4+0+1 = 5
r-- = 4+0+0 = 4
--- = 0
# Esempio chmod 750:
# User: rwx = 7
# Group: r-x = 5
# Others: --- = 0
chmod 750 script.sh# Logica binaria sottostante:
# 7 = 111 (tutti accesi)
# 5 = 101 (lettura si, scrittura no, esecuzione si)
# 0 = 000 (tutti spenti)Traversing — come il kernel valuta il path#
Quando accedi a un file, il kernel controlla x su ogni directory del path, uno per uno:
# Richiesta: cat /home/user/docs/test.txt
# 1. Controllo / → hai x? si → prosegui
# 2. Controllo home/ → hai x? si → prosegui
# 3. Controllo user/ → hai x? si → prosegui
# 4. Controllo docs/ → hai x? NO → Permission Denied
# (anche se test.txt e' 777)
# Se superi docs/:
# 5. Controllo test.txt → hai r? si → successoIl caso x senza r su una directory:
# directory con --x (puoi attraversare ma non listare)
cd /dir/segreta # funziona
ls /dir/segreta # Permission Denied
cat /dir/segreta/file # funziona SE conosci il nome esattoComandi di gestione#
# chmod — cambia i permessi
chmod 755 script.sh # rwxr-xr-x
chmod 600 secret.txt # rw-------
chmod +x script.sh # aggiunge x all'owner
chmod -R 644 /var/www/ # ricorsivo
# chown — cambia proprietario
chown utente:gruppo file
chown root secret.log
# chgrp — cambia solo il gruppo
chgrp devteam /opt/projectCasi particolari#
Cancellazione paradossale:
# Hai w sulla cartella ma il file e' di root con permessi 000
# Puoi comunque cancellare il file
rm /cartella/file-di-root
# Stai rimuovendo l'entry dalla directory, non modificando il file
# w sulla directory = puoi modificare la lista dei file dentroCollaborazione sicura con sticky bit:
chmod 1777 /tmp
# Tutti possono creare file
# Nessuno puo' cancellare i file degli altri
# Solo il proprietario del file o root puo' cancellarloBit speciali — SUID, SGID, Sticky#
I bit speciali compaiono al posto della x nella stringa dei permessi.
Per il dettaglio completo → vedi suid-sgid-sticky.
| Bit | Posizione | Simbolo | Ottale | Effetto |
|---|---|---|---|---|
| SUID | owner x | s/S | 4000 | processo gira con UID del proprietario |
| SGID | group x | s/S | 2000 | processo gira con GID del gruppo |
| Sticky | others x | t/T | 1000 | solo il proprietario puo' cancellare |
# Trovare tutti i SUID sul sistema
find / -perm -4000 -type f 2>/dev/null
# Trovare tutti i SGID
find / -perm -2000 -type f 2>/dev/nullScenario Reale#
# Incident response — file sospetto trovato
ls -la /tmp/mystery
# Output:
# -rwsr-xr-x 1 root root 14521 Mar 18 03:14 /tmp/mystery
# ^^^
# SUID + proprietario root = privilege escalation potenziale
# Chiunque esegua questo file ottiene effective UID = root
# Verifica tutti i SUID non standard:
find / -perm -4000 -type f 2>/dev/null | grep -v -E \
"/usr/bin/passwd|/usr/bin/sudo|/usr/bin/ping"
# Tutto quello che non e' in questa lista e' sospettoCasi d'uso in Bandit#
# Livello 5: trova file con permessi specifici
find . -size 1033c ! -executable
# Livello 6: ricerca globale con gestione errori
find / -user bandit7 -group bandit6 -size 33c 2>/dev/null
# Livello 19: SUID binary per escalation
# -rwsr-x--- 1 bandit20 bandit19 → vedi bandit-19Collegato a#
- iam — categoria
- suid-sgid-sticky — bit speciali, privilege escalation
- chmod — comando per modificare i permessi
- uid-gid-identifiers — UID e GID nel dettaglio
- bandit-19 — SUID in pratica



