Ciao lista,
recentemente ho scoperto una nuova feature supportata da Linux che non conoscevo, le Capabilities: http://man7.org/linux/man-pages/man7/capabilities.7.html
Praticamente si tratta di un insieme di "permessi" che un file binario eseguibile puo' avere, in aggiunta ai piu' noti rwx a livello di owner, group e other, e ai setuid e setgid che e' possibile assegnare con chmod. Le capabilities non appaiono quando si listano i file con `ls -l` e servono dei comandi appositi per leggerle e scriverle: setcap e getcap.
Nel concreto, gli esempi piu' chiari che ho trovato sono due:
1. quello di assegnare la capability CAP_NET_BIND_SERVICE per permettere a un eseguibile (lanciato da un utente non root) di aprire un socket su una porta inferiore alla 1024.
2. per permettere a un utente di creare un socket raw (non tcp o udp), si puo' assegnare la capability CAP_NET_RAW.
In entrambi i casi, un binario che possiede le suddette capabilities e' in grado di effettuare certe operazioni che normalmente solo root puo' fare senza avere setuid o setgid e la ownership di root.
Quello che non mi e' chiaro e': **nel concreto** quando si devono/possono usare queste capabilities? Qualcuno ha degli esempi concreti di applicazioni che necessitano di avere delle capabilities? In che casi e perche' bisognerebbe assegnare una capability piuttosto che assegnare setuid?
Saluti Giulio
Quello che non mi e' chiaro e': **nel concreto** quando si devono/possono usare queste capabilities? Qualcuno ha degli esempi concreti di applicazioni che necessitano di avere delle capabilities? In che casi e perche' bisognerebbe assegnare una capability piuttosto che assegnare setuid?
Premesso che ho sentito di queste capabilities solo quando tu me ne hai parlato all'incontro a Merano poche ore fa... ;)
come esempio concreto, se hai un eseguibile webserver che vuoi far ascoltare sulla porta 80, mi pare interessante poter dare questa capabiliy CAP_NET_BIND_SERVICE che citi, piuttosto di grezzamante dare setuid root all'eseguibile rischiando che faccia danni.
Bye, Chris.
Chris Mair wrote:
mi pare interessante poter dare questa capabiliy CAP_NET_BIND_SERVICE che citi, piuttosto di grezzamante dare setuid root all'eseguibile rischiando che faccia danni.
Un altro esempio concreto è il ping, che ha bisogno di creare un raw socket per mandare pacchetti icmp. In passato questo programma doveva essere setuid, ma adesso usa le capabilities sotto Linux:
root@grumpel:~# getcap /usr/bin/ping /usr/bin/ping = cap_net_raw+ep
Altri esempi sono wireshark, tcpdump etc.
Thomas
Interessante ma complesso. trovo: https://linux.die.net/man/3/cap_get_file
--------------------------------------- Diego Maniacco, Bolzano (Italy) diego.maniacco@gmail.com ---------------------------------------
[image: Not f'd — you won't find me on Facebook] https://www.fsf.org/fb Not f'd — you won't find me on Facebook
On Wed, 26 Feb 2020 at 08:39, Thomas Pircher thp+lugbz@p5r.uk wrote:
Chris Mair wrote:
mi pare interessante poter dare questa capabiliy CAP_NET_BIND_SERVICE che citi, piuttosto di grezzamante dare setuid root all'eseguibile rischiando che faccia danni.
Un altro esempio concreto è il ping, che ha bisogno di creare un raw socket per mandare pacchetti icmp. In passato questo programma doveva essere setuid, ma adesso usa le capabilities sotto Linux:
root@grumpel:~# getcap /usr/bin/ping /usr/bin/ping = cap_net_raw+ep
Altri esempi sono wireshark, tcpdump etc.
Thomas _______________________________________________ http://lists.lugbz.org/cgi-bin/mailman/listinfo/lugbz-list
Sul mio notebook (Linux Mint 19.3) trovo pochi casi:
diego@dm-nb2:~$ sudo getcap -r /usr/bin/ /usr/bin/mtr-packet = cap_net_raw+ep /usr/bin/gnome-keyring-daemon = cap_ipc_lock+ep
diego --------------------------------------- Diego Maniacco, Bolzano (Italy) diego.maniacco@gmail.com ---------------------------------------
[image: Not f'd — you won't find me on Facebook] https://www.fsf.org/fb Not f'd — you won't find me on Facebook
On Wed, 26 Feb 2020 at 09:03, Diego Maniacco diego.maniacco@gmail.com wrote:
Interessante ma complesso. trovo: https://linux.die.net/man/3/cap_get_file
Diego Maniacco, Bolzano (Italy) diego.maniacco@gmail.com
[image: Not f'd — you won't find me on Facebook] https://www.fsf.org/fb Not f'd — you won't find me on Facebook
On Wed, 26 Feb 2020 at 08:39, Thomas Pircher thp+lugbz@p5r.uk wrote:
Chris Mair wrote:
mi pare interessante poter dare questa capabiliy CAP_NET_BIND_SERVICE che citi, piuttosto di grezzamante dare setuid root all'eseguibile rischiando che faccia danni.
Un altro esempio concreto è il ping, che ha bisogno di creare un raw socket per mandare pacchetti icmp. In passato questo programma doveva essere setuid, ma adesso usa le capabilities sotto Linux:
root@grumpel:~# getcap /usr/bin/ping /usr/bin/ping = cap_net_raw+ep
Altri esempi sono wireshark, tcpdump etc.
Thomas _______________________________________________ http://lists.lugbz.org/cgi-bin/mailman/listinfo/lugbz-list
"Giulio" == Giulio Roman giulio@roman.bz.it writes:
Giulio> Ciao lista, Giulio> recentemente ho scoperto una nuova feature supportata da Linux che non Giulio> conoscevo, le Capabilities: Giulio> http://man7.org/linux/man-pages/man7/capabilities.7.html
Giulio> Quello che non mi e' chiaro e': **nel concreto** quando si Giulio> devono/possono usare queste capabilities? Qualcuno ha degli esempi Giulio> concreti di applicazioni che necessitano di avere delle capabilities? Giulio> In che casi e perche' bisognerebbe assegnare una capability piuttosto Giulio> che assegnare setuid?
Il tentativo degli sviluppatori del kernel è stato quello di suddividere l'onnipotenza dell'utente root in in molteplici permission che potessero venir assegnate indipendentemente.
La differenza sta appunto nel fatto che un setuid (root) equivale ad assegnare a quel processo tutte le capabilities.
Ad esempio in ambito containers come Docker et similia, le capabilities possono essere aggiunte o rimosse singolarmente: https://docs.docker.com/engine/reference/run/#runtime-privilege-and-linux-ca...
Alcuni commenti su capabilities: https://forums.grsecurity.net/viewtopic.php?t=2522
Diciamo che l'utilizzo migliore è appunto CAP_NET_BIND_SERVICE per bindare servizi su porte privileged senza che debbano essere root o raw socket per ping & co. Alcune distro (o solo alcuni hardening?) le usano anche per non dare i privilegi di root a X (ma poi dandogli i permessi di owner su qualsiasi file è quasi uguale eh :)
Se ti interessa l'argomento e una comparazione con altri, vedi: https://media.ccc.de/v/36c3-10519-a_systematic_evaluation_of_openbsd_s_mitig... https://isopenbsdsecu.re/
ciao, I.
On Tue, Feb 25, 2020 at 10:53:14PM +0000, Giulio Roman wrote:
Ciao lista,
recentemente ho scoperto una nuova feature supportata da Linux che non conoscevo, le Capabilities: http://man7.org/linux/man-pages/man7/capabilities.7.html
Praticamente si tratta di un insieme di "permessi" che un file binario eseguibile puo' avere, in aggiunta ai piu' noti rwx a livello di owner, group e other, e ai setuid e setgid che e' possibile assegnare con chmod. Le capabilities non appaiono quando si listano i file con `ls -l` e servono dei comandi appositi per leggerle e scriverle: setcap e getcap.
Nel concreto, gli esempi piu' chiari che ho trovato sono due:
quello di assegnare la capability CAP_NET_BIND_SERVICE per permettere a un eseguibile (lanciato da un utente non root) di aprire un socket su una porta inferiore alla 1024.
per permettere a un utente di creare un socket raw (non tcp o udp), si puo' assegnare la capability CAP_NET_RAW.
In entrambi i casi, un binario che possiede le suddette capabilities e' in grado di effettuare certe operazioni che normalmente solo root puo' fare senza avere setuid o setgid e la ownership di root.
Quello che non mi e' chiaro e': **nel concreto** quando si devono/possono usare queste capabilities? Qualcuno ha degli esempi concreti di applicazioni che necessitano di avere delle capabilities? In che casi e perche' bisognerebbe assegnare una capability piuttosto che assegnare setuid?
Saluti Giulio _______________________________________________ http://lists.lugbz.org/cgi-bin/mailman/listinfo/lugbz-list