永井@知能.九工大です.

From: nobu.nakada / nifty.ne.jp
Subject: [ruby-dev:14662] How to abondon saved uid privilege
Date: Wed, 5 Sep 2001 12:03:36 +0900
Message-ID: <200109050250.f852o8t28829 / sharui.nakada.kanuma.tochigi.jp>
nobu.nakada>  setresuid()を持っているシステム(linuxのみ?)で、スーパーユーザ
nobu.nakada> 権限を放棄する方法はないでしょうか。Process.euid=やProcess.uid=
nobu.nakada> ではsaved uidが保存されるので、元に戻せてしまうので。

こんなサンプルで分かります?
=========================================================================
print "(0) initial IDs\n"   # 実ID = 0,    実効ID = 0,    保存ID = 0
                            #   root で実行していると仮定
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(1) set uid --> 10\n"
Process.uid = 10            # 実ID = 10,   実効ID = 0,    保存ID = 0
                            #   [ 本文 (A)(1) のケース ]
                            #   保存IDに実効IDがコピーされる
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(2) set euid --> 10\n"
Process.euid = 10           # 実ID = 10,   実効ID = 10,   保存ID = 0
                            #   [ 本文 (B)(1)(i) のケース ]
                            #   実効IDの変更が実IDと同じなので保存IDはそのまま
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(3) set uid --> 0\n"
Process.uid = 0             # 実ID = 10,   実効ID = 10,   保存ID = 0
                            #   [ 本文 (A)(2) のケース ]
                            #   特権ユーザの権限を持たないため変更されない
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(4) set euid --> 0\n"
Process.euid = 0            # 実ID = 10,   実効ID = 0,    保存ID = 0
                            #   [ 本文 (B)(2) のケース ]
                            #   保存IDと同じであるため変更できる
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(5) set euid --> 20\n"
Process.euid = 20           # 実ID = 10,   実効ID = 20,   保存ID = 20
                            #   [ 本文 (B)(1)(ii) のケース ]
                            #   実効IDの変更が実IDと異なるので保存IDにコピー
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(6) set euid --> 10\n"
Process.euid = 10           # 実ID = 10,   実効ID = 10,   保存ID = 20
                            #   [ 本文 (B)(2) のケース ]
                            #   実IDと同じなので実効IDを変更できる
                            #   実効IDの変更が実IDと同じなので保存IDはそのまま
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(7) set euid --> 20\n"
Process.euid = 20           # 実ID = 10,   実効ID = 20,   保存ID = 20
                            #   [ 本文 (B)(2) のケース ]
                            #   保存IDと同じであるため変更できる
                            #   実効IDの変更が実IDと異なるので保存IDにコピー
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(8) set uid --> 20\n"
Process.uid = 20            # 実ID = 20,   実効ID = 20,   保存ID = 20
                            #   [ 本文 (A)(2) のケース ]
                            #   実効IDと同じであるため変更できる
printf "uid = %2d   euid = %2d\n", Process.uid, Process.euid
print "-----------\n"
print "(9) set euid --> 0\n"
Process.euid = 0            # 特権ユーザでも保存IDと同じでもないのでエラー!!
=========================================================================
-- 
                                         永井 秀利 (九工大 知能情報)
                                             nagai / ai.kyutech.ac.jp