のマニュアルページによるとissetugid
、呼び出しは次のいずれかになるはずです。(1) uid/gid の変更を警告する。または (2) 汚染された環境の可能性を警告します。関数名は、3 つ目の目的を示唆しています。
最初の質問: 目的は何ですか?
利用可能な実装を調べると (たとえば、Linux カーネルは API を提供しないため、Linux システムではライブラリとして)、次のことがわかります。
if (getuid() != geteuid()) return 1;
if (getgid() != getegid()) return 1;
return 0;
Solaris では、次のようになります。
return ((curproc->p_flag & SUGID) != 0);
私は少し疑わしいですが、それは部分的には、BSD、Linux、Unix、Solaris など、すべてのプラットフォームで関数がどのようなもので、どのような関数が返さgeteuid
れるのかを理解するのが難しいためです。getegid
2 番目の質問: Linux コードは意味的に Solaris コードと同等ですか?
3 番目の質問: はプラットフォーム間で同じようgeteuid
に実装されていますか? getegid
リアル、効果的、節約という 3 つの ID の遊びがあるシステムについてはどうですか?
4 番目の質問: ここで重要なのは実効 ID だけですか?
プロセスが UID = 0 として開始され、一時的に権限が失われた場合、saved
ID が影響を及ぼします。root を一時的に削除するプロセスは、汚染する必要exec
はなく、汚染するべきではありません。
5 番目の質問: root を一時的に削除するプロセスは汚染されていますか?
6 番目の質問: 有効な ID が保存された ID であるプロセスは汚染されていると見なすべきですか?