capshの使用方法:最小限の機能で特権のないpingを実行しようとしています


13

Debian Gnu / Linuxで機能を試しています。

/ bin / pingを現在の作業ディレクトリにコピーしました。予想通り動作しませんが、元々はsetuidルートでした。

次に、を実行してpingに最小限の機能(rootではない)を付与し、pingは正常に機能しsudo /sbin/setcap cap_net_raw=ep ./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が呼び出されたときにEffective(e)とPermitted(p)を失います。これは予想されていますが、安全なキープキャップは失われないようにする必要があると考えました。私は何かが欠けていますか。

編集-4

私はより多くの研究を行っており、マニュアルをもう一度読みました。通常e、次のp場合に機能が失われるようです:ユーザーから切り替えるroot(または、apply secure-noroot、つまりrootを通常のユーザーにする)場合、これをオーバーライドできます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
Lekensteynの例を新しいアップストリームリリースで試しましたか?capshcollab-maintリポジトリから取得しても「最新」capshは提供されませんでしたが、Debianパッケージはまだアンビエント機能をサポートしていません。アップストリーム2.27はサポートします。
スティーブンキット

1
@StephenKitt知っておくといいのですが、元々の質問はcapsh、アンビエントがない場合(本来のように)の用途です。私は何が欠けています。用途が必要です。
ctrl-alt-delor

回答:


11

機能はプロセスのプロパティです。従来、3つのセットがあります。

  • 許可された機能(p):現在のプロセスで「アクティブ化」される可能性のある機能。
  • 有効な機能(e):現在のプロセスで現在使用可能な機能。
  • 継承可能な機能(i):継承される可能性のあるファイル機能。

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

残念ながら、これらの機能は実行されたファイルにバインドされており、新しい子プロセスの実行後は保持されません。Linux 4.3では、子プロセスが機能を継承できる環境機能が導入されました。(も参照してください)(はexecveの間の機能の転換をして能力(7) 。)

機能で遊んでいる間、これらの落とし穴に注意してください:

  • ユーザーをルートから非ルートに変更すると、有効な機能と許可された機能はクリアされます(capabilities(7)の機能に対するユーザーIDの変更の影響を参照)。オプションを使用して、セットのクリアを回避できます。--keep=1capsh
  • ユーザーIDまたはグループIDを変更すると、環境機能セットはクリアされます。解決策:ユーザーIDを変更した、子プロセスを実行する前に、アンビエント機能を追加します。
  • 機能は、許可された機能セットと継承可能な機能セットの両方に既にある場合にのみ、環境機能セットに追加できます。

capshlibcap 2.25 のプログラムには、アンビエント機能を変更する機能はまだありませんが、後のリリースでは新しいオプション追加されています。オプションの順序は重要です。使用例:

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オプション。


6

Lekensteynの答えは正確かつ完全に思えますが、アンビエント機能セットが解決する問題を強調しようとする別の角度から別の説明を提供しようとします。

実行するsudo capsh --user=<some_user> --と、機能が再計算される(およびドロップされる可能性のある)2つのシステムコールがあります。

  1. setuid:によるとman capabilities

SECBIT_KEEP_CAPSこのフラグを設定すると、1つ以上の0 UIDを持つスレッドが、すべてのUIDをゼロ以外の値に切り替えたときに機能を保持できます。このフラグが設定されていない場合、そのようなUIDスイッチにより、スレッドはすべての機能を失います。

つまり、capsh上記のコマンドでは、setuidシステムコール中にSECBIT_KEEP_CAPSが設定されていることを確認する必要があります。そうしないと、すべての機能が失われます。これが何をするか--keep=1です。そのため、コマンドは次のようになりますsudo capsh --user=<some_user> --keep=1 --

  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に続いて非特権ユーザに対してexecveファイルの機能に依存することなく。


2

カーネルにバグ/機能がある可能性があります。いくつかの議論がありました:

私はそれを修正するために何かが行われた場合、私は見当がつかない。

誤解しないでください-現在の動作は安全です。しかし、非常に安全であるため、動作しているように見えるものの邪魔になります。

編集:http//man7.org/linux/man-pages/man7/capabilities.7.htmlによると、Ambient(Linux 4.3以降)の新しい機能セットがあります。これで必要なものが許可されるようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.