4

Apache 経由またはコマンドラインで呼び出される Perl スクリプトがあります。

テスト目的で、Perl スクリプトで操作するユーザー名を渡しPOSIX::setuiduid.

コマンド ラインからスクリプトを実行すると、uid適切に設定されます。

use CGI::Pretty qw/:standard/;
use POSIX qw(setuid getuid);

...
my ($pwName, $pwCode, $pwUid, $pwGid, $pwQuota, $pwComment, 
    $pwGcos, $pwHome, $pwLogprog) = getpwnam($username);

if ((defined $pwUid) && (getuid() == $pwUid)) {
    setuid($pwUid);
    print header;
    print Dumper $<;
}
else {
    print header(-status => 401);
    print "Could not setuid to correct uid (currently: )".getuid()."\n";
}

コマンドライン出力には、スクリプトの実行を開始したテスト アカウントではなくuid、指定された正しい が表示されます。$usernameuid

Apache 経由でスクリプトを呼び出すとuid、ユーザーの ID に設定されたままになり、変更さapacheれることはありません。

ドキュメントをsuExec読んだ後:

  1. http://www.example.com/~usernameこのスクリプトのコピーをfor everyに入れることはできません$username。スクリプトは 1 つの場所から実行する必要がありuid、スクリプト内で from を指定する必要があります。

  2. Apache 構成ファイルの仮想ホスト ディレクティブで一度指定された単一のユーザー名としてではなく、実行時に指定されたユーザー名としてスクリプトを実行する必要があります。新しいユーザーがこのスクリプトを実行するたびに、この構成ファイルを変更して Apache を再起動するのは現実的ではありません。

uidを使用しているときに、Perl スクリプトを cgi-bin として実行して正しく変更するにはどうすればよいsetuid()ですか?

4

1 に答える 1

4

setuid任意のuidにアクセスできる唯一の方法は、rootとして実行することです。[1]

あなたのことはわかりませんが、rootとして実行されるCGIプログラムのアイデアは私に悪夢を与えます。

uidを変更した後、このコードは実際に何をするはずですか?おそらく、これを行う必要なしにこれを達成する方法がありsetuidますか?

[1]コード​​とそのセキュリティモデルによっては、ユーザーのパスワードを収集し、su/ sudo[2]を使用して別のコマンドラインプログラムを実行し、Webサーバー環境の外部で実際の操作を実行できる場合がありますが、su/sudoは彼らはsuidrootであり、それでもCGIコードをrootとして実行することに関連する問題のほとんど/すべてを開くため、これを行うことができます。ルートを無効なユーザー名として除外したとしても、任意のユーザーになりすますことができると、悪用される可能性が高くなります。

[2]sudoは、パスワードを必要とせずにそれを許可するように構成することもできますが、そのパスにはドラゴンがいます。自分が何をしているのかを知っていることを確認してください。そうしないと、ユーザーが自由にお互いになりすますことができなくなります。

于 2011-02-14T10:47:08.257 に答える