2017-08-02 2 views
1

を設定しているとき、私はpthread_setname_np()機能が

g++ -pthread example.cpp 

で男pthread_setname_npからサンプルプログラムをコンパイルし、私は私のプログラムはa.outのcap_net_raw機能を設定します。

sudo setcap 'cap_net_raw=+eip' a.out 

実行するときに驚くべきことに、プログラムが失敗します。私が追加したときに、私は以下の権限を持っているよう

$./a.out 
Created a thread. Default name is: a.out 
pthread_setname_np: Permission denied 

を、私はそれが動作する機能を削除すると...

$sudo setcap 'cap_net_raw=-eip' a.out 
$./a.out 
Created a thread. Default name is: a.out 
The thread name after setting it is THREADFOO. 
Done 

だから私のために見えます能力。誰でもこれを説明できますか?あなたの応答のための

Thankyます;-)

いくつかの追加情報:

  • 機能が私の目標でサポートされている私は、pingコマンドでそれをチェックしCAP_NET_RAW
  • カーネル4.4.32-rt43
  • RFS:ext4
  • 私はこのプログラムに投稿を減らしました。このプログラムにCAP_NET_RAWを追加することは意味がありません。
  • CAP_DAC_OVERRIDEを追加するとうまくいくが、それは避けたい。

答えて

1

ファイルシステム機能を設定することは、多くの点でプログラムSUID/SGIDの作成と同じです。このAT_SECURE == 1実行モードでは、カーネルは元のユーザーがプロセスで実行できる操作を制限します。 ptraceを使用してプロセスへのアクセスや/proc経由のプロセスへのアクセスなどの潜在的な侵入行為は、ユーザーがプログラムを使用して特権をエスカレートすることができないようにカーネルによってブロックされます。 (glibcや他のライブラリはセキュリティ上の理由でいくつかの機能を無効にします)通常、これらの制限はユーザIDがの異なるユーザIDが所有するプロセスにのみ適用されますが、機能(SELinuxコンテキスト)信頼境界の交差を検出する。

glibcでは、現在のスレッドとは異なるスレッドの​​が/proc/self/task/TID/commファイルへの書き込みによって実装されるため、これらの制限が適用されます。カーネルは、同じアドレス空間を共有するタスクのこの種の自己変更の例外を実装することも考えられますが、実装されていないと思われます。そして、私はカーネルの人たちを本当に非難することはできません。なぜなら、このような問題を解決するのは難しく、脆弱性を導入しないからです。

+0

答えはフロリアンです。 また、pthread_setname_npは、プログラムが実行されているスレッドでない場合、/ proc/PID/commに書き込もうとします。 解決策として私に何をお勧めしますか?/proc/self/task/TID/comm ..に直接書くのは簡単ですか?だから、私自身のpthread_setname関数を書きます。 – gees

+0

私の最終的な解決策では、pthread_createで呼び出された関数にパラメータとしてスレッド名を与え、この関数を呼び出してpthread_setname_npという名前を設定します。名前の設定はフロリアンの説明どおりに自分のスレッドでのみ許可されるためです。 – gees