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
) でのみ機能し、他の場所では機能しないのはなぜですか? これはどこかで設定できますか?