From: Takahiro Kambe Date: 2003-07-22T08:30:31+09:00 Subject: [ruby-list:37926] Re: control user ID / group ID In message <20030722.064744.41643706.nagai@ai.kyutech.ac.jp> on Tue, 22 Jul 2003 06:47:45 +0900, Hidetoshi NAGAI wrote: > 現状,やむをえず setruid()/setrgid() を使っているのは, > 非特権ユーザの状態で権限放棄を行いたい場合です. > この時 setgid() は実効グループ ID の変更はするものの, > 実/保存グループ ID の変更はなされません. NetBSDのsetgid(2)には、 The setgid() function sets the real and effective group IDs and the saved set-group-ID of the current process to the specified value. とあり、実・保存gidも変更されるように読めます。 > 同様に非特権ユーザでは > setegid() でも保存グループ ID の変更はできません. こちらは実効gidだけ変更するものですね。 > 実/実効/保存のすべてが変更されていない限り,完全な特権放棄には > なりませんから,setrgid() なしに非特権ユーザの状態で権限放棄が 完全な特権放棄は適切に実効・実行IDを非特権ユーザにした上で、exec(3)系 を実行することで達成できます。 逆に exec(3)系を実行しない限りでは、適切にプログラムが書かれていれば 「完全な特権放棄」自体が不要という発想があるのではないでしょうか。 > しかし,チェックを忘れている (サボっている) スクリプトにおいて, > 非推奨とはいえ実装されている機能を使えば救うことができる処理を > あっさり「できません」としてしまうのは少々忍びないと思えました. > それゆえ,非推奨を承知の上で用いるように実装しています. setuid/setgid bitの機構そのものが微妙なところに成り立っている以上、 このあたりを忘れているスクリプトをあまり気を効かせて救ってしまうと 安全性的に逆効果となる恐れはないのでしょうか? P.S. ちなみに issetugid(2)といったものが、OpenBSD 2.0, FreeBSD 3.0, NetBSD 1.5以降で実装されています。 -- 神戸 隆博 / Takahiro Kambe