From: EGUCHI Osamu Date: 1997-09-16T16:55:38+09:00 Subject: [ruby-list:4331] Dynamic load module security hole はじめまして えぐち@エスアンドイー です。 うさぎ さんの FreeBSD の PORTS コレクションで はじめて ruby に触りました。 まだ 「改行に ; のいらない perl」的なの部分しかわからず、 奥が深そうなので、時間を掛けて覚えたみたいと思います。 早速で恐縮なのですが、ports 化の過程でマイナーなミスがあったので include や require の検索パスについて調べる機会があり、 ダイナミックリンクの仕組みにセキュリティホールがある事に気づきました。 ruby のダイナミックリンクの検索パスに '.' が含まれているので、 ダイナミックロードするモジュールをカレントディレクトリに 用意すれば標準モジュールパス以外からモジュールを実行させることが出来ます。 この動作は、setuid なスクリプトを実行する場合にも有効なので、 悪意のあるモジュールをつくり、setuid なスクリプトにロードさせ スクリプトの実行権利を獲得することが出来てしまいます。 環境 RUBYLIB にも同様の問題があるので --- ruby.c~ Wed Sep 3 17:32:14 1997 +++ ruby.c Tue Sep 16 16:51:27 1997 @@ -551,7 +551,9 @@ rb_define_readonly_variable("$-p", &do_print); rb_define_readonly_variable("$-l", &do_line); - addpath(getenv("RUBYLIB")); + if (getuid() == geteuid() && getgid() == getegid()) { + addpath(getenv("RUBYLIB")); + } #ifdef RUBY_ARCHLIB addpath(RUBY_ARCHLIB); #endif の様に、setuid(setgid)の時は参照しないようにし他方が良いと思います。 実行環境は、 OS: FreeBSD-2.2(ctm delta #0432) Machine: ThinkPad535(pentium) Compile: gcc-2.7.2.1 ruby は ruby-1.0-970911 です。 #CGI や socket を直接操作するスクリプトを書くと setuid #せざる負えないケースもあるので取り越し苦労とは思いますが #ご報告しました。 #それより、rubyのスタイルになれないと、、、まだよく読めません。^^;