インタプリタバイナリをsetcap 'せずに、スクリプトで機能を使用できますか?


14

現在cap_net_bind_service MY_USERNAME、/ etc / security / capability.confで使用しています。
ここcap_net_bind_service+iで、libcap [-ng]を介しCAP_NET_BIND_SERVICE効果的なセットに追加できるように、お気に入りのスクリプト言語のインタープリターを設定する必要があります。

これは正常に機能しますが、インタープリターバイナリに上限を設定せずに同じことを達成する方法があるのだろうかと思います。これは大きな問題ではありませんが(他のユーザーアカウントには上限がないため、インタープリターバイナリにビットが設定されていても使用できません)、インタープリターが毎回フラグを再設定する必要があるため、多少面倒です更新しました。

回答:


4

通常、機能は子に継承されます。マンページに記載されているとおり:

fork(2)を介して作成された子は、その親の機能セットのコピーを継承します。

スクリプトの問題は、スクリプトが直接実行可能でないことです。カーネルはチェックのリストを調べます(カーネルコードはfs / binfmt _ *。cにあります)。それらの1つは「binfmt_script.c」で、最初の行でシバンをチェックしてから、スクリプトを引数として実際のインタープリター(シバンの1つ)を呼び出します。そのため、標準/共通インタープリターが呼び出され、単にスクリプトを引数として読み取ります。

つまり、スクリプトではなくインタープリターで機能を設定する必要があります。同じことがsuidビットや他の特別なフラグにも当てはまります。

したがって、インタープリターのコピーを作成し、必要な機能を設定し(chmod / chownを介して誰もアクセスできないことも確認してください)、シバンでこのコピーされたインタープリターを呼び出します。スクリプトでsetcapロジックを実行することもできます。


[OK]を、質問が2年前に尋ねたが、閉じられていませんでした...また、の重複のように思える見ていなかったunix.stackexchange.com/questions/87348/...
エイドリアンM.

ただi(継承)、execを過ぎます。そしてi、それ自体では何もしません。ファイルに一致するがある場合にのみ機能しie(スクリプト/実行可能ファイルがそれを設定しない限り)(有効な)ビットを使用します。setuidよりもさらに複雑です。これはスクリプト効果ではありません。
ctrl-alt-delor

1
シバンはシェルではなくカーネルによって読み取られたと思いますか?(stackoverflow.com/questions/3009192/how-does-the-shebang-work/...
フィリップCouling

あなたの言うとおりです。それは後で理解した誤解でした。スクリプトを実行するためのカーネルコードがどこにあるかをヒントに修正しました。
エイドリアンM.
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.