13

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

4

1 に答える 1

14

これは、ホーム ディレクトリが でマウントされていることが原因である可能性があり、これがnosuid機能の動作を妨げているようです。Ubuntu はホーム ディレクトリを暗号化し、ecryptfs を nosuid としてマウントします。

機能を備えたバイナリは/usr/、 、およびで機能します/home/が、ホーム ディレクトリでは機能しません。

機能を無効にするために私が見つけた唯一の参照nosuidは、このリンクです: http://www.gossamer-threads.com/lists/linux/kernel/1860853#1860853。信頼できるソースを見つけたいと思います。

于 2015-06-14T05:10:48.140 に答える