私はDebian Gnu / Linuxのさまざまな機能を試しています。
/bin/ping を現在の作業ディレクトリにコピーしました。もちろん、それは動作しませんでした。 setuid rootであることがわかりました。
その後、pingはpingに最小限の機能(ルートではない)を与え、sudo /sbin/setcap cap_net_raw=ep ./ping
pingが期待どおりに機能しました。
その後、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"
ただし、その機能が存在しない場合に発生しますping
。ping: icmp open socket: Operation not permitted
これはまた、これが私たちが必要とするのに十分ではないことを--print
示しています。Current: =p cap_net_raw+i
e
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
これは呼び出し時にオーバーライドできます。これは私が知っている限り不変です。p
root
secure-noroot
secure-keep-caps
exec
私が知る限り、マニュアルどおりに動作しています。私が知っている限り、有用なことをする方法はありません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
。