[#15040] WeakRef and load(file, true) — Shugo Maeda <shugo@...>
前田です。
[#15043] puts array — "Akinori MUSHA" <knu@...>
puts に配列を与えたときの挙動が最新の 1.7 では変わっていて
こんにちは、なかむら(う)です。
At Wed, 7 Nov 2001 09:54:03 +0900,
[#15044] resolv.rb — Kazuhiro NISHIYAMA <zn@...>
Resolv::Hostsのデフォルトのファイル名ってWindows 9x環境だと
[#15047] can't set chomped String to environment — nobu.nakada@...
なかだです。
まつもと ゆきひろです
[#15067] rb_eval_string — OJ <oj@...7.com>
OJです。
なかだです。
OJです。
なかだです。
OJです。
わたなべです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
なかだです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
[#15100] Using static mark stack, GC is slow. — sheepman <sheepman@...>
こんばんは
[#15101] [bug?] pty causes segv by getting SIGINT — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15102] Gtk::Object#flags!= — akira yamada / やまだあきら <akira@...>
[#15116] rubylib_mangle whitespace — Kazuhiro Yoshida <moriq.kazuhiro@...>
もりきゅうです。
まつもと ゆきひろです
わたなべです。
[#15132] uri.rb — matz@... (Yukihiro Matsumoto)
まつもと ゆきひろです
[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>
まつもと ゆきひろです
[#15175] ruby-mingw32 configuration — HIDAKA Takahiro <cv8t-hdk@...>
ひだかです。
わたなべです。
[#15239] gc.c (gc_mark_rest): declare work area as static — "K.Kosako" <kosako@...>
現在のGCのアルゴリズム(matz-sheepman)を少し変更しようと思って、
On Thu, 22 Nov 2001 16:21:17 +0900
sheepmanさんの<20011122202749.56b8eb49.sheepman@tcn.zaq.ne.jp>から
[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>
というわけで 1.7 に syslog モジュールを入れました。
なかだです。
ただただしです。
At Mon, 26 Nov 2001 22:30:03 +0900,
In article <86r8ql90zt.wl@archon.local.idaemons.org>,
At Mon, 26 Nov 2001 23:07:30 +0900,
あおきです。
At Wed, 28 Nov 2001 07:58:55 +0900,
あおきです。
そうそう、 optparse も標準に入っていると便利だと思うのですが
まつもと ゆきひろです
In message <1007018271.960435.20342.nullmailer@ev.netlab.jp>
まつもと ゆきひろです
[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>
こんにちは、なかむら(う)です。
In message <20011128181510.3D11.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
In message <20011128182726.3D14.USA@osb.att.ne.jp>
なかだです。
こんにちは、なかむら(う)です。
In message <20011129183834.3790.USA@osb.att.ne.jp>
こんにちは、なかむら(う)です。
わたなべです。
こんにちは、なかむら(う)です。
取り込み、ありがとうございます。
こんにちは、なかむら(う)です。
[#15292] Re: m17n ruby 特に TRON 文字コード — TOYOFUKU Chikanobu <toyofuku@...>
豊福です。
[#15298] time.rb — Tanaka Akira <akr@...17n.org>
というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。
In article <hvovgftkgy7.fsf@coulee.a02.aist.go.jp>,
まつもと ゆきひろです
まつもと ゆきひろです
In article <1009298477.998171.30253.nullmailer@ev.netlab.jp>,
[ruby-dev:15035] Re: setuid and seteuid
永井@知能.九工大です.
Process.uid= 等の仕様と実装とをつらつらと考えてました.
で,suid-ruby についても考えていたのですが,
以下の最後に書いている件,
「suid-ruby の実現には setreuid が不可欠」
というのは間違ってはいないでしょうか???
自分で考えている限りはそう思えるのですが...
# suid-ruby 実現が可能な環境に制約ができるので,
# できることなら間違っていてほしいと思っている.(^_^;
===================================================================
setreuid が存在しない環境では,
起動時の実効ユーザ ID の値を C の変数 _SAVED_USER_ID に保存しておく.
この変数には,Process.uid= と Process.swap_uid(仮名)の他からのアクセスは
許さないようにする.
---------------------------------------------------------------
setreuid(uid,euid)
仕様 1 : 特権ユーザ (実効ユーザ ID が root) である場合は,
uid, euid 共に任意の値に変更できる.
ただし,-1 を指定した場合は,その対象は変更されない.
一般ユーザ (実効ユーザ ID が root 以外) である場合は,
uid が実効ユーザ ID と同じである場合のみに変更でき,
euid は実ユーザ ID か保存ユーザ ID と同じである場合に
変更できる.
実ユーザ ID が変更された場合,
または実効ユーザ ID が以前の実ユーザ ID と
違う値に設定された場合,
保存ユーザ ID は新しい実効ユーザ ID の値に設定される.
仕様 2 : 保存ユーザ ID の設定に関して以外は「仕様 1」に同じ.
保存ユーザ ID が新しい実効ユーザ ID の値に設定されるのは,
実ユーザ ID の値が変化した場合のみ.
setruid(uid)
仕様 1 : setreuid(uid,-1) と同じ.
setuid(uid)
仕様 1 : 特権ユーザである場合は
実ユーザ ID,実効ユーザ ID,保存ユーザ ID のすべてを
uid に変更する.
一般ユーザである場合は
uid が実効ユーザ ID か 保存ユーザ ID に等しい場合に
実効ユーザ ID のみを uid に変更することができる.
seteuid(euid)
仕様 1 : 特権ユーザである場合は実効ユーザ ID を uid に変更する.
一般ユーザである場合は
euid が実効ユーザ ID か 保存ユーザ ID に等しい場合に
実効ユーザ ID を euid に変更することができる.
---------------------------------------------------------------
Process.uid=(id)
仕様 : 「実ユーザ ID を変えてしまうためのもの」と位置付ける.
実ユーザ ID の変更に伴い,実効ユーザ ID や保存ユーザ ID が
変化するかは環境に依存するものとする.
setreuid が存在する場合
特権ユーザ (実効ユーザ ID が root) である場合は id は任意.
一般ユーザ (実効ユーザ ID が root 以外) である場合は
id が実効ユーザ ID と同じであれば変更できる.
保存ユーザ ID は 実効ユーザ ID と同じになる.
変更できない場合は,例外を発生する.
elsif setruid が存在する場合
setreuid の場合と同様
( 互換性と効果を考え,setuid よりもこちらを優先.)
elsif setuid が存在する場合
特権ユーザ (実効ユーザ ID が root) である場合に
実ユーザ ID,実効ユーザ ID,保存ユーザ ID のすべてを
id に変更する.
特権ユーザでない場合は例外を発生する.
( 状態をチェックし,非特権ユーザ時の実効ユーザ ID の
変更機能を外す.)
else 非サポート
実装 :
if setreuid が存在 then
if setreuid(id,-1) != 0 then
例外発生
end
elsif setruid が存在 then
if setruid(id) != 0 then
例外発生
end
_SAVED_USER_ID = geteuid()
elsif setuid が存在 then
if geteuid() == 0 then
setuid(id)
_SAVED_USER_ID = geteuid()
else
例外発生
end
else
例外発生 #==> 非サポート
end
Process.euid=(id)
仕様 : 「実効ユーザ ID を変えてしまうためのもの」と位置付ける.
実効ユーザ ID の変更に伴い,保存ユーザ ID が変化するかは
環境に依存するものとする.
setreuid が存在する場合
特権ユーザである場合は id は任意.
一般ユーザである場合は
id が実ユーザ ID か保存ユーザ ID と同じであれば変更できる.
特権ユーザによって実ユーザ ID と異なる値に設定された場合は,
保存ユーザ ID は新しい実効ユーザ ID と同じになる.
変更できない場合は,例外を発生する.
elsif seteuid が存在する場合
特権ユーザである場合は id は任意.
一般ユーザである場合は
id が実ユーザ ID か保存ユーザ ID と同じであれば変更できる.
保存ユーザ ID は変更されない.
変更できない場合は,例外を発生する.
elsif setuid が存在する場合
特権ユーザである場合は例外を発生する.
一般ユーザである場合は
id が実ユーザ ID か保存ユーザ ID と同じであれば変更できる.
保存ユーザ ID は変更されない.
変更できない場合は,例外を発生する.
else 非サポート
実装 :
if setreuid が存在 then
if setreuid(-1,id) != 0 then
例外発生
end
if (uid = getuid()) != id then
# 実/実効の id 交換を 2 回行うことで,
# setreuid の仕様 1 と仕様 2 との違いを吸収する.
# (強制的に保存ユーザ ID を変更する)
setreuid(id,uid);setreuid(uid,id)
end
elsif seteuid が存在 then
if seteuid(id) != 0 then
例外発生
end
elsif setuid が存在 then
if geteuid() == 0 then
例外発生
else
if setuid(id) != 0 then
例外発生
end
end
else
例外発生 #==> 非サポート
end
Process.swap_uid --- 新設(仮名)
仕様 : 「アクセス権限を(一時的に)入れ換えるためのもの」と位置付ける.
setreuid が存在する場合
実ユーザ ID と実効ユーザ ID とを入れ換える.
保存ユーザ ID は新しい実効ユーザ ID と同じになる.
elsif seteuid が存在する場合
( 保存ユーザ ID は存在するはず )
実効ユーザ ID が実ユーザ ID に等しければ
実効ユーザ ID を _SAVED_USER_ID に設定する.
そうでなければ,実効ユーザ ID を実ユーザ ID に設定する.
変更できない場合は,例外を発生する.
elsif setuid が存在する場合
特権ユーザである場合は例外を発生する.
一般ユーザである場合,
実効ユーザ ID が実ユーザ ID に等しければ
実効ユーザ ID を _SAVED_USER_ID に設定する.
そうでなければ,実効ユーザ ID を実ユーザ ID に設定する.
変更できない場合は,例外を発生する.
else 非サポート
実装 :
if setreuid が存在 then
setreuid(geteuid(),getuid())
elsif seteuid が存在 then
if geteuid() == getuid() then
if seteuid(_SAVED_USER_ID) != 0 then
例外発生 #==> 保存ユーザ ID を持たなければ失敗
end
else
seteuid(getuid())
end
elsif setuid が存在 then
if geteuid() == 0 then
例外発生
else
if geteuid() == getuid() then
if setuid(_SAVED_USER_ID) != 0 then
例外発生 #==> 保存ユーザ ID を持たなければ失敗
end
else
setuid(getuid())
end
end
else
例外発生 #==> 非サポート
end
---------------------------------------------------------------
suid-ruby の実装
起動された時点の (実 実効 保存) は (1 r r) : 起動したのはユーザ1
(1) 対象となるスクリプトの set-uid ビットが OFF の時 ==> (1 1 1) に変更
(2) 対象となるスクリプトの set-uid ビットが ON の時
(a) スクリプトオーナーが root ==> (1 r r) のまま
(b) スクリプトオーナーが一般ユーザ ==> (1 2 2) に変更
(ただし,ユーザ1 == ユーザ2 なら,(1) のケースに属する)
(1) if setreuid が存在 then
setreuid(r,1) #==> (r 1 1)
setreuid(1,-1) #==> (1 1 1)
elsif setuid が存在 then
setuid(1) #==> (1 1 1)
elsif setruid が存在 && seteuid が存在 then
setruid(r) #==> (r r r)
seteuid(1) #==> (r 1 r)
setruid(1) #==> (1 1 1)
else
サポート不能
end
(2a) そのまま
(2b) if setreuid が存在 then
setreuid(-1,2) #==> (1 2 2)
elseif 保存ユーザIDを持たない && seteuid が存在 then
seteuid(2) #==> (1 2)
elsif seteuid が存在 then
seteuid(2) #==> (1 2 r)
# 不完全サポート : root 権限を取れてしまう! 危険なので不可か?
# Process.euid= などでパラメータ制限して許す? 危険は同じ!
else
サポート不能
end
suid-ruby の実現には,setreuid が不可欠?
===================================================================
--
永井 秀利 (九工大 知能情報)
nagai@ai.kyutech.ac.jp