TL;DR:の機能が(または) でのみ機能しcap_net_raw、他の場所では機能しないのはなぜですか? これはどこかで設定できますか?cap_net_admin/usr/bin/usr/sbin
Ubuntu 14.04 で libpcap を使用して C プログラムに機能を割り当てる際に問題があります。を使用して機能を割り当ててsetcap(8)チェックした後getcap(8)でも、権限エラーが発生します。\usr\bin機能は、および友人の実行可能ファイルに対してのみ機能するようです。
私のプログラムtest.cは次のようになります。
#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;
}
でコンパイルされます
gcc test.c -lpcap
実行可能ファイルを生成a.outしています。機能を設定しました:
sudo setcap cap_net_raw,cap_net_admin=eip ./a.out
そして、それが正しく見えることを確認してください:
getcap a.out
それは私に与えます
a.out = cap_net_admin,cap_net_raw+eip
実行a.outすると、次のようになります。
./a.out eth0
eth0: You don't have permission to capture on that device (socket: Operation not permitted)
で実行するとsudo、期待どおりに動作します (プログラムは何も出力せずに終了します)。
ここに興味深い部分があります。移動a.outすると/usr/bin(そして機能を再適用すると)、機能します。その逆:/usr/bin/dumpcapから(グループwireshark内のユーザーに対しては正常に機能する) 機能を有効にして、それを私のホーム ディレクトリに移動し、同じ機能を再適用すると、機能しません。それを元に戻すと、機能します。wireshark/usr/bin
SO: これらの機能が/usr/bin(および/usr/sbin) でのみ機能し、他の場所では機能しないのはなぜですか? これはどこかで設定できますか?