Newsgroup: it.comp.os.linux.sys
Titolo: su bit suid: credevo di sapere tutto, invece....

Ho provato a fare una cgi che processa una form e che dovrebbe
appendere una linea a /etc/hosts.
Apache gira come user nobody group nobody e non potrebbe farlo.
Quindi ho fatto un ridicolo programma C per ottenere un ELF
che non fa altro che dare in stdoutput lo stdinput e con >> /etc/hosts
dovrebbe appendere una noova linea. ovviamente /etc/hosts e'
scrivibile solo da root e infatti se la cgi la lancio direttamente
da root funziona. Ho settato con chmod -s nomeELF il bit suid,
ma questo si setta solo per owner e per group, non per other
-r-sr-sr-x e apache non riesce comunque ad appendere una linea
a /etc/hosts. Con "sudo" non ho problemi, ma insisto per capire
perche' non posso in questo modo, e a questo punto non so come
fa "sudo"  a farlo. Non c' e' un deamon con i privilegi di root
che mi esegue i comandi. /usr(bin/sudo e' ----s--x--x. Quindi
neanche lui a S in "other".
Inutile commentare la fragilita' della sicurezza del sistema.
Non mi interessa. Vi chiedo solo di rispondere al quesito sulla
tecnologia del bit s.
Ciao
Roberto

 neanche lui a S in "other".
Basta la prima "s". Significa che chiunque lo esegua gli fa assumere
l'UID effettivo dell'owner, cioè di root.
Ciao
 David
-- 
<d.santinoli presso mi . flashnet . it>

Questo fine settimana, mentre sguazzavo tra i flutti di Portonovo
(Riviera de Conero - Ancona) cercando di sfuggire alla vigilanza di
mia miglie e contemplare la qualita' dei toples di quest' anno,
ho avuto un FLASH:
"vuoi vedere che se anziche' direzionare il flusso di output con >
aprivo il file /etc/hosts con fd=fopen("/etc/hosts","a"); e poi con
fprintf(fd,"%s",nuovalinea); avrebbe funzionato?"
Appena tornato a casa ho provato e e' proprio cosi'. La risposta
l' avrei trovata quindi il se avessi postato il 
it.comp.os.linux.development, ma non potevo saperlo prima (un vero
paradosso, per sapere chi mi puo' rispondere devo sapere la
risposta)
Comunque vi dico le nuove convinzioni che mi sono fatto sul bit suid.
Un programma eseguibile di tipo binario (ELF o a.out) che lo ha
settato per owner viene eseguito da chiunque lo avvii con i privilegi
dell' owner, settato anche per group, anche il groupid del processo
viene settato a quello del file lanciato anziche'  a quello del
chiamante (e fino a qui niente di sorprendente).
Tuttavia se di tale processo si ridireziona lo standard output,
IL TARGET DEVE ESSERE ACCESSIBILE DALLA SHELL CHIAMANTE!
./miopuntoELF >> /etc/hosts non puo' funzionare (e sarebbe la fine
se funzionasse) perche il >> e' realizzato dalla shell che chiama
./miopuntoELF. Anche se ./miopuntoELF gira con privilegi di root,
non fa altro che consegnare il suo output alla shell che fallirebbe
cercando di aprire in scrittura /etc/hosts (e meno male!!)
Quindi tutte le operazioni che nbecessitano i privilegi dello user
di ./miopuntoELF devono essere fatte da ./miopuntoELF direttamente.
Ora mi sembra cosi' banale, ma inizialmente ho avuto qualche dubbio.
Scusate. A volte il mare e i topless fanno bene.
Ciao
Roberto.

 Scusate. A volte il mare e i topless fanno bene.
Direi di sě :-)


Il punto e' che nel tuo sorgente in c devi
metterci anche la funzione setuid(0), lo compili
e poi setti il bit suid e sigid sul file binario.
Ciao
--
"Scrivere  in  modo semplice e chiaro soltanto cose che si conoscono"
(Ernest Hemingway).
"Spero di aver scritto in modo semplice e chiaro alcune cose su Linux
Perl, Perl/Tk, CGI, X-Window, Tcl/Tk, PHP, Lite e mSQL"
(Francesco Munaretto, 
http://www.venis.it/francesco
).


 e poi setti il bit suid e sigid sul file binario.
Se l'owner č root e l'eseguibile č suiddato, quella chiamata non serve a
niente.
Se l'owner non č root, la chiamata fallisce.
