Skip to main content
  1. Concetti/

Linux Permissions UGO

·4 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

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
SoggettoSiglaChi è
UserUIl proprietario del file
GroupGGli utenti nel gruppo associato al file
OthersOTutti 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
#

BitCosa permette
rLeggere il contenuto (cat, less)
wModificare il contenuto
xEseguire il file come programma (./script.sh)

Su una directory
#

BitCosa permette
rListare i file dentro (ls)
wCreare, rinominare, cancellare file dentro
xAttraversare 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 path

Rappresentazione 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  successo

Il 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 esatto

Comandi 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/project

Casi 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 dentro

Collaborazione 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' cancellarlo

Bit speciali — SUID, SGID, Sticky
#

I bit speciali compaiono al posto della x nella stringa dei permessi. Per il dettaglio completo → vedi suid-sgid-sticky.

BitPosizioneSimboloOttaleEffetto
SUIDowner xs/S4000processo gira con UID del proprietario
SGIDgroup xs/S2000processo gira con GID del gruppo
Stickyothers xt/T1000solo 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/null

Scenario 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' sospetto

Casi 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-19

Collegato a
#

Related