みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

suidperlでwebからグループ追加したい!

下記のPerlスクリプトを、
パーミッションを4755に設定して、
コンソールから実行するとグループが追加されますが、
WEBからCGIで実行するとグループ作成コマンド部分が動きません。

なぜでしょうか?
I am root.とはWEBでも表示されるのですが…。

#!/usr/bin/suidperl
print "Content-type: text/html\n\n";
printf "I am %s.\n",(getpwuid($>))[0];
$resp=`/usr/sbin/groupadd -g 1001 test_user`;


redhat9です。


次のページには、suidperlを使う場合は、SuEXECは必要ないとあるのですが…。

http://x68000.startshop.co.jp/~68user/webcgi/permission.html

投稿日時 - 2004-05-11 13:43:57

QNo.855035

すぐに回答ほしいです

質問者が選んだベストアンサー

>taint機能を回避できました方

実際suidperlなんて使ったこと無いのであれですが、
(管理めんどいから無くすとか聞いたけど、まだあったんだ)
参考URLによると正規表現で洗えばきれいになるらしいです。
(確からくだ本にもそんなこと書いてあった)
($groupname) = $groupname =~ s/(\w+)//;
って感じでどうですかね。

参考URL:http://www.ipa.go.jp/security/awareness/vendor/programming/a04_03_main.html

投稿日時 - 2004-05-11 19:48:02

お礼

ありがとう御座います。
これで出来ました!

実は、この方法もまた別のサイトで見て、一度試みていたのですが、何をぼけていたのか、その時は出来なかったので、さすがに、/usr/sbin/groupaddだから、どう除染しても駄目なのかなと思っていました。

それで、改めて、ご指摘を受け、パールのバージョンが違うのかななどと半信半疑でもう一度、試みてみたところ、今度はうまく行って、アレ???

多分、前回は、何をぼけていたのか、
if ($groupname =~ /^([-\@\w.]+)$/) {
$groupname = $1;
}
の$groupname = $1;を抜かして、ここにグループ追加コードを入れてました。これじゃ、$groupnameはそのままで変わらないのはあたり前ですよね!

返答を書くために、試してみたところ、動いたので、びっくり。試してよかった!

実は、もう、諦めて、直接、/etc/groupを編集するコードを書き上げてしまいました。(^^;)

これでどちらの方法でも行けるな!と前向きに考えることにします。どちらかぽしゃるかも知れないので、大きな収穫です!

ありがとう御座いました!

投稿日時 - 2004-05-11 20:37:22

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

WEBって、rootで走ってないですよね?

設定によって変わるとは思うのですが、WEBの実行ユーザー(多くの場合、nobody)は groupadd を実行する権限を持っているのでしょうか?
コマンドラインで実行した時に成功するのは、そのコマンドラインを叩いたユーザーが、groupadd を実行する権限を持っていただけ。
って言う事じゃ無いでしょうか?

投稿日時 - 2004-05-11 14:39:52

補足

アパッチのエラーログを見ると、問題は、perlのtaint機能にあり、変数が汚染されている恐れがあるため、実行できないようです。

↓ご参照URL
http://www.att.or.jp/perl/man/perlsec.1.html

現在、system関数に引数で「汚染されている恐れのあるグループ名」を渡すことを試みていますが、成功していません。

具体的には、次のコード(まだ成功していません。)を改編して、このtaint機能を回避できました方がいらっしゃいましたら、是非、ご教示をお願い致します。


#!/usr/bin/suidperl
require "./cgi-lib.pl";
&ReadParse();
$ENV{PATH}="";
print "Content-type: text/html\n\n";
$gid = 1001;
$groupname = $in{groupname};
$cmd_option = "-g $gid $groupname";
system("/usr/sbin/groupadd ", $cmd_option);
print "グループ追加\n";

system関数の使い方が悪いのでしょうか?

投稿日時 - 2004-05-11 15:51:54

お礼

下記のPerlスクリプトを、
パーミッションを4755に設定して、
WEBから実行するとグループが追加されます。

#!/usr/bin/suidperl
$ENV{PATH}="";
print "Content-type: text/html\n\n";
printf "I am %s.\n",(getpwuid($>))[0];
`/usr/sbin/groupadd -g 1001 test_group`;

しかし、次のようにグループ名をブラウザから渡そうとすると
うまく行きません。

#!/usr/bin/suidperl
require "./cgi-lib.pl";
&ReadParse();
$ENV{PATH}="";
print "Content-type: text/html\n\n";
$gid = 1001;
$groupname = $in{groupname};
$cmd_option = "-g $gid $groupname";
system("/usr/sbin/groupadd ", $cmd_option);
print "グループ追加\n";

アパッチのエラーログを見ると、問題は、perlのtaint機能にあり、変数が汚染されている恐れがあるため、実行できないようです。

↓ご参照URL
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsec.html


system関数に引数で「汚染されている恐れのある変数」を渡すと汚染検査は行われないとこのページには書いてあるのですが、どなたか、このtaint機能を回避できました方がいらっしゃいましたら、是非、ご教示をお願い致します。

system関数の使い方が悪いのでしょうか???

投稿日時 - 2004-05-11 17:37:24

あなたにオススメの質問