2015-03-17 24 views
8

TL arbeiten; DR: Warum sind cap_net_raw, cap_net_admin Fähigkeiten nur in /usr/bin (oder /usr/sbin) arbeiten, aber nicht andere Plätze? Kann dies irgendwo konfiguriert werden?Raw-Capture-Fähigkeiten (CAP_NET_RAW, CAP_NET_ADMIN) nicht außerhalb/usr/bin und Freunde für die Paketerfassung Programm mit libpcap

Ich habe Probleme beim Zuweisen von Fähigkeiten zu meinem C-Programm mit libpcap in Ubuntu 14.04. Auch nach dem Zuweisen von Funktionen unter Verwendung von setcap(8) und Überprüfen über getcap(8) erhalte ich immer noch einen Berechtigungsfehler. Es scheint, Fähigkeiten funktionieren nur für ausführbare Dateien in \usr\bin und Freunde.

Mein Programm test.c sieht wie folgt aus:

#include <stdio.h> 
#include <pcap.h> 

int main(int argc, char **argv) { 
    if (argc != 2) { 
     printf("Specify interface \n"); 
     return -1; 
    } 
    char errbuf[PCAP_ERRBUF_SIZE]; 
    struct pcap* pcap = pcap_open_live(argv[1], BUFSIZ, 1, 0, errbuf); 
    if (pcap == NULL) { 
     printf("%s\n", errbuf); 
     return -1; 
    } 
    return 0; 
} 

und ist mit

gcc test.c -lpcap 
zusammengestellt

a.out ausführbar zu erzeugen. Ich habe Fähigkeiten:

sudo setcap cap_net_raw,cap_net_admin=eip ./a.out 

Und überprüfen, um zu sehen, dass es gut aussieht:

getcap a.out 

die mich a.out gibt

a.out = cap_net_admin,cap_net_raw+eip 

Laufen gibt mir:

./a.out eth0 
eth0: You don't have permission to capture on that device (socket: Operation not permitted) 

Lauf mit sudo funktioniert wie erwartet (Programm druckt nichts und beendet).

Hier ist der interessante Teil: Wenn ich a.out zu /usr/bin verschiebe (und die Funktionen erneut anwenden), funktioniert es. Umgekehrt: nimmt die Fähigkeit fähige /usr/bin/dumpcap von wireshark (die für die Benutzer in der Gruppe wireshark funktioniert gut) und es aus von /usr/bin, sagen zu mir nach Hause dir zu bewegen, die gleichen Fähigkeiten erneute Anwendung, es nicht Arbeit. Bewegt man es zurück, funktioniert es.

SO: Warum funktionieren diese Funktionen nur in /usr/bin (und /usr/sbin), aber nicht an anderen Orten? Kann dies irgendwo konfiguriert werden?

+0

Das Testprog (mit den Fähigkeiten wie oben) funktioniert AOK auf meinem ziemlich out of the box Fedora-21. Im Dunkeln geschossen: Sicherheitsberechtigungen verwandt?(Ich weiß nichts speziell im Zusammenhang mit Ubuntu aber ich sammle, es ist etwas namens AppArmor auf Ubuntu, der SELinux auf Fedora ähnlich sein könnte). – willyo

+0

Du hast wahrscheinlich recht, @willyo ... Ich habe versucht AppArmor und Entladen Profile zu deaktivieren (ohne Erfolg), aber nicht viel weiter – dirkhas

Antwort

8

Dies könnte daran liegen, dass Ihr Home-Verzeichnis mit nosuid gemountet ist. Dies scheint zu verhindern, dass die Funktionen funktionieren. Ubuntu verschlüsselt das Home-Verzeichnis und mountet das mit ecryptfs als nosuid.

Binärdateien mit Fähigkeiten funktionieren für mich in /usr/ und /home/, aber nicht mein Home-Verzeichnis.

Die einzige Referenz, die ich zu nosuid Fähigkeiten finden konnte, ist dieser Link: http://www.gossamer-threads.com/lists/linux/kernel/1860853#1860853. Ich würde gerne eine autoritative Quelle finden.

+1

gehen sollte viel mehr upvotes bekommen, da ich auch über dieses Problem gestolpert, Kratzen mein Kopf für eine lange Zeit. Ich habe nicht diese Antwort finden, da die Fähigkeit, ich suchte war 'CAP_NET_BIND_SERVICE', die in der Hoffnung, mehr Menschen zu finden, das auch hier erwähnt werden sollen. – TabascoEye

+1

Sie können 'getpcaps $ verwenden (pidof ./a.out)' die Fähigkeiten des laufenden Prozesses zur Liste. Probiere 'sudo mount -o remount, suid/home' und überprüfe, ob es dann funktioniert. – user1225999