[#14614] 大小文字を無視した比較で ' 帰 ' == ' 蟻 ' ? — "K.Umakoshi" <pegacorn@...>

こんにちは。

18 messages 2001/09/02
[#14615] Re: 大小文字を無視した比較で ' 帰 ' == ' 蟻 ' ? — matz@... (Yukihiro Matsumoto) 2001/09/02

まつもと ゆきひろです

[#14662] How to abondon saved uid privilege — nobu.nakada@...

なかだです。

60 messages 2001/09/05
[#14663] Re: How to abondon saved uid privilege — nagai@... 2001/09/05

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

[#14672] Re: How to abondon saved uid privilege — nobu.nakada@... 2001/09/05

なかだです。

[#14677] Re: How to abondon saved uid privilege — nagai@... 2001/09/05

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

[#14678] Re: How to abondon saved uid privilege — matz@... (Yukihiro Matsumoto) 2001/09/05

まつもと ゆきひろです

[#14680] Re: How to abondon saved uid privilege — nagai@... 2001/09/05

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

[#14685] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/05

In message <20010905184635H.nagai@ai.kyutech.ac.jp>

[#14687] Re: How to abondon saved uid privilege — "Akinori MUSHA" <knu@...> 2001/09/05

 ちょっと脱線します。 :)

[#14688] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/05

In message <86ofopevkv.wl@archon.local.idaemons.org>

[#14691] Re: How to abondon saved uid privilege — matz@... (Yukihiro Matsumoto) 2001/09/05

まつもと ゆきひろです

[#14693] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/05

In message <999700675.662743.18683.nullmailer@ev.netlab.jp>

[#14703] Re: How to abondon saved uid privilege — nagai@... 2001/09/06

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

[#14707] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/06

In message <20010906111828R.nagai@ai.kyutech.ac.jp>

[#14708] Re: How to abondon saved uid privilege — nagai@... 2001/09/06

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

[#14709] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/06

In message <20010906132656Z.nagai@ai.kyutech.ac.jp>

[#14728] Re: How to abondon saved uid privilege — nagai@... 2001/09/06

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

[#14729] Re: How to abondon saved uid privilege — Takahiro Kambe <taca@...> 2001/09/06

In message <20010906174440D.nagai@ai.kyutech.ac.jp>

[#14732] Re: How to abondon saved uid privilege — nagai@... 2001/09/06

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

[#14774] Re: How to abondon saved uid privilege — nagai@... 2001/09/12

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

[#14841] Re: How to abondon saved uid privilege — nagai@... 2001/10/02

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

[#15026] setuid and seteuid — nagai@... 2001/11/02

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

[#15030] Re: setuid and seteuid — Tanaka Akira <akr@...17n.org> 2001/11/03

In article <20011102175733K.nagai@ai.kyutech.ac.jp>,

[#15032] Re: setuid and seteuid — nagai@... 2001/11/03

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

[#14743] [BUG] $_ on thread switching — nobu.nakada@...

なかだです。

24 messages 2001/09/07
[#14746] Re: [BUG] $_ on thread switching — nobu.nakada@... 2001/09/07

なかだです。

[#14747] Re: [BUG] $_ on thread switching — matz@... (Yukihiro Matsumoto) 2001/09/07

まつもと ゆきひろです

[#14748] Re: [BUG] $_ on thread switching — nobu.nakada@... 2001/09/08

なかだです。

[#14750] Re: [BUG] $_ on thread switching — matz@... (Yukihiro Matsumoto) 2001/09/08

まつもと ゆきひろです

[#14752] Re: [BUG] $_ on thread switching — nobu.nakada@... 2001/09/08

なかだです。

[#14753] Re: [BUG] $_ on thread switching — matz@... (Yukihiro Matsumoto) 2001/09/08

まつもと ゆきひろです

[#14755] Re: [BUG] $_ on thread switching — nobu.nakada@... 2001/09/08

なかだです。

[ruby-dev:14621] suidruby

From: nobu.nakada@...
Date: 2001-09-02 16:18:58 UTC
List: ruby-dev #14621
なかだです。

 suidrubyについて考えてみました。

 基本的には、スクリプトをオープンした直後にフックを用意して、
チェックを入れてはねる、もしくは不要な特権を捨てるという形です。

 はねるスクリプトの条件としては以下の通り。

(1) real_readable?でもreal_executable?でもない
(2) setuidなのにgroup/world writable
(3) setgidなのにworld writable
(4) setuid/setgidされていない

 あとgroup_member()ですが、glibだと同じものが用意されてるので(
というかそれを意識したんでしょうが)、システムにあるときにはそち
らを使うということで、グローバルにしても問題はないんじゃないか
と思います。


-- 
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
    中田 伸悦

Attachments (2)

suidruby.patch (3.49 KB, text/x-diff)
Index: Makefile.in
===================================================================
RCS file: /cvs/ruby/src/ruby/Makefile.in,v
retrieving revision 1.25
diff -u -2 -p -r1.25 Makefile.in
--- Makefile.in	2001/05/07 09:26:23	1.25
+++ Makefile.in	2001/09/02 07:37:20
@@ -26,7 +26,9 @@ MAINLIBS = @MAINLIBS@
 
 RUBY_INSTALL_NAME=@RUBY_INSTALL_NAME@
+SRUBY_INSTALL_NAME=@SRUBY_INSTALL_NAME@
 RUBY_SO_NAME=@RUBY_SO_NAME@
 EXEEXT = @EXEEXT@
 PROGRAM=$(RUBY_INSTALL_NAME)$(EXEEXT)
+SPROGRAM=$(SRUBY_INSTALL_NAME)$(EXEEXT)
 
 #### End of system configuration section. ####
@@ -95,4 +97,8 @@ all:		miniruby$(EXEEXT) @PREP@ rbconfig.
 		$(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) -o $@
 
+$(SPROGRAM):	$(LIBRUBY) $(MAINOBJ) $(EXTOBJS) suid.@OBJEXT@
+		@rm -f $@
+		$(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) suid.@OBJEXT@ $(LIBRUBYARG) $(LIBS) -o $@
+
 $(LIBRUBY_A):	$(OBJS) dmyext.@OBJEXT@
 		@AR@ rcu $@ $(OBJS) dmyext.@OBJEXT@
@@ -277,2 +283,3 @@ util.@OBJEXT@: util.c ruby.h config.h de
 variable.@OBJEXT@: variable.c ruby.h config.h defines.h intern.h env.h node.h st.h
 version.@OBJEXT@: version.c ruby.h config.h defines.h intern.h version.h
+suid.@OBJEXT@: suid.c ruby.h rubyio.h
Index: configure.in
===================================================================
RCS file: /cvs/ruby/src/ruby/configure.in,v
retrieving revision 1.93
diff -u -2 -p -u -r1.93 configure.in
--- configure.in	2001/08/06 03:05:12	1.93
+++ configure.in	2001/09/02 07:36:42
@@ -299,5 +299,6 @@ AC_REPLACE_FUNCS(dup2 memmove mkdir strc
 	      setrgid setegid setregid setresgid pause lchown lchmod\
 	      getpgrp setpgrp getpgid setpgid getgroups getpriority getrlimit\
-	      dlopen sigprocmask sigaction _setjmp setsid telldir seekdir fchmod)
+	      dlopen sigprocmask sigaction _setjmp setsid telldir seekdir fchmod\
+	      group_member)
 AC_STRUCT_TIMEZONE
 AC_CACHE_CHECK(for external int daylight, rb_cv_have_daylight,
@@ -1002,4 +1003,5 @@ AC_SUBST(LIBRUBY_LDSHARED)
 AC_SUBST(LIBRUBY_DLDFLAGS)
 AC_SUBST(RUBY_INSTALL_NAME)
+AC_SUBST(SRUBY_INSTALL_NAME)
 AC_SUBST(RUBY_SO_NAME)
 AC_SUBST(LIBRUBY_A)
@@ -1022,4 +1024,5 @@ test "$program_suffix" != NONE &&
 
 RUBY_INSTALL_NAME="${ri_prefix}ruby${ri_suffix}"
+SRUBY_INSTALL_NAME="${ri_prefix}suidruby${ri_suffix}"
 case "$target_os" in
   cygwin*|mingw*|*djgpp*|os2_emx*)
Index: file.c
===================================================================
RCS file: /cvs/ruby/src/ruby/file.c,v
retrieving revision 1.69
diff -u -2 -p -u -r1.69 file.c
--- file.c	2001/08/23 06:02:14	1.69
+++ file.c	2001/09/02 00:07:32
@@ -386,5 +386,6 @@ rb_file_lstat(obj)
 }
 
-static int
+#ifndef HAVE_GROUP_MEMBER
+int
 group_member(gid)
     GETGROUPS_T gid;
@@ -411,4 +412,5 @@ group_member(gid)
     return Qfalse;
 }
+#endif
 
 #ifndef S_IXUGO
@@ -2405,4 +2407,12 @@ rb_find_file(path)
     return 0;
 }
+
+#if (defined S_ISUID || defined S_ISGID) && !defined __CYGWIN__
+void
+ruby_check_loadable(f)
+    VALUE f;
+{
+}
+#endif
 
 static void
Index: ruby.c
===================================================================
RCS file: /cvs/ruby/src/ruby/ruby.c,v
retrieving revision 1.51
diff -u -2 -p -u -r1.51 ruby.c
--- ruby.c	2001/09/01 03:34:04	1.51
+++ ruby.c	2001/09/02 11:45:18
@@ -21,4 +21,5 @@
 #include <stdio.h>
 #include <sys/types.h>
+#include <sys/stat.h>
 #include <ctype.h>
 
@@ -767,4 +768,8 @@ load_file(fname, script)
 		rb_io_binmode(f);
 	}
+#elif defined S_ISUID || defined S_ISGID
+	if (script) {
+	    ruby_check_loadable(f);
+	}
 #endif
     }
suid.c (2.24 KB, text/x-c++src)
/**********************************************************************

  suid.c -

  $Author$
  $Date$
  created at: Wed Aug 29 13:45:03 JST 2001

  This file is covered under the Ruby's license (see the file
  COPYING).

**********************************************************************/

#include "ruby.h"
#include "rubyio.h"
#include <errno.h>
#include <sys/stat.h>

#if !defined S_ISUID && !defined S_ISGID
#error "setuid/setgid not supported"
#endif

void
ruby_check_loadable(f)
    VALUE f;
{
    OpenFile *fptr;
    struct stat st;
    int setid = 0;
    int uid = (int)getuid(), gid = (int)getgid();
    int euid = (int)geteuid(), egid = (int)getegid();

    rb_check_type(f, T_FILE);

    if (uid == euid && gid == egid) return;

    GetOpenFile(f, fptr);
    if (fstat(fileno(fptr->f), &st) == -1) {
	rb_sys_fail(fptr->path);
    }

    if (uid != 0) {
	if ((
#if defined S_IRUSR || defined S_IXUSR
	    (st.st_uid == uid) ?
	    !(st.st_mode & (0
#ifdef S_IRUSR
			    |S_IRUSR
#endif
#ifdef S_IXUSR
			    |S_IXUSR
#endif
		)) :
#endif
#if defined S_IRGRP || defined S_IXGRP
	    group_member(st.st_gid) ?
	    !(st.st_mode & (0
#ifdef S_IRGRP
			    |S_IRGRP
#endif
#ifdef S_IXGRP
			    |S_IXGRP
#endif
		)) :
#endif
#if defined S_IROTH || defined S_IXOTH
	    !(st.st_mode & (0
#ifdef S_IROTH
			    |S_IROTH
#endif
#ifdef S_IXOTH
			    |S_IXOTH
#endif
		))
#else
	    0
#endif
	    )
#if defined S_ISUID && defined S_IWGRP
	    || !(~st.st_mode & (S_ISUID|S_IWGRP))
#endif
#if defined S_ISUID && defined S_IWOTH
	    || !(~st.st_mode & (S_ISUID|S_IWOTH))
#endif
#if defined S_ISGID && defined S_IWOTH
	    || !(~st.st_mode & (S_ISGID|S_IWOTH))
#endif
	    ) {
	    errno = EACCES;
	    rb_load_fail(fptr->path);
	}
    }

#ifdef S_ISGID
    if (st.st_mode & S_ISGID) {
# if defined HAVE_SETREGID
	setregid(-1, st.st_gid);
# elif defined HAVE_SETEGID
	setegid(st.st_gid);
# else
	setgid(st.st_gid);
# endif
	setid = 1;
    }
    else
#endif
	setgid(gid);

#ifdef S_ISUID
    if (st.st_mode & S_ISUID) {
# if defined HAVE_SETREUID
	setreuid(-1, st.st_uid);
# elif defined HAVE_SETEUID
	seteuid(st.st_uid);
# else
	setuid(st.st_uid);
# endif
	setid = 1;
    }
    else
#endif
	setuid(uid);

    if (!setid) {
	rb_loaderror("not setuid/setgid -- %s", fptr->path);
    }
}

In This Thread

Prev Next