SlideShare una empresa de Scribd logo
Linux Capabilites 
Indice 
Titolo Pagine Titolo Pagine 
Indice 1 Estrazione/Decodifica... 4 
Diritti 1 File di configurazione 2 
LC: cosa sono e... 3 Assegnazione delle cap. 10 
Il caso di ping 4 Stato di alcune distribuz. 7 
Quale LC per ping? 3 Problemi? 2 
Gestione delle LC 4 Ringraziamenti 1 
Altri esempi 10
DDiirriittttii 
Presentazione di: Alessandro Selli <alessandroselli@linux.com> 
Copyright © 2014 Alessandro Selli. 
Si concede il permesso di effettuare copie, di distribuire e/o di 
modificare di questo documento secondo quanto stabilito nella licenza 
GNU Free Documentation License, versione 1.3 o successiva 
pubblicata dalla Free Software Foundation, stante la presente 
diapositiva (numero 2) quale Sezione Invariante e nessun testo di 
prima o di quarta di copertina. 
Una copia della licenza è disponibile in linea come pure presso 
l'autore. 
Versione 2.1.5, 2014/10/27
Linux Capabilites: 
cosa sono e fanno 1-3 
● Inizialmente implementavano POSIX: 
 1003.1e (API), "Protection, Audit and 
Control Interfaces" 
 1003.2c (Shell and Utilities), "Protection 
and Control Interfaces" 
●Detti infatti a volte Linux POSIX Capabilities 
●Ultima revisione di 1003.1e e 1003.2c nel 1997 
●Nel 1999 sono stati dichiarati bozze ritirate 
● Linux è quindi andato per la sua strada
Linux Capabilites: 
cosa sono e fanno 2-3 
Vantaggi: 
● Permettono la delega di diritti di superutente a 
processi non privilegiati, come il bit suid 
● Sono registrati sul filesystem, come il bit suid 
● Non funzionano sul principio “o tutto o nulla”, 
diversamente dal bit suid 
In breve: 
● permettono ad un processo di fare alcune cose 
con i privilegi di root, ma null'altro
Linux Capabilites: 
cosa sono e fanno 3-3 
Svantaggi: 
● I comandi necessitano di codice LC specifico 
● Alcuni FS non supportano LC (NFS v.3, ma squashfs, 
tmpfs e f2fs adesso si): 
[root@debian ~]# getcap /mnt/nfs/nfsserver/dumpdates 
Failed to get capabilities of file `/mnt/nfs/nfsserver/dumpdates' 
(Operation not supported) 
[root@debian ~]# 
● I privilegi LC non sono ridotti come il SUID root 
 Ma le recenti libcap-ng rendono facile farlo
IIll ccaassoo ddii ppiinngg 11--44 
● Un esempio classico: ping 
● Ha bisogno dei diritti di superutente per inviare 
pacchetti ICMP di tipo echo-request 
● Nessuno vorrebbe permettere a chiunque di 
produrre pacchetti ICMP arbitrari! 
● L'approccio tradizionale è il seguente:
IIll ccaassoo ddii ppiinngg 22--44 
Situazione iniziale: 
[alessandro@ubuntu ~]$ lsb_release ­drc 
Description: Ubuntu 14.04.1 LTS 
Release: 14.04 
Codename: trusty 
[alessandro@ubuntu ~]$ ll /bin/ping 
­rwsr­xr­x 
1 root root 44178 mag 7 23:51 /bin/ping 
[alessandro@ubuntu ~]$ ping ­c 
3 route­add. 
net 
PING route­add. 
net (195.182.210.166) 56(84) bytes of data. 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=1 ttl=55 time=46.8 ms 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=2 ttl=55 time=46.6 ms 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=3 ttl=55 time=45.5 ms 
­­­route­add. 
net ping statistics ­­­3 
packets transmitted, 3 received, 0% packet loss, time 2002ms 
rtt min/avg/max/mdev = 45.549/46.329/46.829/0.558 ms 
[alessandro@ubuntu ~]$
IIll ccaassoo ddii ppiinngg 33--44 
● Secondo gli standard i diritti del processo sono 
quelli dell'utente che ha lanciato l'eseguibile 
Non del proprietario del file eseguibile! 
● A meno che il bit suid bit non sia impostato. 
­rwsr­xr­x 
1 root root 44178 mag 7 23:51 /bin/ping
IIll ccaassoo ddii ppiinngg 44--44 
“Sabotiamo” ping: 
[root@ubuntu ~]# chmod u­s 
/bin/ping 
[root@ubuntu ~]# ll /bin/ping 
­rwxr­xr­x 
1 root root 44178 mag 7 23:51 /bin/ping 
[root@ubuntu ~]# 
Conseguenza: 
[alessandro@ubuntu ~]$ ping ­c 
3 route­add. 
net 
ping: icmp open socket: Operazione non permessa 
[alessandro@ubuntu ~]$ 
Se non specificato diversamente, Ubuntu = Fedora.
QQuuaallee LLCC ppeerr ppiinngg?? 11--33 
● Vogliamo tanto i privilegi quanto la sicurezza 
● Vogliamo poter creare socket ICMP senza 
assumere tutti I privilegi di root! 
● Come ci aiutano le Linux Capabilities? 
● RTFM, ovviamente! 
➢ man capabilities(7) 
➢ Lista & informazioni più aggiornate: 
linux/include/uapi/linux/capability.h
QQuuaallee LLCC ppeerr ppiinngg?? 22--33 
Ci sono molte capability tra cui scegliere: 
AUDIT_CONTROL AUDIT_WRITE BLOCK_SUSPEND CHOWN DAC_OVERRIDE DAC_READ_SEARCHC 
AP_LEASE 
FOWNER FSETID IPC_LOCK IPC_OWNER KILL LEASE 
LINUX_IMMUTABLE MAC_ADMIN MAC_OVERRIDE MKNOD NET_ADMIN NET_BIND_SERVICE 
Questa è quella che ci serve 
NET_RAW SETGID SETFCAP SETPCAP SETUID SYS_ADMIN 
SYS_BOOT SYS_CHROOT SYS_MODULE SYS_NICE SYS_PACCT SYS_PTRACE 
SYS_RAWIO SYS_RESOURCE SYS_TIME SYS_TTY_CONFIG SYSLOG WAKE_ALARM
QQuuaallee LLCC ppeerr ppiinngg?? 22--33 
Ci sono molte capability tra cui scegliere: 
AUDIT_CONTROL AUDIT_WRITE BLOCK_SUSPEND CHOWN DAC_OVERRIDE DAC_READ_SEARCHC 
AP_LEASE 
Il CAP_ iniziale è sato omesso nei nomi 
FOWNER FSETID IPC_LOCK IPC_OWNER KILL LEASE 
LINUX_IMMUTABLE MAC_ADMIN MAC_OVERRIDE MKNOD NET_ADMIN NET_BIND_SERVICE 
Questa è quella che ci serve 
NET_RAW SETGID SETFCAP SETPCAP SETUID SYS_ADMIN 
SYS_BOOT SYS_CHROOT SYS_MODULE SYS_NICE SYS_PACCT SYS_PTRACE 
SYS_RAWIO SYS_RESOURCE SYS_TIME SYS_TTY_CONFIG SYSLOG WAKE_ALARM
QQuuaallee LLCC ppeerr ppiinngg?? 33--33 
Il manuale dice: 
CAP_NET_RAW 
* use RAW and PACKET sockets; 
* bind to any address for transparent proxying. 
Sembra quella che ci serve. 
Come la usiamo?
GGeessttiioonnee ddeellllee LLCC 11--44 
Le capability sono gestite con i comandi: 
➢ getcap, mostra le capability dei file 
➢ setcap, imposta le capability ai file 
➢ getpcaps, mostra le cap. dei processi 
➢ capsh, capability shell wrapper 
Ciascuna capability può essere associata ai set: 
➢ p, al processo è permessa la capability 
➢ e, la capability è resa effettiva 
➢ i, la capab. è ereditata dopo un execve()
GGeessttiioonnee ddeellllee LLCC 11--44 
Le capability sono gestite con i comandi: 
➢ getcap, mostra le capability dei file 
➢ setcap, imposta le capability ai file 
➢ getpcaps, mostra le cap. dei processi 
➢ capsh, capability shell wrapper 
Ciascuna capability può essere associata ai set: 
➢ p, al processo è permessa la capability 
➢ e, la capability è resa effettiva 
➢ i, la capab. è ereditata dopo un execve() 
Questa è diventata un bit
GGeessttiioonnee ddeellllee LLCC 22--44 
Iniziamo ad usarle: 
[root@ubuntu ~]# chmod u­s 
/bin/ping 
[root@ubuntu ~]# ll /bin/ping 
­rwxr­xr­x 
1 root root 44168 mag 7 23:51 /bin/ping* 
[root@ubuntu ~]# getcap /bin/ping 
[root@ubuntu ~]# setcap CAP_NET_RAW=ep /bin/ping 
Maiuscole o minuscole 
Sempre minuscole!
GGeessttiioonnee ddeellllee LLCC 22--44 
Iniziamo ad usarle: 
[root@ubuntu ~]# chmod u­s 
/bin/ping 
[root@ubuntu ~]# ll /bin/ping 
­rwxr­xr­x 
1 root root 44168 mag 7 23:51 /bin/ping* 
[root@ubuntu ~]# getcap /bin/ping 
[root@ubuntu ~]# setcap CAP_NET_RAW=ep /bin/ping 
[root@ubuntu ~]# getcap /bin/ping 
/bin/ping = cap_net_raw+ep 
[root@ubuntu ~]# 
Questa notatione va 
bene anche per setcap
GGeessttiioonnee ddeellllee LLCC 33--44 
Funziona? 
[alessandro@ubuntu ~]$ ping ­c 
3 route­add. 
net 
PING route­add. 
net (195.182.210.166) 56(84) bytes of data. 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=1 ttl=55 time=30.7 ms 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=2 ttl=55 time=30.9 ms 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=3 ttl=55 time=31.3 ms 
­­­route­add. 
net ping statistics ­­­3 
packets transmitted, 3 received, 0% packet loss, time 2000ms 
rtt min/avg/max/mdev = 30.709/30.988/31.350/0.304 ms 
[alessandro@ubuntu ~]$
GGeessttiioonnee ddeellllee LLCC 44--44 
Da notare: le capability di ping in Fedora 20: 
[root@fedora ~]# getcap /bin/ping 
/bin/ping = cap_net_admin,cap_net_raw+ep 
[root@fedora ~]# 
CAP_NET_ADMIN contrassegna i pacchetti: 
[alessandro@fedora ~]$ ping ­c1 
­m 
123 route­add. 
net 
PING route­add. 
net (195.182.210.166) 56(84) bytes of data. 
Warning: Failed to set mark 123 
64 bytes from route­add. 
net (195.182.210.166): icmp_seq=1 ttl=53 time=45.8 ms 
­­­route­add. 
net ping statistics ­­­1 
packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 45.802/45.802/45.802/0.000 ms 
[alessandro@fedora ~]$
AAllttrrii eesseemmppii 11--1111 
Tutti conoscono gli Attributi Estesi POSIX, vero? 
VVeerroo?? 
Se no, dovreste. 
● Le LC sono utili, persino necessarie per usare gli 
AEP.
AAllttrrii eesseemmppii 22--1111 
AEP permettono di, ad es., impostare file: 
­a: 
cui si possono solo aggiungere dati 
­i: 
immutabili (né sovrascrivibili né cancell.) 
­S: 
eseguono scritture sincrone 
­D: 
directory che eseguono scritture sincrone 
... (ce ne possono essere fino a 19) 
Capire quale filesystem supporta quali AEP e 
quali no è una vincita al lotto...
AAllttrrii eesseemmppii 33--1111 
C'è però un inghippo: 
● chattr non funziona per gli utenti ordinari: 
[alessandro@fedora ~]$ chattr +i .bashrc 
chattr: Operazione non permessa impostando i flag di 
.bashrc 
[alessandro@fedora ~]$
AAllttrrii eesseemmppii 44--1111 
La soluzione classica UNIX è di farlo SUID root: 
[root@fedora ~]# ll /usr/bin/chattr 
­rwxr­xr­x 
1 root root 10528 giu 24 13:10 /usr/bin/chattr 
[root@fedora ~]# chmod u+s /usr/bin/chattr 
[root@fedora ~]# ll /usr/bin/chattr 
­rwsr­xr­x 
1 root root 10528 giu 24 13:10 /usr/bin/chattr 
[root@fedora ~]# 
Funzionerebbe: 
[alessandro@fedora ~]$ chattr +i .bashrc 
[alessandro@fedora ~]$ lsattr .bashrc 
­­­­i­­­­­­­­e­­. 
bashrc 
[alessandro@fedora ~]$
AAllttrrii eesseemmppii 55--1111 
Però... 
[alessandro@fedora ~]$ lsattr ~games/.profile 
­­­­­­­­­­­­­e­­/ 
opt/games/.profile 
[alessandro@fedora ~]$ chattr +i ~games/.profile 
[alessandro@fedora ~]$ lsattr ~games/.profile 
­­­­i­­­­­­­­e­­/ 
usr/games/.profile 
[alessandro@fedora ~]$ 
Il che è normale per i privilegi di superutente. 
Decisamente non vogliamo che questo accada.
AAllttrrii eesseemmppii 66--1111 
Questa è la cosa giusta da fare: 
[root@fedora ~]# chmod u­s 
/bin/chattr 
[root@fedora ~]# ll /bin/chattr 
­rwxr­xr­x 
1 root root 10736 Aug 3 11:36 /bin/chattr 
[root@fedora ~]# setcap CAP_LINUX_IMMUTABLE=ep /bin/chattr 
[root@fedora ~]# getcap /bin/chattr 
/bin/chattr = cap_linux_immutable+ep 
[root@fedora ~]#
AAllttrrii eesseemmppii 77--1111 
Che fa succedere le cose giuste: 
[alessandro@fedora ~]$ lsattr .bashrc 
­­­­­­­­­­­­­e­­. 
bashrc 
[alessandro@fedora ~]$ chattr +i .bashrc 
[alessandro@fedora ~]$ lsattr .bashrc 
­­­­i­­­­­­­­e­­. 
bashrc 
[alessandro@fedora ~]$ chattr +i ~games/.profile 
chattr: Operazione non permessa impostando i flag di 
/usr/games/.profile 
[alessandro@fedora ~]$
"Mi spiace Dave, purtroppo non 
posso farlo".
AAllttrrii eesseemmppii 88--1111 
●DAC = Discretionary Access Control 
● È il meccanismo classico Unix per decidere chi 
può fare cosa 
● Nel filesystem appare in forma dei diritti rwx 
● Le LC possono incasinare anche loro! :-)
AAllttrrii eesseemmppii 99--1111 
Suoniamo il cicalino! (In un xterm) 
[alessandro@fedora ~]$ beep ­f 
2000 ­l 
100 
Could not open /dev/tty0 or /dev/vc/0 for writing 
open: No such file or directory 
[alessandro@fedora ~]$ 
Il manuale dice: 
Di default beep non è installato con il bit suid impostato, farlo 
farebbe ridere. D'altra parte, renderlo suid root farebbe svanire 
magicamente tutti i problemi con le chiamate ioctl, il che fa 
piacere, e la sola regione di non volerlo fare è che ogni 
programma suid è una potenziale falla di sicurezza. Per fortuna 
beep è molto piccolo, ispezionarne il codice è piuttosto facile.
AAllttrrii eesseemmppii 1100--1111 
Usiamo le LC invece. L'errore era: 
Could not open /dev/tty0 or /dev/vc/0 for writing 
Ossia, è un problema di DAC. 
[root@fedora ~]# setcap CAP_DAC_OVERRIDE=pe /bin/beep 
[root@fedora ~]# 
[alessandro@fedora ~]$ beep ­f 
2000 ­l 
100 
ioctl: Operation not permitted 
ioctl: Operation not permitted 
[alessandro@fedora ~]$ 
CAP_SYS_TTY_CONFIG 
Use vhangup(2); employ various privileged ioctl(2) operations 
on virtual terminals. 
Dal 
manuale:
AAllttrrii eesseemmppii 1111--1111 
Tutte e due le capability insieme: 
[root@fedora ~]# setcap  
> CAP_DAC_OVERRIDE,CAP_SYS_TTY_CONFIG=pe /bin/beep 
[root@fedora ~]# 
[alessandro@fedora ~]$ beep ­f 
2000 ­l 
100 
[alessandro@fedora ~]$
"Va bene Dave, credo di aver 
capito come fare questo"
Estrazione/Decodifica informazioni 
1-4 
Quali LC sono attive adesso? 
[root@ubuntu ~]# cp /bin/bash /tmp/ 
[root@ubuntu ~]# setcap CAP_KILL,CAP_DAC_OVERRIDE+epi /tmp/bash 
[root@ubuntu ~]# getcap /tmp/bash 
/tmp/bash = cap_dac_override,cap_kill+eip 
[root@ubuntu ~]# 
Ereditarietà impostata 
[alessandro@ubuntu ~]$ /tmp/bash ­l 
[alessandro@ubuntu ~]$ getpcaps $$ 
Capabilities for `15400': = cap_dac_override,cap_kill+ep 
[alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status 
CapInh: 0000000000000000 
CapPrm: 0000000000000022 
CapEff: 0000000000000022 
CapBnd: 0000001fffffffff 
[alessandro@ubuntu ~]$ 
Ereditarietà assente!
Estrazione/Decodifica informazioni 
2-4 
Decodifica della mappa di bit esadecimale LC: 
[alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status 
CapInh: 0000000000000000 
CapPrm: 0000000000000022 
Rappresentata ancora 
CapEff: 0000000000000022 
come un set 
CapBnd: 0000001fffffffff 
[alessandro@ubuntu ~]$ capsh ­­decode= 
0000000000000000 
0x0000000000000000= 
[alessandro@ubuntu ~]$ capsh ­­decode= 
0000000000000022 
0x0000000000000022=cap_dac_override,cap_kill 
[alessandro@ubuntu ~]$
Estrazione/Decodifica informazioni 
3-4 
0000001fffffffff = Capability Bounding Set 
1 = cap permessa (mantenuta se presente) 
0 = cap mascherata (o nessuna LC associata al bit) 
I bit sono mappati uno-ad-uno alle LC 
0000001fffffffff è una maschera a 64-bit 
● È un campo a 64 bit dalla libcap versione 2.03 
● Prima era a 32 bit
Estrazione/Decodifica informazioni 
4-4 
Il numero delle capability mappate è consistente 
con il valore del conteggio da zero manteuto 
in /proc/sys/kernel/cap_last_cap 
Kernel 3.14.19:1fffffffff → 1+9*4=37 
/proc/sys/kernel/cap_last_cap = 36 
Kernel 3.16.3: 3fffffffff → 2+9*4=38 
/proc/sys/kernel/cap_last_cap = 37
FFiillee ddii ccoonnffiigguurraazziioonnee 11--22 
capability.conf1: utenti che ereditano le LC 
[root@ubuntu ~]# cat /etc/security/capability.conf 
cap_kill alessandro 
none * 
[root@ubuntu ~]# 
Se assente tutti gli utenti avranno 
ereditabili tutte le capability! 
Le modifiche hanno effetto dopo un nuovo login: 
Ubuntu 14.04.1 LTS ubuntu tty1 
CAP_KILL adesso è ereditabile 
ubuntu login: alessandro 
Password: 
[alessandro@ubuntu ~]$ getpcaps $$ 
Capabilities for `8586': = cap_kill+i 
[alessandro@ubuntu ~]$
FFiillee ddii ccoonnffiigguurraazziioonnee 22--22 
Il processo figlio della nuova shell eredita le LC: 
[alessandro@ubuntu ~]$ getpcaps $$ 
Capabilities for `16332': = cap_kill+i 
[alessandro@ubuntu ~]$ getcap /tmp/bash 
/tmp/bash = cap_dac_override,cap_kill+eip 
[alessandro@ubuntu ~]$ /tmp/bash ­l 
[alessandro@ubuntu ~]$ getpcaps $$ 
Capabilities for `16849': = cap_kill+eip cap_dac_override+ep 
[alessandro@ubuntu ~]$ 
Cap presente nel file 
di configurazione 
Cap assente nel file di 
configurazione 
1) Serve il pacchetto Ubuntu libpam-cap. Fedora ha quello libcap, ma 
queste operazioni falliscono (PAM failure: System error)
Assegnazione ddeellllee ccaappaabbiilliittyy 11--1100 
2.2.11 2.6.25 opzionale 
Bounding-set di sistema Bounding-set per thread 
2.6.33 integrato 
● Prima del 2.6.25 Bounding Set era di sistema 
● Dal 2.6.25 è per thread 
● Dismesso da processo dotato di CAP_SETPCAP 
con operazione prctl(2) PR_CAPBSET_DROP 
● Ereditato in fork(2), mantenuto dopo execve(2) 
● Opzionale dal 2.6.33, da allora integrato
Assegnazione ddeellllee ccaappaabbiilliittyy 22--1100 
N Nuovo P Precedente F Cap. impostata nel File 
e capability 
Effettiva p Capability Permessa i Capability ereditata 
CBS Capability Bounding Set1 
Le nuove capability erano calcolate così: 
Np (Pi∪Fi)∩(Fp∪CBS) 
Ne Fe∪Np 
Ni Pi 
1) Maschera delle capability permesse mantenute dopo execve(2). Nessun effetto su quelle ereditate. 
Dal kernel 2.6.25 limita quelle ereditate che possono essere aggiunte a se stessi anche se permesse.
Assegnazione ddeellllee ccaappaabbiilliittyy 33--1100 
N Nuovo P Precedente F Cap. impostata nel File 
e capability 
Effettiva p Capability Permessa i Capability ereditata 
CBS Capability Bounding Set1 
Adesso sono calcolate così: 
Np (Pi∪Fi)∩(Fp∪CBS) 
Ne Fe ? Np : 02 
Ni Pi 
2) Non è più un AND perché il set Effettivo è un bit, non più un set (un bit per capability).
Assegnazione ddeellllee ccaappaabbiilliittyy 44--1100 
Cosa fa il Capability Bounding Set? 
1) In un execve(2) toglie al thread le 
capability permesse con un AND cap file. 
2) Limita le cap ereditabili del thread che 
possono essere aggiunte con un capset(2) 
(kernel >= 2.6.25). Però: 
a) la capability può essere ancora permessa; 
b)la cap può essere ancora impostata se è 
nel set ereditabile del file.
Assegnazione ddeellllee ccaappaabbiilliittyy 55--1100 
Potenziale rischio: cap accidentalmente permesse. 
Si consideri la situazione: 
1) processo genitore: CAP_X ered., non in CBS 
2)CAP_X non sarà nel set permesso 
a) ma rimane nel set ereditato dei figli 
3) Il processo può eseguire figlio con CAP_X 
nei set sia permesso che ereditato! 
Togliere cap da CBS può dare un falso senso di 
sicurezza! Da solo non basta!
Assegnazione ddeellllee ccaappaabbiilliittyy 66--1100 
Come per SUID, le LC degli script sono ignorati: 
[alessandro@ubuntu ~]$ cat ~/bin/test_cap.sh 
#!/bin/dash 
getpcaps $$ 
grep ^Cap /proc/$$/status 
[alessandro@ubuntu ~]$ getcap ~/bin/test_cap.sh 
/home/alessandro/bin/test_cap.sh = cap_linux_immutable+ep 
[alessandro@ubuntu ~]$ test_cap.sh 
Capabilities for `9093': = 
Ignorata 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
Ignorata 
CapBnd: 0000001fffffffff 
[alessandro@ubuntu ~]$
Assegnazione ddeellllee ccaappaabbiilliittyy 77--1100 
Solo le LC degli eseguibili binari fanno testo: 
[alessandro@ubuntu ~]$ cat ~/bin/test2_cap.sh 
#!/tmp/dash 
getpcaps $$ 
grep ^Cap /proc/$$/status 
[alessandro@ubuntu ~]$ getcap ~/bin/test2_cap.sh /tmp/dash 
/tmp/dash = cap_linux_immutable+ep 
[alessandro@ubuntu ~]$ test2_cap.sh 
Capabilities for `9218': = cap_linux_immutable+ep 
CapInh: 0000000000000000 
CapPrm: 0000000000000200 
CapEff: 0000000000000200 
Presente Presente 
CapBnd: 0000001fffffffff 
[alessandro@ubuntu ~]$
Assegnazione ddeellllee ccaappaabbiilliittyy 88--1100 
capsh può ridurre le CBS della shell: 
[alessandro@ubuntu ~]$ getcap $(which capsh) 
/sbin/capsh = cap_setpcap+p 
[alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: 0000001fffffffff 
[alessandro@ubuntu ~]$ capsh ­­drop= 
cap_net_raw ­­[ 
alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
CapEff: 0000000000000000 
CapBnd: 0000001fffffdfff 
[alessandro@ubuntu ~]$
Assegnazione ddeellllee ccaappaabbiilliittyy 99--1100 
Riduzione CBS con capsh. Situazione iniziale: 
[alessandro@ubuntu ~]$ getcap $(which capsh ping) 
/sbin/capsh = cap_setpcap+p 
/bin/ping = cap_net_raw+p 
[alessandro@ubuntu ~]$ getpcaps $$ 
Capabilities for `7842': = 
[alessandro@ubuntu ~]$ ping ­qc1 
route­add. 
net 
PING route­add. 
net (195.182.210.166) 56(84) bytes of data. 
­­­route­add. 
net ping statistics ­­­1 
packets transmitted, 1 received, 0% packet loss, time 0ms 
rtt min/avg/max/mdev = 27.718/27.718/27.718/0.000 ms 
[alessandro@ubuntu ~]$
Assegnazione ddeellllee ccaappaabbiilliittyy 1100--1100 
Esecuzione shell con CBS ridotte via capsh: 
[alessandro@ubuntu ~]$ capsh ­­drop= 
cap_net_raw ­­[ 
alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status 
CapInh: 0000000000000000 
CapPrm: 0000000000000000 
! 
CapEff: 0000000000000000 
CapBnd: 0000001fffffdfff 
[alessandro@ubuntu ~]$ capsh ­­decode= 
2000 
0x0000000000002000=cap_net_raw 
[alessandro@ubuntu ~]$ ping ­qc1 
route­add. 
net 
ping: icmp open socket: Operation not permitted 
[alessandro@ubuntu ~]$
SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 11--77 
Lo scopo è di sostituire ovunque possibile agli 
eseguibili i bit SUID/SGID con le capability: 
● Fedora: ultimo aggiornamento: 2011-04-05, 
completato: 100% (molti, non tutti, i SUID 
tolti) 
● Ubuntu: lavori in corso (ultimo aggiornamento: 
2011-09-27) 
Non è ancora possibile sostituire tutti i SUID con 
le Linux Capabilities
SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 22--77 
Fedora 20 (Heisenbug): un paio di dozzine di file 
suid (in un'installazione LXDE non-standard) 
# find / ­xdev 
­type 
f ­perm 
/111 ­perm 
/4000 ­user 
root | wc ­l 
23 
# 
/usr/sbin/mount.nfs /usr/bin/mount /usr/bin/chsh /usr/bin/write 
/usr/bin/fusermount /usr/bin/umount /usr/bin/chage /usr/bin/passwd 
/usr/bin/newgrp /usr/bin/locate /usr/bin/su /usr/bin/sudo 
/usr/bin/gpasswd /usr/bin/cgexec /usr/bin/chfn /usr/bin/Xorg 
/usr/bin/ssh­agent 
/usr/bin/crontab /usr/bin/at /usr/bin/ksu 
/usr/sbin/postqueue /usr/sbin/postdrop /usr/sbin/ssmtp /usr/bin/pkexec
SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 33--77 
Ubuntu 14.04.1 (Trusty Tahr): alcune di più 
(ancora in un'installazione XFCE non-standard) 
# find / /usr ­xdev 
­type 
f ­perm 
/111 ­perm 
/4000 ­user 
root | wc ­l 
29 
# 
Erano 34 in 13.10 (Saucy Salamander)
Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 44--77 
Vediamo un caso in cui le LC non funzionano: 
[alessandro@fedora ~]$ ll /usr/bin/at 
­rwsr­xr­x 
1 root root 53208 5 dic 12.34 /usr/bin/at 
[alessandro@fedora ~]$ getcap /usr/bin/at 
[alessandro@fedora ~]$ 
Togliamo il bit SUID e qualsiasi capability: 
[root@fedora ~]# chmod u­s 
/usr/bin/at 
[root@fedora ~]# setcap ­r 
/usr/bin/at 
[root@fedora ~]# 
[alessandro@fedora ~]$ at ­f 
~/bin/at.sh now+5min 
cannot set egid: Operation not permitted 
[alessandro@fedora ~]$
Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 55--77 
Cerchiamo di farlo felice: 
[root@fedora ~]# setcap CAP_SETGID+ep /usr/bin/at 
[root@fedora ~]# 
Nessuna fortuna: 
[alessandro@fedora ~]$ at ­f 
~/bin/at.sh now+5min 
cannot set euid: Operation not permitted 
[alessandro@fedora ~]$ 
[root@fedora ~]# setcap CAP_SETUID,CAP_SETGID+ep /usr/bin/at 
[root@fedora ~]# 
[alessandro@fedora ~]$ at ­f 
~/bin/at.sh now+5min 
PAM failure: System error 
[alessandro@fedora ~]$ :­(
Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 66--77 
Nel file di log compare: 
[alessandro@fedora ~]$ tail ­1 
/var/log/secure 
Feb 23 10:08:43 fedora at: PAM audit_log_acct_message() 
failed: Operation not permitted 
[alessandro@fedora ~]$ 
Nulla da fare, per ora.
Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 77--77 
Ubuntu ha seguito una strada diversa: 
● usa la stessa implementazione di at/atd (di 
Thomas Koenig, ig25@rz.uni-karlsruhe.de) 
● il demone gira come utente daemon 
● l'eseguibile del client è SUID e SGUI 
daemon:daemon, il che gli permette di: 
 scrivere in /var/spool/cron/atjobs/.SEQ 
 mandare segnali ad atd 
Vecchia scuola, semplice, efficace, sicuro.
PPrroobblleemmii?? 11--22 
«Perché così poche persone conoscono e usano 
le capability? Credo che la documentazione 
scarsa sia la ragione principale. Per esempio, 
la Fedora 10 non ha le pagine man di 
getpcaps, capsh e pam_cap, e la Guida 
alla Sicurezza di Fedora neppure nomina le 
capability» 
(Finnbarr P. Murphy, 28 maggio 2009 ) 
Tutto vero ancora oggi!
PPrroobblleemmii?? 22--22 
●Documentazione online distrib. ferma da anni 
● La Guida alla Sicurezza di Fedora nelle stesse 
condizioni alla vers. 19.1, e manca nella 20 
➢Ma almeno le pagine man ci sono 
➢ Nel suo futuro solo SELinux? 
● Il comportamento delle LC è cambiato 
➢ Gli stessi comandi, capability e set hanno 
effetti diversi rispetto a 2.6.24 senza errori 
● libcap-ng rende la programmazione più facile
RRiinnggrraazziiaammeennttii 11--11 
● Quelli del progetto Linux man-pages ( 
https://www.kernel.org/doc/man-pages/) 
● Finnbarr P. Murphy (post di blog e riferimenti, 
utile anche se superato) 
● E gli sviluppatori del kernel, naturalmente! 
 Andrew G. Morgan <morgan@kernel.org> 
 Alexander Kjeldaas <astor@guardian.no> con 
contributi di Aleph1, Roland Buresund e Andrew 
Main.

Más contenido relacionado

La actualidad más candente

Linux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneLinux Kernel, driver e compilazione
Linux Kernel, driver e compilazione
Fulvio Corno
 
Socket python
Socket pythonSocket python
Socket python
Marco Buttolo
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumate
Marco Buttolo
 
Post gresql su_raspberry
Post gresql su_raspberryPost gresql su_raspberry
Post gresql su_raspberry
Marco Buttolo
 
Seminario introduzione all'uso del terminale e della bash in Linux
Seminario introduzione all'uso del terminale e della bash in LinuxSeminario introduzione all'uso del terminale e della bash in Linux
Seminario introduzione all'uso del terminale e della bash in Linux
alberto fiaschi
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryEnrico Pirozzi
 
Openmoko
OpenmokoOpenmoko
Openmoko
guestec2667
 
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
Mirko Mancin
 
LTSP
LTSPLTSP
Introduzione Alla Uml Mconsole
Introduzione Alla Uml MconsoleIntroduzione Alla Uml Mconsole
Introduzione Alla Uml MconsoleMajong DevJfu
 
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
Mirko Mancin
 
LUG - Ricompilazione kernel
LUG - Ricompilazione kernelLUG - Ricompilazione kernel
LUG - Ricompilazione kernel
Alessandro Manfredi
 
Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?festival ICT 2016
 
Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018
Marco Chiesi
 
Compilazione Kernel
Compilazione KernelCompilazione Kernel
Compilazione Kernel
N3mes1s Uncategorized
 
Introduzione ros
Introduzione rosIntroduzione ros
Introduzione ros
Marco Buttolo
 
Command Terminal Linux
Command Terminal LinuxCommand Terminal Linux
Command Terminal Linux
Micro Focus SRL
 
From Scratch To Network - User mode linux
From Scratch To Network - User mode linuxFrom Scratch To Network - User mode linux
From Scratch To Network - User mode linuxMajong DevJfu
 
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Camelug Fava
 
Buffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter AttackBuffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter Attack
luigi capuzzello
 

La actualidad más candente (20)

Linux Kernel, driver e compilazione
Linux Kernel, driver e compilazioneLinux Kernel, driver e compilazione
Linux Kernel, driver e compilazione
 
Socket python
Socket pythonSocket python
Socket python
 
Installazione ambientepython ubuntumate
Installazione ambientepython ubuntumateInstallazione ambientepython ubuntumate
Installazione ambientepython ubuntumate
 
Post gresql su_raspberry
Post gresql su_raspberryPost gresql su_raspberry
Post gresql su_raspberry
 
Seminario introduzione all'uso del terminale e della bash in Linux
Seminario introduzione all'uso del terminale e della bash in LinuxSeminario introduzione all'uso del terminale e della bash in Linux
Seminario introduzione all'uso del terminale e della bash in Linux
 
PostgreSQL: Point in time recovery
PostgreSQL: Point in time recoveryPostgreSQL: Point in time recovery
PostgreSQL: Point in time recovery
 
Openmoko
OpenmokoOpenmoko
Openmoko
 
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 2 - Corso Linux, Android e Internet of Things
 
LTSP
LTSPLTSP
LTSP
 
Introduzione Alla Uml Mconsole
Introduzione Alla Uml MconsoleIntroduzione Alla Uml Mconsole
Introduzione Alla Uml Mconsole
 
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of ThingsCodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
CodingGym - Lezione 3 - Corso Linux, Android e Internet of Things
 
LUG - Ricompilazione kernel
LUG - Ricompilazione kernelLUG - Ricompilazione kernel
LUG - Ricompilazione kernel
 
Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?Io uso Tor e non lascio tracce! Sei proprio sicuro?
Io uso Tor e non lascio tracce! Sei proprio sicuro?
 
Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018Chi ha paura della command-line? - WordCamp Roma 2018
Chi ha paura della command-line? - WordCamp Roma 2018
 
Compilazione Kernel
Compilazione KernelCompilazione Kernel
Compilazione Kernel
 
Introduzione ros
Introduzione rosIntroduzione ros
Introduzione ros
 
Command Terminal Linux
Command Terminal LinuxCommand Terminal Linux
Command Terminal Linux
 
From Scratch To Network - User mode linux
From Scratch To Network - User mode linuxFrom Scratch To Network - User mode linux
From Scratch To Network - User mode linux
 
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
Snort React per Webfiltering : "Soluzioni per le Leggi-Lista"
 
Buffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter AttackBuffer Overflow - Shellcode - Shatter Attack
Buffer Overflow - Shellcode - Shatter Attack
 

Similar a Linux Capabilities - ita - v2.1.5 - compatta

PIT2012: Workshop@UniNA - Compilazione del Kernel Linux
PIT2012: Workshop@UniNA - Compilazione del Kernel LinuxPIT2012: Workshop@UniNA - Compilazione del Kernel Linux
PIT2012: Workshop@UniNA - Compilazione del Kernel LinuxMarco Ferrigno
 
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Gabriele Guizzardi
 
TuxIsAlive
TuxIsAliveTuxIsAlive
TuxIsAlive
Claudio Mignanti
 
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Codemotion
 
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi ClusterCodemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Matteo Baccan
 
LUG - Logical volumes management
LUG - Logical volumes managementLUG - Logical volumes management
LUG - Logical volumes managementAlessandro Manfredi
 
Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)
Marcello Missiroli
 
Moduli del kernel - Boot del sistema
 Moduli del kernel - Boot del sistema Moduli del kernel - Boot del sistema
Moduli del kernel - Boot del sistema
Fulvio Corno
 
Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxAlex Palesandro
 
Giochiamo ai COW-boy : zfs & btrfs
Giochiamo ai COW-boy : zfs & btrfsGiochiamo ai COW-boy : zfs & btrfs
Giochiamo ai COW-boy : zfs & btrfs
alberto fiaschi
 
Linux Security Hardening - panoramica sui principi generali per la riduzione...
Linux  Security Hardening - panoramica sui principi generali per la riduzione...Linux  Security Hardening - panoramica sui principi generali per la riduzione...
Linux Security Hardening - panoramica sui principi generali per la riduzione...
Marco Ferrigno
 
Hardening
HardeningHardening
Hardening
NaLUG
 
Implementazione DAOS in ambienti enterprise
Implementazione DAOS in ambienti enterpriseImplementazione DAOS in ambienti enterprise
Implementazione DAOS in ambienti enterprise
Luca Arcara
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Codemotion
 
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
Matteo Baccan
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizio
MongoDB
 
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan
 
Cuma rev001
Cuma rev001Cuma rev001
Cuma rev001
Paradisi63
 

Similar a Linux Capabilities - ita - v2.1.5 - compatta (20)

PIT2012: Workshop@UniNA - Compilazione del Kernel Linux
PIT2012: Workshop@UniNA - Compilazione del Kernel LinuxPIT2012: Workshop@UniNA - Compilazione del Kernel Linux
PIT2012: Workshop@UniNA - Compilazione del Kernel Linux
 
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
Raspberry pi per tutti (workshop presso Warehouse Coworking Pesaro)
 
TuxIsAlive
TuxIsAliveTuxIsAlive
TuxIsAlive
 
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un'architettura Raspberry Pi...
 
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi ClusterCodemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
Codemotion 2014 : ottimizzare JAVA e PHP su un’architettura Raspberry Pi Cluster
 
X2 Linux Riassunti
X2 Linux RiassuntiX2 Linux Riassunti
X2 Linux Riassunti
 
LUG - Logical volumes management
LUG - Logical volumes managementLUG - Logical volumes management
LUG - Logical volumes management
 
Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)Il dual boot scolastico perfetto (2012)
Il dual boot scolastico perfetto (2012)
 
Moduli del kernel - Boot del sistema
 Moduli del kernel - Boot del sistema Moduli del kernel - Boot del sistema
Moduli del kernel - Boot del sistema
 
Lezione corso Base GNU/Linux
Lezione corso Base GNU/LinuxLezione corso Base GNU/Linux
Lezione corso Base GNU/Linux
 
Giochiamo ai COW-boy : zfs & btrfs
Giochiamo ai COW-boy : zfs & btrfsGiochiamo ai COW-boy : zfs & btrfs
Giochiamo ai COW-boy : zfs & btrfs
 
Linux Security Hardening - panoramica sui principi generali per la riduzione...
Linux  Security Hardening - panoramica sui principi generali per la riduzione...Linux  Security Hardening - panoramica sui principi generali per la riduzione...
Linux Security Hardening - panoramica sui principi generali per la riduzione...
 
Hardening
HardeningHardening
Hardening
 
Sfrontori pillole-cobbler
Sfrontori pillole-cobblerSfrontori pillole-cobbler
Sfrontori pillole-cobbler
 
Implementazione DAOS in ambienti enterprise
Implementazione DAOS in ambienti enterpriseImplementazione DAOS in ambienti enterprise
Implementazione DAOS in ambienti enterprise
 
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
Succo di lampone: come ottimizzare JAVA e PHP su un’architettura Raspberry Pi...
 
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
Codemotion 2013: Succo di lampone: come ottimizzare JAVA e PHP su un’architet...
 
Back to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizioBack to Basics, webinar 6: Messa in esercizio
Back to Basics, webinar 6: Messa in esercizio
 
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
Matteo Baccan - Valerio Tognozzi - Novara LinuxDay 2015
 
Cuma rev001
Cuma rev001Cuma rev001
Cuma rev001
 

Linux Capabilities - ita - v2.1.5 - compatta

  • 1. Linux Capabilites Indice Titolo Pagine Titolo Pagine Indice 1 Estrazione/Decodifica... 4 Diritti 1 File di configurazione 2 LC: cosa sono e... 3 Assegnazione delle cap. 10 Il caso di ping 4 Stato di alcune distribuz. 7 Quale LC per ping? 3 Problemi? 2 Gestione delle LC 4 Ringraziamenti 1 Altri esempi 10
  • 2. DDiirriittttii Presentazione di: Alessandro Selli <alessandroselli@linux.com> Copyright © 2014 Alessandro Selli. Si concede il permesso di effettuare copie, di distribuire e/o di modificare di questo documento secondo quanto stabilito nella licenza GNU Free Documentation License, versione 1.3 o successiva pubblicata dalla Free Software Foundation, stante la presente diapositiva (numero 2) quale Sezione Invariante e nessun testo di prima o di quarta di copertina. Una copia della licenza è disponibile in linea come pure presso l'autore. Versione 2.1.5, 2014/10/27
  • 3. Linux Capabilites: cosa sono e fanno 1-3 ● Inizialmente implementavano POSIX:  1003.1e (API), "Protection, Audit and Control Interfaces"  1003.2c (Shell and Utilities), "Protection and Control Interfaces" ●Detti infatti a volte Linux POSIX Capabilities ●Ultima revisione di 1003.1e e 1003.2c nel 1997 ●Nel 1999 sono stati dichiarati bozze ritirate ● Linux è quindi andato per la sua strada
  • 4. Linux Capabilites: cosa sono e fanno 2-3 Vantaggi: ● Permettono la delega di diritti di superutente a processi non privilegiati, come il bit suid ● Sono registrati sul filesystem, come il bit suid ● Non funzionano sul principio “o tutto o nulla”, diversamente dal bit suid In breve: ● permettono ad un processo di fare alcune cose con i privilegi di root, ma null'altro
  • 5. Linux Capabilites: cosa sono e fanno 3-3 Svantaggi: ● I comandi necessitano di codice LC specifico ● Alcuni FS non supportano LC (NFS v.3, ma squashfs, tmpfs e f2fs adesso si): [root@debian ~]# getcap /mnt/nfs/nfsserver/dumpdates Failed to get capabilities of file `/mnt/nfs/nfsserver/dumpdates' (Operation not supported) [root@debian ~]# ● I privilegi LC non sono ridotti come il SUID root  Ma le recenti libcap-ng rendono facile farlo
  • 6. IIll ccaassoo ddii ppiinngg 11--44 ● Un esempio classico: ping ● Ha bisogno dei diritti di superutente per inviare pacchetti ICMP di tipo echo-request ● Nessuno vorrebbe permettere a chiunque di produrre pacchetti ICMP arbitrari! ● L'approccio tradizionale è il seguente:
  • 7. IIll ccaassoo ddii ppiinngg 22--44 Situazione iniziale: [alessandro@ubuntu ~]$ lsb_release ­drc Description: Ubuntu 14.04.1 LTS Release: 14.04 Codename: trusty [alessandro@ubuntu ~]$ ll /bin/ping ­rwsr­xr­x 1 root root 44178 mag 7 23:51 /bin/ping [alessandro@ubuntu ~]$ ping ­c 3 route­add. net PING route­add. net (195.182.210.166) 56(84) bytes of data. 64 bytes from route­add. net (195.182.210.166): icmp_seq=1 ttl=55 time=46.8 ms 64 bytes from route­add. net (195.182.210.166): icmp_seq=2 ttl=55 time=46.6 ms 64 bytes from route­add. net (195.182.210.166): icmp_seq=3 ttl=55 time=45.5 ms ­­­route­add. net ping statistics ­­­3 packets transmitted, 3 received, 0% packet loss, time 2002ms rtt min/avg/max/mdev = 45.549/46.329/46.829/0.558 ms [alessandro@ubuntu ~]$
  • 8. IIll ccaassoo ddii ppiinngg 33--44 ● Secondo gli standard i diritti del processo sono quelli dell'utente che ha lanciato l'eseguibile Non del proprietario del file eseguibile! ● A meno che il bit suid bit non sia impostato. ­rwsr­xr­x 1 root root 44178 mag 7 23:51 /bin/ping
  • 9. IIll ccaassoo ddii ppiinngg 44--44 “Sabotiamo” ping: [root@ubuntu ~]# chmod u­s /bin/ping [root@ubuntu ~]# ll /bin/ping ­rwxr­xr­x 1 root root 44178 mag 7 23:51 /bin/ping [root@ubuntu ~]# Conseguenza: [alessandro@ubuntu ~]$ ping ­c 3 route­add. net ping: icmp open socket: Operazione non permessa [alessandro@ubuntu ~]$ Se non specificato diversamente, Ubuntu = Fedora.
  • 10. QQuuaallee LLCC ppeerr ppiinngg?? 11--33 ● Vogliamo tanto i privilegi quanto la sicurezza ● Vogliamo poter creare socket ICMP senza assumere tutti I privilegi di root! ● Come ci aiutano le Linux Capabilities? ● RTFM, ovviamente! ➢ man capabilities(7) ➢ Lista & informazioni più aggiornate: linux/include/uapi/linux/capability.h
  • 11. QQuuaallee LLCC ppeerr ppiinngg?? 22--33 Ci sono molte capability tra cui scegliere: AUDIT_CONTROL AUDIT_WRITE BLOCK_SUSPEND CHOWN DAC_OVERRIDE DAC_READ_SEARCHC AP_LEASE FOWNER FSETID IPC_LOCK IPC_OWNER KILL LEASE LINUX_IMMUTABLE MAC_ADMIN MAC_OVERRIDE MKNOD NET_ADMIN NET_BIND_SERVICE Questa è quella che ci serve NET_RAW SETGID SETFCAP SETPCAP SETUID SYS_ADMIN SYS_BOOT SYS_CHROOT SYS_MODULE SYS_NICE SYS_PACCT SYS_PTRACE SYS_RAWIO SYS_RESOURCE SYS_TIME SYS_TTY_CONFIG SYSLOG WAKE_ALARM
  • 12. QQuuaallee LLCC ppeerr ppiinngg?? 22--33 Ci sono molte capability tra cui scegliere: AUDIT_CONTROL AUDIT_WRITE BLOCK_SUSPEND CHOWN DAC_OVERRIDE DAC_READ_SEARCHC AP_LEASE Il CAP_ iniziale è sato omesso nei nomi FOWNER FSETID IPC_LOCK IPC_OWNER KILL LEASE LINUX_IMMUTABLE MAC_ADMIN MAC_OVERRIDE MKNOD NET_ADMIN NET_BIND_SERVICE Questa è quella che ci serve NET_RAW SETGID SETFCAP SETPCAP SETUID SYS_ADMIN SYS_BOOT SYS_CHROOT SYS_MODULE SYS_NICE SYS_PACCT SYS_PTRACE SYS_RAWIO SYS_RESOURCE SYS_TIME SYS_TTY_CONFIG SYSLOG WAKE_ALARM
  • 13. QQuuaallee LLCC ppeerr ppiinngg?? 33--33 Il manuale dice: CAP_NET_RAW * use RAW and PACKET sockets; * bind to any address for transparent proxying. Sembra quella che ci serve. Come la usiamo?
  • 14. GGeessttiioonnee ddeellllee LLCC 11--44 Le capability sono gestite con i comandi: ➢ getcap, mostra le capability dei file ➢ setcap, imposta le capability ai file ➢ getpcaps, mostra le cap. dei processi ➢ capsh, capability shell wrapper Ciascuna capability può essere associata ai set: ➢ p, al processo è permessa la capability ➢ e, la capability è resa effettiva ➢ i, la capab. è ereditata dopo un execve()
  • 15. GGeessttiioonnee ddeellllee LLCC 11--44 Le capability sono gestite con i comandi: ➢ getcap, mostra le capability dei file ➢ setcap, imposta le capability ai file ➢ getpcaps, mostra le cap. dei processi ➢ capsh, capability shell wrapper Ciascuna capability può essere associata ai set: ➢ p, al processo è permessa la capability ➢ e, la capability è resa effettiva ➢ i, la capab. è ereditata dopo un execve() Questa è diventata un bit
  • 16. GGeessttiioonnee ddeellllee LLCC 22--44 Iniziamo ad usarle: [root@ubuntu ~]# chmod u­s /bin/ping [root@ubuntu ~]# ll /bin/ping ­rwxr­xr­x 1 root root 44168 mag 7 23:51 /bin/ping* [root@ubuntu ~]# getcap /bin/ping [root@ubuntu ~]# setcap CAP_NET_RAW=ep /bin/ping Maiuscole o minuscole Sempre minuscole!
  • 17. GGeessttiioonnee ddeellllee LLCC 22--44 Iniziamo ad usarle: [root@ubuntu ~]# chmod u­s /bin/ping [root@ubuntu ~]# ll /bin/ping ­rwxr­xr­x 1 root root 44168 mag 7 23:51 /bin/ping* [root@ubuntu ~]# getcap /bin/ping [root@ubuntu ~]# setcap CAP_NET_RAW=ep /bin/ping [root@ubuntu ~]# getcap /bin/ping /bin/ping = cap_net_raw+ep [root@ubuntu ~]# Questa notatione va bene anche per setcap
  • 18. GGeessttiioonnee ddeellllee LLCC 33--44 Funziona? [alessandro@ubuntu ~]$ ping ­c 3 route­add. net PING route­add. net (195.182.210.166) 56(84) bytes of data. 64 bytes from route­add. net (195.182.210.166): icmp_seq=1 ttl=55 time=30.7 ms 64 bytes from route­add. net (195.182.210.166): icmp_seq=2 ttl=55 time=30.9 ms 64 bytes from route­add. net (195.182.210.166): icmp_seq=3 ttl=55 time=31.3 ms ­­­route­add. net ping statistics ­­­3 packets transmitted, 3 received, 0% packet loss, time 2000ms rtt min/avg/max/mdev = 30.709/30.988/31.350/0.304 ms [alessandro@ubuntu ~]$
  • 19. GGeessttiioonnee ddeellllee LLCC 44--44 Da notare: le capability di ping in Fedora 20: [root@fedora ~]# getcap /bin/ping /bin/ping = cap_net_admin,cap_net_raw+ep [root@fedora ~]# CAP_NET_ADMIN contrassegna i pacchetti: [alessandro@fedora ~]$ ping ­c1 ­m 123 route­add. net PING route­add. net (195.182.210.166) 56(84) bytes of data. Warning: Failed to set mark 123 64 bytes from route­add. net (195.182.210.166): icmp_seq=1 ttl=53 time=45.8 ms ­­­route­add. net ping statistics ­­­1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 45.802/45.802/45.802/0.000 ms [alessandro@fedora ~]$
  • 20. AAllttrrii eesseemmppii 11--1111 Tutti conoscono gli Attributi Estesi POSIX, vero? VVeerroo?? Se no, dovreste. ● Le LC sono utili, persino necessarie per usare gli AEP.
  • 21. AAllttrrii eesseemmppii 22--1111 AEP permettono di, ad es., impostare file: ­a: cui si possono solo aggiungere dati ­i: immutabili (né sovrascrivibili né cancell.) ­S: eseguono scritture sincrone ­D: directory che eseguono scritture sincrone ... (ce ne possono essere fino a 19) Capire quale filesystem supporta quali AEP e quali no è una vincita al lotto...
  • 22. AAllttrrii eesseemmppii 33--1111 C'è però un inghippo: ● chattr non funziona per gli utenti ordinari: [alessandro@fedora ~]$ chattr +i .bashrc chattr: Operazione non permessa impostando i flag di .bashrc [alessandro@fedora ~]$
  • 23. AAllttrrii eesseemmppii 44--1111 La soluzione classica UNIX è di farlo SUID root: [root@fedora ~]# ll /usr/bin/chattr ­rwxr­xr­x 1 root root 10528 giu 24 13:10 /usr/bin/chattr [root@fedora ~]# chmod u+s /usr/bin/chattr [root@fedora ~]# ll /usr/bin/chattr ­rwsr­xr­x 1 root root 10528 giu 24 13:10 /usr/bin/chattr [root@fedora ~]# Funzionerebbe: [alessandro@fedora ~]$ chattr +i .bashrc [alessandro@fedora ~]$ lsattr .bashrc ­­­­i­­­­­­­­e­­. bashrc [alessandro@fedora ~]$
  • 24. AAllttrrii eesseemmppii 55--1111 Però... [alessandro@fedora ~]$ lsattr ~games/.profile ­­­­­­­­­­­­­e­­/ opt/games/.profile [alessandro@fedora ~]$ chattr +i ~games/.profile [alessandro@fedora ~]$ lsattr ~games/.profile ­­­­i­­­­­­­­e­­/ usr/games/.profile [alessandro@fedora ~]$ Il che è normale per i privilegi di superutente. Decisamente non vogliamo che questo accada.
  • 25. AAllttrrii eesseemmppii 66--1111 Questa è la cosa giusta da fare: [root@fedora ~]# chmod u­s /bin/chattr [root@fedora ~]# ll /bin/chattr ­rwxr­xr­x 1 root root 10736 Aug 3 11:36 /bin/chattr [root@fedora ~]# setcap CAP_LINUX_IMMUTABLE=ep /bin/chattr [root@fedora ~]# getcap /bin/chattr /bin/chattr = cap_linux_immutable+ep [root@fedora ~]#
  • 26. AAllttrrii eesseemmppii 77--1111 Che fa succedere le cose giuste: [alessandro@fedora ~]$ lsattr .bashrc ­­­­­­­­­­­­­e­­. bashrc [alessandro@fedora ~]$ chattr +i .bashrc [alessandro@fedora ~]$ lsattr .bashrc ­­­­i­­­­­­­­e­­. bashrc [alessandro@fedora ~]$ chattr +i ~games/.profile chattr: Operazione non permessa impostando i flag di /usr/games/.profile [alessandro@fedora ~]$
  • 27. "Mi spiace Dave, purtroppo non posso farlo".
  • 28. AAllttrrii eesseemmppii 88--1111 ●DAC = Discretionary Access Control ● È il meccanismo classico Unix per decidere chi può fare cosa ● Nel filesystem appare in forma dei diritti rwx ● Le LC possono incasinare anche loro! :-)
  • 29. AAllttrrii eesseemmppii 99--1111 Suoniamo il cicalino! (In un xterm) [alessandro@fedora ~]$ beep ­f 2000 ­l 100 Could not open /dev/tty0 or /dev/vc/0 for writing open: No such file or directory [alessandro@fedora ~]$ Il manuale dice: Di default beep non è installato con il bit suid impostato, farlo farebbe ridere. D'altra parte, renderlo suid root farebbe svanire magicamente tutti i problemi con le chiamate ioctl, il che fa piacere, e la sola regione di non volerlo fare è che ogni programma suid è una potenziale falla di sicurezza. Per fortuna beep è molto piccolo, ispezionarne il codice è piuttosto facile.
  • 30. AAllttrrii eesseemmppii 1100--1111 Usiamo le LC invece. L'errore era: Could not open /dev/tty0 or /dev/vc/0 for writing Ossia, è un problema di DAC. [root@fedora ~]# setcap CAP_DAC_OVERRIDE=pe /bin/beep [root@fedora ~]# [alessandro@fedora ~]$ beep ­f 2000 ­l 100 ioctl: Operation not permitted ioctl: Operation not permitted [alessandro@fedora ~]$ CAP_SYS_TTY_CONFIG Use vhangup(2); employ various privileged ioctl(2) operations on virtual terminals. Dal manuale:
  • 31. AAllttrrii eesseemmppii 1111--1111 Tutte e due le capability insieme: [root@fedora ~]# setcap > CAP_DAC_OVERRIDE,CAP_SYS_TTY_CONFIG=pe /bin/beep [root@fedora ~]# [alessandro@fedora ~]$ beep ­f 2000 ­l 100 [alessandro@fedora ~]$
  • 32. "Va bene Dave, credo di aver capito come fare questo"
  • 33. Estrazione/Decodifica informazioni 1-4 Quali LC sono attive adesso? [root@ubuntu ~]# cp /bin/bash /tmp/ [root@ubuntu ~]# setcap CAP_KILL,CAP_DAC_OVERRIDE+epi /tmp/bash [root@ubuntu ~]# getcap /tmp/bash /tmp/bash = cap_dac_override,cap_kill+eip [root@ubuntu ~]# Ereditarietà impostata [alessandro@ubuntu ~]$ /tmp/bash ­l [alessandro@ubuntu ~]$ getpcaps $$ Capabilities for `15400': = cap_dac_override,cap_kill+ep [alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status CapInh: 0000000000000000 CapPrm: 0000000000000022 CapEff: 0000000000000022 CapBnd: 0000001fffffffff [alessandro@ubuntu ~]$ Ereditarietà assente!
  • 34. Estrazione/Decodifica informazioni 2-4 Decodifica della mappa di bit esadecimale LC: [alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status CapInh: 0000000000000000 CapPrm: 0000000000000022 Rappresentata ancora CapEff: 0000000000000022 come un set CapBnd: 0000001fffffffff [alessandro@ubuntu ~]$ capsh ­­decode= 0000000000000000 0x0000000000000000= [alessandro@ubuntu ~]$ capsh ­­decode= 0000000000000022 0x0000000000000022=cap_dac_override,cap_kill [alessandro@ubuntu ~]$
  • 35. Estrazione/Decodifica informazioni 3-4 0000001fffffffff = Capability Bounding Set 1 = cap permessa (mantenuta se presente) 0 = cap mascherata (o nessuna LC associata al bit) I bit sono mappati uno-ad-uno alle LC 0000001fffffffff è una maschera a 64-bit ● È un campo a 64 bit dalla libcap versione 2.03 ● Prima era a 32 bit
  • 36. Estrazione/Decodifica informazioni 4-4 Il numero delle capability mappate è consistente con il valore del conteggio da zero manteuto in /proc/sys/kernel/cap_last_cap Kernel 3.14.19:1fffffffff → 1+9*4=37 /proc/sys/kernel/cap_last_cap = 36 Kernel 3.16.3: 3fffffffff → 2+9*4=38 /proc/sys/kernel/cap_last_cap = 37
  • 37. FFiillee ddii ccoonnffiigguurraazziioonnee 11--22 capability.conf1: utenti che ereditano le LC [root@ubuntu ~]# cat /etc/security/capability.conf cap_kill alessandro none * [root@ubuntu ~]# Se assente tutti gli utenti avranno ereditabili tutte le capability! Le modifiche hanno effetto dopo un nuovo login: Ubuntu 14.04.1 LTS ubuntu tty1 CAP_KILL adesso è ereditabile ubuntu login: alessandro Password: [alessandro@ubuntu ~]$ getpcaps $$ Capabilities for `8586': = cap_kill+i [alessandro@ubuntu ~]$
  • 38. FFiillee ddii ccoonnffiigguurraazziioonnee 22--22 Il processo figlio della nuova shell eredita le LC: [alessandro@ubuntu ~]$ getpcaps $$ Capabilities for `16332': = cap_kill+i [alessandro@ubuntu ~]$ getcap /tmp/bash /tmp/bash = cap_dac_override,cap_kill+eip [alessandro@ubuntu ~]$ /tmp/bash ­l [alessandro@ubuntu ~]$ getpcaps $$ Capabilities for `16849': = cap_kill+eip cap_dac_override+ep [alessandro@ubuntu ~]$ Cap presente nel file di configurazione Cap assente nel file di configurazione 1) Serve il pacchetto Ubuntu libpam-cap. Fedora ha quello libcap, ma queste operazioni falliscono (PAM failure: System error)
  • 39. Assegnazione ddeellllee ccaappaabbiilliittyy 11--1100 2.2.11 2.6.25 opzionale Bounding-set di sistema Bounding-set per thread 2.6.33 integrato ● Prima del 2.6.25 Bounding Set era di sistema ● Dal 2.6.25 è per thread ● Dismesso da processo dotato di CAP_SETPCAP con operazione prctl(2) PR_CAPBSET_DROP ● Ereditato in fork(2), mantenuto dopo execve(2) ● Opzionale dal 2.6.33, da allora integrato
  • 40. Assegnazione ddeellllee ccaappaabbiilliittyy 22--1100 N Nuovo P Precedente F Cap. impostata nel File e capability Effettiva p Capability Permessa i Capability ereditata CBS Capability Bounding Set1 Le nuove capability erano calcolate così: Np (Pi∪Fi)∩(Fp∪CBS) Ne Fe∪Np Ni Pi 1) Maschera delle capability permesse mantenute dopo execve(2). Nessun effetto su quelle ereditate. Dal kernel 2.6.25 limita quelle ereditate che possono essere aggiunte a se stessi anche se permesse.
  • 41. Assegnazione ddeellllee ccaappaabbiilliittyy 33--1100 N Nuovo P Precedente F Cap. impostata nel File e capability Effettiva p Capability Permessa i Capability ereditata CBS Capability Bounding Set1 Adesso sono calcolate così: Np (Pi∪Fi)∩(Fp∪CBS) Ne Fe ? Np : 02 Ni Pi 2) Non è più un AND perché il set Effettivo è un bit, non più un set (un bit per capability).
  • 42. Assegnazione ddeellllee ccaappaabbiilliittyy 44--1100 Cosa fa il Capability Bounding Set? 1) In un execve(2) toglie al thread le capability permesse con un AND cap file. 2) Limita le cap ereditabili del thread che possono essere aggiunte con un capset(2) (kernel >= 2.6.25). Però: a) la capability può essere ancora permessa; b)la cap può essere ancora impostata se è nel set ereditabile del file.
  • 43. Assegnazione ddeellllee ccaappaabbiilliittyy 55--1100 Potenziale rischio: cap accidentalmente permesse. Si consideri la situazione: 1) processo genitore: CAP_X ered., non in CBS 2)CAP_X non sarà nel set permesso a) ma rimane nel set ereditato dei figli 3) Il processo può eseguire figlio con CAP_X nei set sia permesso che ereditato! Togliere cap da CBS può dare un falso senso di sicurezza! Da solo non basta!
  • 44. Assegnazione ddeellllee ccaappaabbiilliittyy 66--1100 Come per SUID, le LC degli script sono ignorati: [alessandro@ubuntu ~]$ cat ~/bin/test_cap.sh #!/bin/dash getpcaps $$ grep ^Cap /proc/$$/status [alessandro@ubuntu ~]$ getcap ~/bin/test_cap.sh /home/alessandro/bin/test_cap.sh = cap_linux_immutable+ep [alessandro@ubuntu ~]$ test_cap.sh Capabilities for `9093': = Ignorata CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 Ignorata CapBnd: 0000001fffffffff [alessandro@ubuntu ~]$
  • 45. Assegnazione ddeellllee ccaappaabbiilliittyy 77--1100 Solo le LC degli eseguibili binari fanno testo: [alessandro@ubuntu ~]$ cat ~/bin/test2_cap.sh #!/tmp/dash getpcaps $$ grep ^Cap /proc/$$/status [alessandro@ubuntu ~]$ getcap ~/bin/test2_cap.sh /tmp/dash /tmp/dash = cap_linux_immutable+ep [alessandro@ubuntu ~]$ test2_cap.sh Capabilities for `9218': = cap_linux_immutable+ep CapInh: 0000000000000000 CapPrm: 0000000000000200 CapEff: 0000000000000200 Presente Presente CapBnd: 0000001fffffffff [alessandro@ubuntu ~]$
  • 46. Assegnazione ddeellllee ccaappaabbiilliittyy 88--1100 capsh può ridurre le CBS della shell: [alessandro@ubuntu ~]$ getcap $(which capsh) /sbin/capsh = cap_setpcap+p [alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000001fffffffff [alessandro@ubuntu ~]$ capsh ­­drop= cap_net_raw ­­[ alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status CapInh: 0000000000000000 CapPrm: 0000000000000000 CapEff: 0000000000000000 CapBnd: 0000001fffffdfff [alessandro@ubuntu ~]$
  • 47. Assegnazione ddeellllee ccaappaabbiilliittyy 99--1100 Riduzione CBS con capsh. Situazione iniziale: [alessandro@ubuntu ~]$ getcap $(which capsh ping) /sbin/capsh = cap_setpcap+p /bin/ping = cap_net_raw+p [alessandro@ubuntu ~]$ getpcaps $$ Capabilities for `7842': = [alessandro@ubuntu ~]$ ping ­qc1 route­add. net PING route­add. net (195.182.210.166) 56(84) bytes of data. ­­­route­add. net ping statistics ­­­1 packets transmitted, 1 received, 0% packet loss, time 0ms rtt min/avg/max/mdev = 27.718/27.718/27.718/0.000 ms [alessandro@ubuntu ~]$
  • 48. Assegnazione ddeellllee ccaappaabbiilliittyy 1100--1100 Esecuzione shell con CBS ridotte via capsh: [alessandro@ubuntu ~]$ capsh ­­drop= cap_net_raw ­­[ alessandro@ubuntu ~]$ grep ^Cap /proc/$$/status CapInh: 0000000000000000 CapPrm: 0000000000000000 ! CapEff: 0000000000000000 CapBnd: 0000001fffffdfff [alessandro@ubuntu ~]$ capsh ­­decode= 2000 0x0000000000002000=cap_net_raw [alessandro@ubuntu ~]$ ping ­qc1 route­add. net ping: icmp open socket: Operation not permitted [alessandro@ubuntu ~]$
  • 49. SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 11--77 Lo scopo è di sostituire ovunque possibile agli eseguibili i bit SUID/SGID con le capability: ● Fedora: ultimo aggiornamento: 2011-04-05, completato: 100% (molti, non tutti, i SUID tolti) ● Ubuntu: lavori in corso (ultimo aggiornamento: 2011-09-27) Non è ancora possibile sostituire tutti i SUID con le Linux Capabilities
  • 50. SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 22--77 Fedora 20 (Heisenbug): un paio di dozzine di file suid (in un'installazione LXDE non-standard) # find / ­xdev ­type f ­perm /111 ­perm /4000 ­user root | wc ­l 23 # /usr/sbin/mount.nfs /usr/bin/mount /usr/bin/chsh /usr/bin/write /usr/bin/fusermount /usr/bin/umount /usr/bin/chage /usr/bin/passwd /usr/bin/newgrp /usr/bin/locate /usr/bin/su /usr/bin/sudo /usr/bin/gpasswd /usr/bin/cgexec /usr/bin/chfn /usr/bin/Xorg /usr/bin/ssh­agent /usr/bin/crontab /usr/bin/at /usr/bin/ksu /usr/sbin/postqueue /usr/sbin/postdrop /usr/sbin/ssmtp /usr/bin/pkexec
  • 51. SSttaattoo ddii aallccuunnee ddiissttrriibbuuzziioonnii 33--77 Ubuntu 14.04.1 (Trusty Tahr): alcune di più (ancora in un'installazione XFCE non-standard) # find / /usr ­xdev ­type f ­perm /111 ­perm /4000 ­user root | wc ­l 29 # Erano 34 in 13.10 (Saucy Salamander)
  • 52. Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 44--77 Vediamo un caso in cui le LC non funzionano: [alessandro@fedora ~]$ ll /usr/bin/at ­rwsr­xr­x 1 root root 53208 5 dic 12.34 /usr/bin/at [alessandro@fedora ~]$ getcap /usr/bin/at [alessandro@fedora ~]$ Togliamo il bit SUID e qualsiasi capability: [root@fedora ~]# chmod u­s /usr/bin/at [root@fedora ~]# setcap ­r /usr/bin/at [root@fedora ~]# [alessandro@fedora ~]$ at ­f ~/bin/at.sh now+5min cannot set egid: Operation not permitted [alessandro@fedora ~]$
  • 53. Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 55--77 Cerchiamo di farlo felice: [root@fedora ~]# setcap CAP_SETGID+ep /usr/bin/at [root@fedora ~]# Nessuna fortuna: [alessandro@fedora ~]$ at ­f ~/bin/at.sh now+5min cannot set euid: Operation not permitted [alessandro@fedora ~]$ [root@fedora ~]# setcap CAP_SETUID,CAP_SETGID+ep /usr/bin/at [root@fedora ~]# [alessandro@fedora ~]$ at ­f ~/bin/at.sh now+5min PAM failure: System error [alessandro@fedora ~]$ :­(
  • 54. Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 66--77 Nel file di log compare: [alessandro@fedora ~]$ tail ­1 /var/log/secure Feb 23 10:08:43 fedora at: PAM audit_log_acct_message() failed: Operation not permitted [alessandro@fedora ~]$ Nulla da fare, per ora.
  • 55. Stato ddii aallccuunnee ddiissttrriibbuuzziioonnii 77--77 Ubuntu ha seguito una strada diversa: ● usa la stessa implementazione di at/atd (di Thomas Koenig, ig25@rz.uni-karlsruhe.de) ● il demone gira come utente daemon ● l'eseguibile del client è SUID e SGUI daemon:daemon, il che gli permette di:  scrivere in /var/spool/cron/atjobs/.SEQ  mandare segnali ad atd Vecchia scuola, semplice, efficace, sicuro.
  • 56. PPrroobblleemmii?? 11--22 «Perché così poche persone conoscono e usano le capability? Credo che la documentazione scarsa sia la ragione principale. Per esempio, la Fedora 10 non ha le pagine man di getpcaps, capsh e pam_cap, e la Guida alla Sicurezza di Fedora neppure nomina le capability» (Finnbarr P. Murphy, 28 maggio 2009 ) Tutto vero ancora oggi!
  • 57. PPrroobblleemmii?? 22--22 ●Documentazione online distrib. ferma da anni ● La Guida alla Sicurezza di Fedora nelle stesse condizioni alla vers. 19.1, e manca nella 20 ➢Ma almeno le pagine man ci sono ➢ Nel suo futuro solo SELinux? ● Il comportamento delle LC è cambiato ➢ Gli stessi comandi, capability e set hanno effetti diversi rispetto a 2.6.24 senza errori ● libcap-ng rende la programmazione più facile
  • 58. RRiinnggrraazziiaammeennttii 11--11 ● Quelli del progetto Linux man-pages ( https://www.kernel.org/doc/man-pages/) ● Finnbarr P. Murphy (post di blog e riferimenti, utile anche se superato) ● E gli sviluppatori del kernel, naturalmente!  Andrew G. Morgan <morgan@kernel.org>  Alexander Kjeldaas <astor@guardian.no> con contributi di Aleph1, Roland Buresund e Andrew Main.