capshの使用方法:最小限の機能で非特権pingを実行しようとしています
On 2月 13, 2021 by adminDebian Gnu / Linuxで機能を試しています。
/ bin / pingを現在の作業ディレクトリにコピーしました。予想どおり、機能しませんでした。元々はsetuidrootでした。
次に、sudo /sbin/setcap cap_net_raw=ep ./ping
を実行して、pingに最小限の機能(rootではない)を与え、pingを実行します。期待どおりに機能します。
次に、sudo /sbin/setcap -r ./ping
でその機能を取り消します。現在、期待どおりに機能していません。
capsh
を使用してpingを機能させようとしています。
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
。
Edit-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
Edit-2
==
を--print
の前に置くと、今すぐはCurrent: = cap_net_raw+i
を示しているので、前のエラーを説明していますが、ルートから切り替えるときに機能が失われる理由ではありませんが、secure-keep-caps
は
編集-3
私が見ることができることから、execが呼び出されたときに、有効(e)と許可(p)を失っています。これは予想されることですが、secure-keep-capsを使用すれば、キャップが失われるのを防ぐことができると思いました。何かが足りないのですか。
編集-4
さらに調査を行い、マニュアルをもう一度読んでいます。通常、e
およびp
の機能は、次の場合に失われるようです。ユーザーroot
から切り替える(またはsecure-noroot
を適用して、rootを通常のユーザーにします)、これはsecure-keep-caps
でオーバーライドできます。 exec
に電話すると、私が知る限り、これは不変です。
私が知る限り、マニュアルに従って機能しています。私の知る限り、capsh
で何か便利なことをする方法はありません。私の知る限り、機能を使用するには、ファイル機能を使用するか、exec
を使用しない機能対応プログラムを使用する必要があります。したがって、特権ラッパーはありません。
では、何が欠けているのか、capsh
は何のためにあるのかという質問です。
Edit-5
アンビエント機能に関する回答を追加しました。 capsh
も継承された機能で使用できるかもしれませんが、有用であるためには、これらを実行可能ファイルに設定する必要があります。 capshがアンビエント機能なしで、または継承された機能を許可するためにどのように役立つかがわかりません。
バージョン:
-
capsh
パッケージからlibcap2-bin
バージョン1:2.22-1.2
- 編集前-3最新のividを取得しました
git://git.debian.org/collab-maint/libcap2.git
から= “2713a2e3e5”>
を使用して、使用を開始しました。
uname -a
Linux richard-laptop 3.2.0-4-amd64 #1 SMP Debian 3.2.65-1+deb7u2 x86_64 GNU/Linux
ユーザーランドは32ビットです。コメント
回答
機能はプロセスのプロパティです。従来、次の3つのセットがあります。
- 許可される機能( p ):現在のプロセスで「アクティブ化」されています。
- 有効な機能( e ):現在使用可能な機能現在のプロセスで。
- 継承可能な機能( i ):継承される可能性のあるファイル機能。
rootとして実行されるプログラムには、常に完全に許可された効果的な機能があるため、機能を「追加」しても目立った効果はありません。 (継承可能な機能セットは通常空です。)setcap cap_net_raw+ep ping
を使用すると、このプログラムを実行しているすべてのユーザーに対してデフォルトでこれらの機能を有効にします。
残念ながら、これらの機能はにバインドされています。実行されたファイルであり、新しい子プロセスの実行後に保持されません。 Linux 4.3では、アンビエント機能が導入されました。これにより機能を子プロセスに継承できます。 ( capabilities(7)の execve()中の機能の変換も参照してください。)
遊んでいる間機能については、次の落とし穴に注意してください。
- ユーザーをルートから非ルートに変更すると、有効な機能と許可された機能がクリアされます(ユーザーIDの変更による機能への影響を参照)。 capabilities(7))。
capsh
の--keep=1
オプションを使用して、セットがクリアされないようにすることができます。 - アンビエント機能セットは次の場合にクリアされます。ユーザーIDまたはグループIDの変更。解決策:ユーザーIDを変更した後、ただし子プロセスを実行する前にアンビエント機能を追加します。
- 機能はアンビエント機能にのみ追加できます。許可された機能と継承可能な機能の両方がすでに設定されている場合は設定します。
libcap 2.26以降、capsh
プログラムはアンビエント機能を変更できるようになりました。 --addamb
( commit )などのオプションを使用します。オプションの順序は重要であることに注意してください。使用例:
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
コマンドラインで現在の機能の状態を確認します。
注:--addamb
divにはcap_setpcap
が必要です> cap_setuid,cap_setgid
オプションには--user
が必要です。
コメント
- capsh –addambが設定されてからのlibcapの特定のバージョン番号はどれですか? 2.32リリースノートには新しいcapsh機能が記載されていましたが、その言葉はあいまいでした。
- @☆友情留在無盐答えが最初に書かれたとき、gitmasterだけがそれをサポートしていました。それ以来、libcap 2.26がリリースされ、
--addamb
オプションがサポートされています。それに応じて回答を更新しました。 - 残念ながら、これらの機能は実行されたファイルにバインドされ、新しい子プロセスの実行後に保持されません。–子プロセスによって私は通常、機能を継承する
fork(2)
について考えます。execve(2)
のみが機能を継承しません’が、子を作成しません’処理する。間違っていますか? -
man capabiltiies
の引用:fork(2)
を介して作成された子は親のコピーを継承します’の機能セット。
回答
Lekensteynの答えは正確で完全なようですが、アンビエント機能セットが解決する問題を強調するために、別の角度から別の説明を提供しようとします。
機能が再計算される(および削除される可能性がある)2つのシステムコールがあります。
-
setuid
:によるとman capabilities
:
SECBIT_KEEP_CAPSこのフラグを設定すると、1つ以上の0UIDを持つスレッドが許可されますすべてのUIDをゼロ以外の値に切り替えたときに機能を保持します。このフラグが設定されていない場合、そのようなUIDスイッチにより、スレッドはすべての機能を失います。
つまり、上記のcapsh
コマンドでは、setuid
システムコール。そうしないと、すべての機能が失われます。これは、--keep=1
が行うことです。したがって、コマンドはsudo capsh --user=<some_user> --keep=1 --
-
execve
になります。--keep=1
オプションを使用すると、すべての機能セット(有効、許可、継承可能)がまでexecve
システムコール。ただし、execve
を使用すると、機能も再計算されます(root以外のユーザーの場合)。それほど明白な方法ではありません。つまり、アンビエント機能セットを追加する前に、機能をスレッドの「許可」に含めることができます。execve
呼び出しの後に設定されます。- ファイルには、「許可された」セットにその機能が含まれている必要があります。これ
setcap cap_net_raw+p /bin/bash
を使用して実行できます。これを実行すると、スレッドの機能セット(境界セットを除く)が効果を失うため、演習全体が役に立たなくなります。 - ファイルとスレッドの両方が、「継承可能な」セットでその機能を備えている必要があります。
setcap cap_net_raw+i
でうまくいくと思うかもしれませんが、execve
を使用すると、スレッドの不可避のアクセス許可が呼び出されたときに削除されることがわかります。非特権ユーザー(現在、setuid
に感謝しています)。したがって、非特権ユーザーとしてこの条件を満たす方法はありません。
- ファイルには、「許可された」セットにその機能が含まれている必要があります。これ
Linux 4.3で導入された環境機能により、非特権ユーザーへのsetuid
の後に、ファイル機能に依存する必要はありません。
回答
カーネルにバグ/機能がある可能性があります。いくつかの議論がありました:
- https://bugzilla.altlinux.org/show_bug.cgi?id=16694
- http://linux.derkeiler.com/Mailing-Lists/Kernel/2005-03/5224.html
何かあったかどうか、わかりません。 1つは、修正するためです。
誤解しないでください。現在の動作は安全です。しかし、それは非常に安全なので、動作しているように見えるものの邪魔になります。
編集: http://man7.org/linux/man-pages/man7/capabilities.7.html 新しい機能セットAmbientがあります(Linux 4.3以降)。これにより、必要なものが可能になるようです。
回答
Lekensteynの回答を少し調整すると、最近のカーネルの呼び出しが短くなります。
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw -- \ -c "./ping -c1 localhost"
注:sudoersファイルによっては、環境が混乱する可能性があります(HOMEの変更など)。 capshはuidを変更しますが、sudoの環境変更を元に戻すことはできません。
では、ここで何が起こっているのでしょうか。見てみましょう:
-
sudo /usr/sbin/capsh
:rootとして開始します。これは、有効な(これを実行できる)セットと許可された(これを有効なセットに追加できる)セットにすべての機能を備えていますが、他のセットには何もありません。 。これらの他のセットについては、すぐに説明します。 -
--keep=1
:セキュリティ(読み取り:レガシー)の理由から、機能は通常、ルート間で継承されません->非ルートIDスイッチ。このフラグは、これを可能にするSECBIT_KEEP_CAPS
と呼ばれる機能を有効にします。execで自動的にクリアされることに注意してください。 、これは良い考えです。 -
--user=$USER
:UIDの変更ですべての機能が失われることはないので、rootから脱退します。SECBIT_KEEP_CAPS
のおかげで、ルートのような特権が保持され、機能をさらに混乱させることができます。 -
--inh=cap_net_raw
:これにより、ターゲット機能が継承可能なセットに追加されます。継承できない場合、機能をアンビエントにすることはできないためです(次の項目を参照)。 -
--addamb=cap_net_raw
:SECBIT_KEEP_CAPS
をリクエストした場合でも、非特権(setuid / setgid / setcapなし)バイナリのexecve
は 機能をクリアすると、特権がなくなります。Linux4.3はアンビエントセットを追加しました。これは、特権のないバイナリを実行するときに有効な許可されたセットに追加されます。完璧です! -
-- -c ...
:すべてを設定したら、これらの引数を使用してbashを実行します。機能セットがクリアされ(bashが非特権であるため)、アンビエントセットが追加され、出来上がりです!openrawを実行するために必要な権限がありますソケット。
特別な capshの引数。これにより、コマンドラインの残りの部分でそれ自体が実行されます。
sudo /usr/sbin/capsh --keep=1 --user=$USER \ --inh=cap_net_raw --addamb=cap_net_raw == --print Current: = cap_net_raw+eip
つまり、cap_net_rawは次のようになります。効果的(実行可能)、継承可能(子プロセスに渡すことができる)、および許可(取得が許可される)。そして、それらのいずれにも他の機能はありません。
機能とその機能の詳細については、 capabilities(7)のマニュアルページ。具体的には、見出しTransformation of capabilities during execve()
です。
コメント
- これはどういう意味ですか’が完了するまで’ドロップできない多くの追加機能が必要なため、早期に。?あなたの場合、” root “として実行しているので、それでも
--user
は実行されませんでした ‘変更されましたが、’後で必要な機能を引き続き使用できますか? - ご指摘いただきありがとうございます。 このコマンドラインの以前のバージョンでは、privが明示的に削除されていたため、その前にsetuidを実行する必要がありました。 privはexecの一部として暗黙的に削除されるため、’は必要ありません。
capsh
を取得しても、「最新の」capsh
は提供されませんが、Debianパッケージはまだサポートしていませんアンビエント機能。アップストリーム2.27はそうです。capsh
をどのように使用するかです。私は何が欠けています。用途が必要です。