2017-09-05 3 views
2

j'ai enlevé le bit setuid du ping binaire et ajouté cap_net_raw+p à la place comme suit:

$ chmod 755 /bin/ping 
$ setcap cap_net_raw+p /bin/ping 

Puis je courais ping dans un terminal et vérifié le/proc/$ PID/état du processus en cours d'exécution d'un autre:

$ ps aux | grep ping                 
    user  5468 0.0 0.0 14948 1792 pts/20 S+ 11:14 0:00 ping www.google.com 
    user  5471 0.0 0.0 14224 896 pts/2 S+ 11:14 0:00 grep --color=auto ping 
$ cat /proc/5468/status | grep Cap 
    CapInh: 0000000000000000 
    CapPrm: 0000000000002000 
    CapEff: 0000000000000000 
    CapBnd: 0000003fffffffff 
    CapAmb: 0000000000000000 

Si ping est en cours d'exécution est pourquoi CapEff: 0000000000000000? Ne devrait pas cap_net_raw être aussi dans l'ensemble efficace? Est-ce que/proc/$ PID/status ne reflète pas le état actuel du thread?

+1

Bonne question, bonne réponse. Bien joué! – hek2mgl

Répondre

2

Une personne utile à #kernelnewbies sur OFTC (irc) a eu la gentillesse de me fournir la réponse.

ping ensembles cap_net_raw dans l'ensemble efficace, crée la prise, puis gouttes cap_net_raw, comme on peut le voir avec strace:

$ strace -e socket,capset ping -c1 localhost 
    capset({_LINUX_CAPABILITY_VERSION_3, 0}, {CAP_NET_RAW, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0 
    socket(PF_INET, SOCK_RAW, IPPROTO_ICMP) = 3 
    capset({_LINUX_CAPABILITY_VERSION_3, 0}, {0, CAP_NET_ADMIN|CAP_NET_RAW, 0}) = 0 

Une fois la prise est ouverte, les privilèges ne plus sont nécessaires pour écrire.