編集-1

編集-1

私はDebian Gnu / Linuxのさまざまな機能を試しています。

/bin/ping を現在の作業ディレクトリにコピーしました。もちろん、それは動作しませんでした。 setuid rootであることがわかりました。

その後、pingはpingに最小限の機能(ルートではない)を与え、sudo /sbin/setcap cap_net_raw=ep ./pingpingが期待どおりに機能しました。

その後、sudo /sbin/setcap -r ./ping能力をキャンセルします。これで期待どおりに動作しません。

今pingを動作させようとしていますcapsh

capsh権限がないため、rootとして実行してからroot権限を削除して、他のすべての権限を削除する必要があります。

secure-keep-caps文書化されていませんが、capsh機能マニュアルにあるこの機能も必要だと思います。からビット数を取得しました/usr/include/linux/securebits.h。出力に--printビットが正しいとマークされているため、正しいように見えます。

私は何時間もそれと私が今まで持っているものに触れてきました。

sudo /sbin/capsh --keep=1 --secbits=0x10 --caps="cap_net_raw+epi" == --secbits=0x10 --user=${USER} --print -- -c "./ping localhost"

ただし、その機能が存在しない場合に発生しますpingping: icmp open socket: Operation not permittedこれはまた、これが私たちが必要とするのに十分ではないことを--print示しています。Current: =p cap_net_raw+ie

sudo /sbin/capsh --caps="cap_net_raw+epi" --print -- -c "./ping localhost"機能をこれに設定するのCurrent: = cap_net_raw+eipは正しいですがroot

編集-1

今試してみましたsudo /sbin/capsh --keep=1 --secbits=0x11 --caps=cap_net_raw+epi --print -- -c "touch zz; ./ping -c1 localhost;"

これで以下が生成されます。

touch: cannot touch `zz': Permission denied
ping: icmp open socket: Operation not permitted

最初のエラーは予想されたが、secure-noroot: yes 2番目のエラーは予想されなかった。Current: = cap_net_raw+eip

編集2

==前に入れる--printと今表示されるので、以前のCurrent: = cap_net_raw+iエラーは説明されていますが、ルートから切り替えると電源が切れる理由は説明されていないので、このsecure-keep-caps問題を解決する必要があると思います。

編集3

私が見ることができる限り、execを呼び出すとvalid(e)とallowed(p)が失われます。これは当然のことですが、安全キャップをかぶせて紛失を防ぐ必要があると思います。私は何を逃したことがありませんか?

編集4

より多くの調査を行い、マニュアルをもう一度読みました。通常、ユーザーから切り替えると(または適用してルートを一般ユーザーにするとき)、機能が失われるようです。eこれは呼び出し時にオーバーライドできます。これは私が知っている限り不変です。prootsecure-norootsecure-keep-capsexec

私が知る限り、マニュアルどおりに動作しています。私が知っている限り、有用なことをする方法はありませんcapsh。私が知っている限り、関数を使用するには次のものが必要です。ファイル関数を使用または使用しない関数認識プログラムが必要ですexec。したがって、特権ラッパーはありません。

今私の質問は私が何を見逃していて、capsh私の目的は何ですか?

編集5

環境機能への回答を追加しました。継承された関数でも機能できますが、capsh便利に使用するには実行可能ファイルに設定する必要があります。私は周辺機能や継承された機能を許可せず、どのようにcapshが役に立つことができるか理解していません。


バージョン:

  • capshパッケージlibcap2-binバージョンから1:2.22-1.2
  • edit-3以前は最新バージョンを受け取り、capsh使いgit://git.debian.org/collab-maint/libcap2.git始めました。
  • uname -a Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux ユーザースペースは32ビットです。

ベストアンサー1

能力はプロセスの属性です。伝統的に3つのグループがあります。

  • 許可された機能():現在のプロセスで「アクティブ化」できる機能です。
  • 有効能力(金利):現在のプロセスで現在利用可能な機能です。
  • 遺伝能力(): 継承できるファイル機能です。

ルートとして実行されるプログラムは常に完全に受け入れられ、有効な機能を持っているので、より多くの機能を「追加」しても顕著な効果はありません。 (継承可能な機能セットは通常空です。)デフォルトでは、setcap cap_net_raw+ep pingこのプログラムを実行しているすべてのユーザーに対してこれらの機能を有効にします。

残念ながら、これらの関数は実行されたファイルにバインドされており、新しい子プロセスを実行した後も保持されません。 Linux 4.3 リリース環境能力これにより、子プロセスが機能を継承できます。 (あなたも見ることができますexecve() 中の関数変換存在する能力(7).)

機能を使用するときは、次のトラップに注意してください。

  • ユーザーをrootからroot以外のユーザーに変更すると、有効かつ許可された権限が消去されます(参照:ユーザーIDの変更が機能に与える影響存在する能力(7))。--keep=1オプションを使用すると、capshコレクションが消去されるのを防ぎます。
  • ユーザーまたはグループIDを変更すると、環境機能セットがクリアされます。回避策:環境機能の追加後ろにユーザーIDを変更しましたが、今後子プロセスを実行します。
  • 許可された機能セットと継承可能な機能セットの両方にすでに存在する場合にのみ、機能を環境機能セットに追加できます。

libcap 2.26以降、capshプログラムは次のオプションで環境機能を変更する機能を得ました--addamb犯罪)。オプションの順序が重要です。使用例:

sudo capsh --caps="cap_net_raw+eip cap_setpcap,cap_setuid,cap_setgid+ep" \
    --keep=1 --user=nobody --addamb=cap_net_raw -- \
    -c "./ping -c1 127.0.0.1"

ヒント:--printコマンドラインの任意の場所にこのオプションを追加して、capsh現在の機能を確認できます。

注:cap_setpcapは必須--addamb、オプションはcap_setuid,cap_setgid必須です--user

おすすめ記事