[#15067] rb_eval_string — OJ <oj@...7.com>

OJです。

39 messages 2001/11/08
[#15068] Re: rb_eval_string — nobu.nakada@... 2001/11/08

なかだです。

[#15069] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/08

OJです。

[#15071] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15077] Re: rb_eval_string — OJ <oj@...7.com> 2001/11/09

OJです。

[#15078] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/09

わたなべです。

[#15083] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15088] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15089] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15092] Re: rb_eval_string — nobu.nakada@... 2001/11/09

なかだです。

[#15096] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/09

こんにちは、なかむら(う)です。

[#15109] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15112] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15114] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15115] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15119] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15121] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15124] Re: rb_eval_string — WATANABE Hirofumi <eban@...> 2001/11/12

わたなべです。

[#15126] Re: rb_eval_string — "U.Nakamura" <usa@...> 2001/11/12

こんにちは、なかむら(う)です。

[#15174] strange behavior about PTY.spawn — akira yamada / やまだあきら <akira@...>

18 messages 2001/11/15
[#15176] Re: strange behavior about PTY.spawn — matz@... (Yukihiro Matsumoto) 2001/11/15

まつもと ゆきひろです

[#15251] Re: [ruby-ext:01999] Re: syslog module is becoming ready — "Akinori MUSHA" <knu@...>

 というわけで 1.7 に syslog モジュールを入れました。

43 messages 2001/11/26

[#15270] ruby on NetBSD — "U.Nakamura" <usa@...>

こんにちは、なかむら(う)です。

25 messages 2001/11/28
[#15271] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128181510.3D11.USA@osb.att.ne.jp>

[#15272] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/28

こんにちは、なかむら(う)です。

[#15278] Re: ruby on NetBSD — Takahiro Kambe <taca@...> 2001/11/28

In message <20011128182726.3D14.USA@osb.att.ne.jp>

[#15296] Re: ruby on NetBSD — "U.Nakamura" <usa@...> 2001/11/29

こんにちは、なかむら(う)です。

[#15298] time.rb — Tanaka Akira <akr@...17n.org>

というわけで、timex.rb 改め time.rb が rough に入ったのでご意見募集です。

27 messages 2001/11/29

[ruby-dev:15035] Re: setuid and seteuid

From: nagai@...
Date: 2001-11-05 04:25:52 UTC
List: ruby-dev #15035
永井@知能.九工大です.

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

In This Thread