- ベストアンサー
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
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>taint機能を回避できました方 実際suidperlなんて使ったこと無いのであれですが、 (管理めんどいから無くすとか聞いたけど、まだあったんだ) 参考URLによると正規表現で洗えばきれいになるらしいです。 (確からくだ本にもそんなこと書いてあった) ($groupname) = $groupname =~ s/(\w+)//; って感じでどうですかね。
その他の回答 (1)
- Dpop
- ベストアンサー率51% (279/544)
WEBって、rootで走ってないですよね? 設定によって変わるとは思うのですが、WEBの実行ユーザー(多くの場合、nobody)は groupadd を実行する権限を持っているのでしょうか? コマンドラインで実行した時に成功するのは、そのコマンドラインを叩いたユーザーが、groupadd を実行する権限を持っていただけ。 って言う事じゃ無いでしょうか?
お礼
下記の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関数の使い方が悪いのでしょうか???
補足
アパッチのエラーログを見ると、問題は、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関数の使い方が悪いのでしょうか?
お礼
ありがとう御座います。 これで出来ました! 実は、この方法もまた別のサイトで見て、一度試みていたのですが、何をぼけていたのか、その時は出来なかったので、さすがに、/usr/sbin/groupaddだから、どう除染しても駄目なのかなと思っていました。 それで、改めて、ご指摘を受け、パールのバージョンが違うのかななどと半信半疑でもう一度、試みてみたところ、今度はうまく行って、アレ??? 多分、前回は、何をぼけていたのか、 if ($groupname =~ /^([-\@\w.]+)$/) { $groupname = $1; } の$groupname = $1;を抜かして、ここにグループ追加コードを入れてました。これじゃ、$groupnameはそのままで変わらないのはあたり前ですよね! 返答を書くために、試してみたところ、動いたので、びっくり。試してよかった! 実は、もう、諦めて、直接、/etc/groupを編集するコードを書き上げてしまいました。(^^;) これでどちらの方法でも行けるな!と前向きに考えることにします。どちらかぽしゃるかも知れないので、大きな収穫です! ありがとう御座いました!