Risposte:
Potresti conoscere le normali autorizzazioni di lettura, scrittura ed esecuzione per i file in unix.
Tuttavia, in molte applicazioni, questo tipo di struttura di autorizzazioni, ad esempio concedere a un determinato utente o l'autorizzazione completa a leggere un determinato file o nessuna autorizzazione a leggere il file, è troppo approssimativa. Per questo motivo, Unix include un altro bit di autorizzazione, il set-user-ID
bit. Se questo bit è impostato per un file eseguibile, ogni volta che un utente diverso dal proprietario esegue il file, quell'utente acquisisce tutti i privilegi di lettura / scrittura / esecuzione del file accedendo a qualsiasi altro file del proprietario!
Per impostare il bit set-user-ID per un file, digitare
chmod u+s filename
Assicurati di aver impostato anche l'autorizzazione di esecuzione gruppo-altro; sarebbe bello avere anche il permesso di lettura di un altro gruppo. Tutto ciò può essere fatto con la singola istruzione
chmod 4755 filename
Viene anche chiamato UID salvato. Un file che viene avviato con un bit Set-UID attivato, l'UID salvato sarà l'UID del proprietario del file. Altrimenti, l'UID salvato sarà l'UID reale.
Questo UID viene utilizzato per valutare i privilegi del processo per eseguire una determinata azione. EUID può essere modificato in UID reale o UID superutente se EUID! = 0. Se EUID = 0, può essere cambiato in qualsiasi cosa.
Un esempio di tale programma è passwd
. Se lo elenchi per intero, vedrai che ha bit Set-UID e il proprietario è "root". Quando un utente normale, dì "mtk", gira passwd
, inizia con:
Real-UID = mtk
Effective-UID = mtk
Saved-UID = root
man credentials
è una buona fonte di informazioni in questo caso. Vedi anche questo presente su SO . Per una spiegazione storica vedere questo post archiviato .
Invece di chiamare un "meccanismo UID" e "UID efficace" un meccanismo, l'intero concetto di UID dovrebbe essere chiamato così. La logica dell'esistenza dei vari UID sono vari problemi con la separazione dei privilegi. Anche gli utenti regolari (senza privilegi) a volte devono fare cose (accedere alle risorse) che solo gli utenti privilegiati possono fare. Per raggiungere questo obiettivo facilmente, i programmi possono cambiare i loro UID. Esistono 3 tipi di questi:
UID reale: l'UID che possiede un processo
UID effettivo - l'UID attualmente eseguito da un processo - questo determina le effettive capacità del processo in un determinato momento. Questo è anche ciò ps
che ti mostra nel campo USER.
UID set salvato - segnaposto utilizzato per alternare tra UID reali ed effettivi
La necessità dell'ultimo nasce dal fatto che gli utenti regolari possono passare solo da questi tre a nient'altro e che un programma setuid di solito deve sapere in qualche modo, chi era l'utente che lo ha caricato (più l'UID reale non dovrebbe essere cambiato dal ciò creerebbe un pasticcio ancora più grande).
La expalanation di mtk è buona.
L' passwd
esempio è di escalation di privilegi: passwd viene sempre eseguito come root poiché deve modificare i file che solo il root può modificare. Ciò rende importante che l'eseguibile passwd non sia soggetto a buffer overflow, ecc., In modo tale che un abile utente normale possa essere in grado di utilizzarlo per scopi non previsti.
Un'altra logica è proteggere l'utente nello stesso modo in cui si potrebbe utilizzare su
se si è effettuato l'accesso come root, al fine di ridurre o limitare i propri privilegi per compiti specifici, non di intensificarli. Ad esempio, se ho l'autorizzazione per avviare un servizio daemon che non richiede l'accesso alle mie cose e ha le sue cose, che è tutto ciò di cui ha bisogno (ad esempio un logger), eseguirlo suid significa che ha accesso solo a quelle cose e non mio o di chiunque altro.
Si noti che è possibile impostare uid a livello di codice anche se il bit di suid non è impostato sull'eseguibile , tuttavia ciò non funzionerà per l'escalation. Ad esempio, se sei un utente normale e scrivi un programma che imposta uid a un certo punto stesso, quel programma non può passare a root. Apache funziona in questo modo, credo. Di solito viene avviato da root e ha un processo che quindi esegue il fork dei figli che passano all'utente a un utente non privilegiato (ad esempio "httpd"). Quei processi figlio sono ciò che funziona il vero server web.