12

組み込みシステム(2.4カーネル)では、rootとして実行されていないプロセスからeth0インターフェースへのrawソケットアクセスが必要です。

コマンドラインからCAP_NET_RAW機能を設定し、プログラムでcap_set_proc()を使用してこの問題に対処しようとしましたが、どちらも成功しませんでした。私にはそうする権限がないようです。プログラムで、コマンドラインでEPERMエラーが発生します。

プロセス`1586'にキャップを設定できませんでした:(操作は許可されていません)

私がやりたいことをする簡単な方法はありますか?そうでない場合、CAP_NET_RAW機能を正常に設定するにはどのような手順が必要ですか?

編集:私はrootアクセス権を持っていますが、rootとしてプロセスを永続的に実行することはできません。libcapのバージョンは1.10で、「setcap」バイナリはありませんが、「setpcaps」があります。

編集-GeorgeSkoptsovに答える:

正しければ、setuidを使用してプロセスを開始し、CAP_NET_RAW機能を設定してから、特権を削除することをお勧めします。次のコードでこれを試しましたが、capsコマンドがエラーを返さないのに、機能しないようです。seteuid()がコメントアウトされると、rawアクセスが機能しますが、プロセスがrootとして実行されているため、次のようになります。

cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
    printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
    printf("cap_set_proc error");
}

if (seteuid(getuid()) != 0) 
{
    printf("seteuid error");
}

function_that_needs_raw_access();

ご協力いただきありがとうございます。クリス

4

4 に答える 4

9

通常、インターフェイスで raw パケットを受信するには、root 権限が必要です。raw パケットを受信するプロセスは、そのインターフェイスを使用する他のすべてのプロセスとユーザーの通信にアクセスできるため、この制限はセキュリティ対策です。

ただし、マシンの root にアクセスできる場合は、setuidフラグを使用して、プロセスが root 以外のユーザーとして実行されている場合でも、プロセスに root 権限を与えることができます。

まず、プロセスが root として実行されたときに、この機能が正常に設定されていることを確認します。次に使用します

sudo chown root process
sudo chmod ugo+s process 

root をプロセスの所有者として設定し、setuidフラグを設定します。次に、プロセスが他のユーザーによって実行されたときに機能が設定されていることを確認します。このプロセスにはすべてのスーパーユーザー権限が付与されるため、セキュリティ上の予防措置を順守し、コードで権限が不要になったらすぐに権限を削除する必要があります (CAP_NET_RAW を有効にした後)。

この方法に従って、適切にドロップしていることを確認できます。

于 2012-03-19T14:37:32.303 に答える
5

実行可能プログラムに、CAP_NET_RAW他の root 特権を与えずに特権を使用できるようにすることができます。

$ setcap cap_net_raw=pe *program*

この特権がなければ、この特権を与えることはできません。もちろん、root はこの特権をプログラムに与えることができます。

于 2016-11-05T16:58:09.227 に答える
3

プロセスはルートとして実行するか、実行可能ファイルに CAP_NET_RAW 機能を持たせる必要があります。

CAP_NET_RAW を設定するには、root として setcap コマンドを実行する必要があります。設定すると、実行可能ファイルを別のユーザーとして実行でき、生のパケット キャプチャにアクセスできるようになります。

いずれにせよ root アクセス権がなく、root アクセス権を持つ人が実行可能ファイルで CAP_NET_RAW または setuid root を設定できない場合、root 以外のユーザーとしてパケット キャプチャを実行することはできません。

于 2012-03-19T15:52:23.307 に答える
0

TL;DR IMHO はカーネル < 3.0 ではサポートされていません。

カーネルの netdev メーリング リスト ( https://lwn.net/Articles/420800/およびhttps://lwn.net/Articles/420801/ ) でサポートについての議論がありました 。

そして 、カーネル 3.0 でリリースされたコミットc319b4d76b9e583a5d88d6bf190e079c4e43213dに含めました。

commit c319b4d76b9e583a5d88d6bf190e079c4e43213d
Author: Vasiliy Kulikov <segoon@openwall.com>
Date:   Fri May 13 10:01:00 2011 +0000

    net: ipv4: add IPPROTO_ICMP socket kind

Follows: v2.6.39-rc2
Precedes: v3.0-rc1

リビジョン 87dbb3a5db657d5eae6934707beaf0507980a1c3 では、 CAP_NET_RAW なしで (つまり、機能を設定せずに、または set-uid なしで) ping を実行することが実装され、iputils s20150815でリリースされました。

commit 87dbb3a5db657d5eae6934707beaf0507980a1c3
Author: Nikos Mavrogiannopoulos <nmav@redhat.com>
Date:   Fri May 29 11:01:00 2015 +0200

    This patch allows running ping and ping6 without root privileges on
    kernels that support it. Almost identical to Lorenzo
    Colitti's original patch except:
    ...

Follows: s20140519
Precedes: s20150815
于 2017-09-14T12:30:34.307 に答える