68user's page 掲示板

Prev< No. 223〜233> Next  [最新発言に戻る] [過去ログ一覧]
No. 223 # M.Masuda 1999/03/25 (木) 00:30
>2番目の方法のソースは、よろしければお見せしましょうか?
  この方法は、私も非常に興味があります是非お願いします。
すいません。これって「wrapperを使う」方ですね。
勘違いしてました。

興味があるのは、perlでの方です。
「suidperlを使う」ってのは、やってみましたが動きませんでした。
なぜなんだろう?

No. 224 # 68user 1999/03/25 (木) 17:04
> 「suidperlを使う」ってのは、やってみましたが動きませんでした。
書き方が悪かったですが、普通にperlスクリプトを書いて、
    chown root script;chmod 4755 script
として scriptを実行すれば、scriptがsuidされているかどうかを
perl(/usr/local/bin/perl)が調べくれて、もしsuidされていたら
勝手にsuidperlを実行してくれます。suidperlはrootにsuidされている
プログラムなので、そこで実行権限をscriptのオーナー(この場合はroot)
に変えて実行してくれるわけです。
# perl4はどうなるか知らない。

shやcshはそういうことはしてくれないので、suidスクリプトは
実行者の権限でしか動きません。

ちなみにCで書く方法も簡単で、特定のコマンドをexeclやexecvする
プログラムをCで書いて、コンパイルして、
    chown root program;chmod 4755 program
するだけです。

No. 225 # mm 1999/03/25 (木) 23:55
先日某所で尋ねられた件について、ちょっと分からなかったので、
質問させて下さい。

尋ねられた内容は、C言語に関して、
    if ( NULL != (hp = gethostbyaddr(...)) )
        return hp->h_name;
というコードで関数が返すポインタが指し示す
文字列の実体が何処に確保されているか?
(実際は、これに似たコードで、コンパイラが
警告を出したことが発端なんですが…)

ということなのですが、gethostbyaddr()がポインタで返す
struct hostent の実体については、
>NOTES
>A return value points to static data,
>which is overwritten by any subsequently called functions
>using the same structure.
というのを見つけて、ライブラリ内で1個だけ静的に確保して
いることは分かったのですが、この struct hostent のメンバー
である char *h_name が指す文字列の実体が何処に確保されて
いるのかまでは分からなかったのです。

struct hostent の他のメンバーには char **h_addr_list
なんてのもあるんで、これらがすべて静的領域に確保され
ているとは考え難いと思います。

でも、もしmalloc()などでヒープに確保されるのであれば、
文字列の利用後に free する必要はないのでしょうか?
(必要があれば、どこかに書いてあると思うので、
その必要はないとは思うのですが、だとしたら何故不要なのか
がよく分からないのです。gethostbyaddr()の内部で atexti()
により free() する関数を登録してるとか…?)

それと、unix では、一般にプログラム内部で malloc() などで
確保したメモリをプログラムの終了までに free() を使って
明示的に解放しなかった場合、どうなるのでしょうか?
WindowやMS-DOSでのFARヒープの場合のように、メモリ上に
ゴミとして残るのでしょうか?
それとも、プロセスの終了を見て、システムが自動的に解放
してくれるのでしょうか?

No. 226 # M.Masuda 1999/03/26 (金) 00:00
>「suidperlを使う」ってのは...
やっぱだめです。なんでだろ?

ls -lの結果は
-rwsrwxr-x 1 root 501 342 Mar 25 23:41 su.cgi*
で、

su.cgiの内容は、

#!/usr/bin/suidperl
$|=1;
print "Content-type: text/html\n\n";
print "<html>";
print "<H3>su test</H3>";
print "<pre>\n";

print "#############################\n";

print "<hr>\n";

$_=system("cat /etc/ftpaccess");
print "$_\n";
print system("date>testfile");

print "</pre>";
print "<hr>";
print "</html>";
です。
試しに適当につくってあるので、内容が恥ずかしいんですが
#!/usr/bin/suidperl
の行も最初は普通にperlを指定したんだけどダメなので、
試しに上記の様にしてもやはりだめでした。
rootでコマンドラインから実行するとOKです。
もちろん /etc/ftpaccessは、600のパーミッションです。
う〜ん、わからん。
変なところが在ったら教えて下さい。
#ちなみにperlは日本語パッチが当たってますけど関係有ります?

それからもう一つお願いします。
aliasを使って、あるユーザに来たメールを転送させる設定は
/etc/aliasesに記述しないとだめなんでしょうか?

いつもいつも御世話になりっぱなしで申し訳ないですが、お師匠様
なにとぞ宜しくお願いします。m(_ _)m

No. 227 # 68user 1999/03/26 (金) 00:30
M.Masudaさん
> rootでコマンドラインから実行するとOKです。
一般ユーザでコマンドラインから実行するとどうなります?

> $_=system("cat /etc/ftpaccess");
> print system("date>testfile");
ここらへんがくさいです。httpdのエラーログに、PATHがどうこう、と出て
ませんか? うちは
    #!/usr/local/bin/perl
    print "Content-type: text/plain\n\n";
    open(IN,"/etc/ftepaccess");
    print <IN>;
でOKでした。CGIからでも うまくいきました。
    open(IN,"/bin/cat /etc/ftepaccess |");
だと、
    Insecure $ENV{PATH} while running setuid at ./a line 4.
とエラーになりました。あと、perl4ではsuidスクリプトは動かない
ようです。

> aliasを使って、あるユーザに来たメールを転送させる設定は
> /etc/aliasesに記述しないとだめなんでしょうか?
質問の意図がよくわかりません。どこか別のところに書きたいのでしょうか?

mmさん
> それとも、プロセスの終了を見て、システムが自動的に解放
> してくれるのでしょうか?
はい、勝手にfreeしてくれます。gethostbyaddrの件は少し調べてから…。

No. 228 # ROL 1999/03/26 (金) 00:51
LinuxWorldでredhatを入手して一週間!
ついにLinux起動いたしました(笑)
さぁ、次はインターネットに接続だ。

しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑)

No. 229 # M.Masuda 1999/03/26 (金) 01:33
なぜじゃ〜どうしてじゃ〜←狭間かんぺい調(爆)
>一般ユーザで...

これもだめです。68Userさんが前に書いたとおりアクセス件が無いと
怒られます。
Insecure $ENV{PATH} while running setuid at ./su.cgi line 13.
と出ました。

>httpdのエラーログに、PATHがどうこう、と...
アパッチのerror_logは、だんまりです。(>_<)

>ここらへんがくさいです。
これも68Userさんと同じコードで試しました、がダメ。

ひとつ不思議を見つけました。
perl -c とすると、Args must match #! line at su.cgi line 1.
と出ます。

んっ!

とここまで書いて、他の事をいろいろ調べたらどうもこれが
前に疑問だった、suExecの機能のようです。
http://japache.infoscience.co.jp/japanese/manual/suexec.html
ってことは、68Userさんの環境はsuExecが実装された環境のようで
すね。
#今夜はずっとこの問題で格闘していたのでつかれた....ふげっ!

aliasの件は、ダミーユーザー(ログオンしない)宛のメールを管理
者に転送するという意味です。
#やってみれば分かりますね...(^^;
.bashrc等の設定ファイルに記述するのは、普通コマンドのailas
なのですか?

#なんかドッとつかれた....(T_T)

No. 230 # 68user 1999/03/26 (金) 02:20
うちでは #!/usr/local/bin/suidperl でも動きました。

> perl -c とすると、Args must match #! line at su.cgi line 1. と出ます。
suidスクリプトの実行時には、perlに渡す引数と
suidperlに渡す引数が同じでなくてはいけません。
# …と、青ラクダ本に書いてありました。

> これも68Userさんと同じコードで試しました、がダメ。
/usr/bin/perl は perl5 ですか?

FreeBSDの場合、FreeBSD 3.0R から /usr/bin/perl が perl5 に
なったのですが(それまではperl4)、その /usr/bin/perl は
suidperl が起動しないようになっていると聞きます。Linuxでも
OSの方針で、suidperlを実行しないようにコンパイルされている
のかもしれません。

> 68Userさんの環境はsuExecが実装された環境のようですね。
いえ、うちにはSuExecは入れてません。

何か問題が発生すると原因を切りわけていく必要があります。
httpdが原因かもしれないので、CGI経由で実行するより
コマンドラインで実行すべきかと思います。


> aliasの件は、ダミーユーザー(ログオンしない)宛のメールを管理
> 者に転送するという意味です。
ん〜、まだちょっと意味がわかりかねます。

> .bashrc等の設定ファイルに記述するのは、普通コマンドのailas
> なのですか?
そうです。コマンドの alias と /etc/aliases は全く別物です。

ROLさん
> ついにLinux起動いたしました(笑)
FreeBSDじゃないんですねぇ(^^;

> しかし、ここの話題についていけるようになるのに、どれだけの時間がかかるやら…(笑)
やる気があればすぐですよん。

No. 231 # 68user 1999/03/26 (金) 03:12
え〜、FreeBSDでは、gethostby* は libc に入ってますので、
gethostbyaddr のソースは
    http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1
ここらへんです。/etc/hostsなどを見て、見付からなかったらDNS引きに
いきますが、それを担当するのは
    http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1

    struct hostent * _gethostbydnsname(addr, len, af)
あたりでしょうか。で、そこらへんの絡みで、
    static struct hostent * gethostanswer(answer, anslen, qname, qtype)
が呼ばれますが、そこで
    host.h_aliases = host_aliases;
    host.h_addr_list = h_addr_ptrs;
といったことをしています。で、host_aliases や h_addr_ptrs は
gethostnamaddr.cの先頭で
    static char *h_addr_ptrs[MAXADDRS + 1];
    static struct hostent host;
    static char *host_aliases[MAXALIASES];
    static char hostbuf[8*1024];
などと定義されいます。ちなみに
    #define MAXALIASES 35
    #define MAXADDRS 35
です。

> これらがすべて静的領域に確保されているとは考え難いと思います。
というわけで、全て static で宣言されているようですね。当然ですが
    if (hap >= &h_addr_ptrs[MAXADDRS-1]) {
        if (!toobig++)
            dprintf("Too many addresses (%d)\n",MAXADDRS);
エラーチェックもしています。

> 先日某所で尋ねられた件について、ちょっと分からなかったので、
> 質問させて下さい。
もしよろしければ、その話題が出たのはどこなのか教えていただけますか?
こういう楽しい話題が出るところに参加したいもので。

No. 232 # 68user 1999/03/26 (金) 13:03
> いきますが、それを担当するのは
>  http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostnamadr.c?rev=1.10.2.1
失礼、
    http://www.freebsd.org/cgi/cvsweb.cgi/src/lib/libc/net/gethostbydns.c?rev=1.23
こっちでした。

でも、char **である host_aliases や h_addr_ptrs が指している
char * な領域ってのはどこかな? よく読んでませんが、
    static char hostbuf[8*1024];
っぽいですね。

No. 233 # mm 1999/03/26 (金) 22:06
>はい、勝手にfreeしてくれます。
なるほどー!
freeしなかったリスクは、ユーザーだけが引き受けて、
他人に迷惑を掛けるおそれはない訳ですね。

マルチユーザーのメモリ管理をちゃんと勉強しないといけないなぁ…


>え〜、FreeBSDでは、gethostby* は libc に入ってますので、
>gethostbyaddr のソースは
あっ、すいません。先に教えて頂いたときに、いろいろあるなー
と感心してたのですが、ライブラリのソースがあることまでは、
考えが及びませんでした(^^;;;
MS-DOSでも、入手可能な場合はありますが、有償だったり…
うーん、やはり羨ましい世界だぁ…

ともかく、詳細な解説ありがとうございましたm(_ _)m

>というわけで、全て static で宣言されているようですね。
ガ〜ン!
こういうコーディングもありなのかぁ…
16bitアドレス(MS-DOSのnearポインタ)でアクセスできる
最大64KBのデータ領域に慣れてしまうと、8KBもの静的領域
ってのが発想しづらい…(^^;

>char * な領域ってのはどこかな? よく読んでませんが、
> static char hostbuf[8*1024];
>っぽいですね。
ですね。hostbufのh_nameの後に順に書き並べて、このアドレスを
h_aliases[]にストアしてるみたいです。


>もしよろしければ、その話題が出たのはどこなのか教えていただけますか?
残念ながらプログラミング関連のボードではないので、
ご期待には沿えないかもしれません(^^;
それと、一応隠しボードなので、ここには書けないです。
でも、リンクを逆に辿って来るのはOKって言ってたので、
向こうからこっちにリンクを張っておきますんで、
覗いてみて下さい(笑い)

Prev< No. 223〜233> Next  [最新発言に戻る] [過去ログ一覧]