1

私のbashスクリプトを呼び出すpost-receiveフックがあります(ローカルリポジトリをプルしてJavaサーバーを再起動します)。

post-receive フックの所有者情報は次のとおりです。

-rwsr-x--x 1 cyril devs   676 19 dec.  14:45 post-receive

ご覧のとおり、他のユーザーに対してもsetuid bit実行できるように、このスクリプトにを設定しました。cyril/devs

このスクリプトの内容はかなり単純です。

echo "Running post-receive hook"
echo "Server will be up and running in about 1 minute"
/home/project/start_dev restart &

私のスクリプトstart_devにはこれらの権利があります:

-rwsr-x---  1 cyril devs 1515 19 dec.  14:41 start_dev

注: また、setuid.

アカウントを使用してサーバーに何かをプッシュすると、cyril完全に機能します。

別のアカウントを持つ他の誰かがサーバーにプッシュすると、次のようになります。

remote: /home/project/start_dev: line 52: kill: (11490) - Operation not allowed

(kill はインスタンスを停止するために使用されます。)

なぜこのエラーが発生するのか、スクリプトはcyrilユーザーではなくとして実行する必要があるため、このインスタンスを強制終了する権利があるはずですよね?

私は何を間違っていますか?

4

1 に答える 1

1

setuidどうやらほとんどのLinuxディストリビューションは、それが引き起こす可能性のある巨大なセキュリティホールのためにシェルスクリプトを無効にします。詳細はこちらsetuidWikipediaページから。

setuid機能は多くの場合非常に便利ですが、慎重に設計されていない実行可能プログラムにsetuid属性が割り当てられている場合、その不適切な使用はセキュリティリスクをもたらす可能性があります。潜在的なセキュリティ問題のため、多くのオペレーティングシステムは、実行可能シェルスクリプトに適用されるときにsetuid属性を無視します。

Tuxationページから考えられる解決策の1つは、次のことを行うことです。

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>

int main()
{
   setuid( 0 );
   system( "/path/to/script.sh" );

   return 0;
}

次にsetuid、結果のCプログラムをフックとして使用します。その後、Tuxationページにもこの解説があります:

とはいえ、setuidを使用してシェルスクリプトを実行することはあまり安全ではなく、ディストリビューションの設計者は、多くの人がそれを無効にしたときに何をしていたかについてかなり良い考えを持っていました。

于 2012-12-19T14:31:59.797 に答える