[前][次][番号順一覧][スレッド一覧]

ruby-changes:41078

From: nagachika <ko1@a...>
Date: Wed, 16 Dec 2015 21:08:57 +0900 (JST)
Subject: [ruby-changes:41078] nagachika:r53153 (trunk): * ext/fiddle/handle.c: check tainted string arguments.

nagachika	2015-12-16 21:08:49 +0900 (Wed, 16 Dec 2015)

  New Revision: 53153

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=53153

  Log:
    * ext/fiddle/handle.c: check tainted string arguments.
      Patch provided by tenderlove and nobu.
    
    * test/fiddle/test_handle.rb (class TestHandle): add test for above.

  Modified files:
    trunk/ChangeLog
    trunk/ext/fiddle/handle.c
    trunk/test/fiddle/test_handle.rb
Index: ChangeLog
===================================================================
--- ChangeLog	(revision 53152)
+++ ChangeLog	(revision 53153)
@@ -1,3 +1,11 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1
+Wed Dec 16 20:32:43 2015  CHIKANAGA Tomoyuki  <nagachika@r...>
+
+	* ext/fiddle/handle.c: check tainted string arguments.
+	  Patch provided by tenderlove and nobu.
+
+	* test/fiddle/test_handle.rb (class TestHandle): add test for above.
+
+
 Wed Dec 16 19:30:56 2015  Shugo Maeda  <shugo@r...>
 
 	* vm.c (vm_make_proc_from_block): should convert a Symbol to a Proc.
Index: ext/fiddle/handle.c
===================================================================
--- ext/fiddle/handle.c	(revision 53152)
+++ ext/fiddle/handle.c	(revision 53153)
@@ -1,6 +1,8 @@ https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L1
 #include <ruby.h>
 #include <fiddle.h>
 
+#define SafeStringValueCStr(v) (rb_check_safe_obj(rb_string_value(&v)), StringValueCStr(v))
+
 VALUE rb_cHandle;
 
 struct dl_handle {
@@ -143,11 +145,11 @@ rb_fiddle_handle_initialize(int argc, VA https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L145
 	cflag = RTLD_LAZY | RTLD_GLOBAL;
 	break;
       case 1:
-	clib = NIL_P(lib) ? NULL : StringValuePtr(lib);
+	clib = NIL_P(lib) ? NULL : SafeStringValueCStr(lib);
 	cflag = RTLD_LAZY | RTLD_GLOBAL;
 	break;
       case 2:
-	clib = NIL_P(lib) ? NULL : StringValuePtr(lib);
+	clib = NIL_P(lib) ? NULL : SafeStringValueCStr(lib);
 	cflag = NUM2INT(flag);
 	break;
       default:
@@ -262,7 +264,7 @@ rb_fiddle_handle_to_i(VALUE self) https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L264
     return PTR2NUM(fiddle_handle);
 }
 
-static VALUE fiddle_handle_sym(void *handle, const char *symbol);
+static VALUE fiddle_handle_sym(void *handle, VALUE symbol);
 
 /*
  * Document-method: sym
@@ -281,7 +283,7 @@ rb_fiddle_handle_sym(VALUE self, VALUE s https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L283
 	rb_raise(rb_eFiddleError, "closed handle");
     }
 
-    return fiddle_handle_sym(fiddle_handle->ptr, StringValueCStr(sym));
+    return fiddle_handle_sym(fiddle_handle->ptr, sym);
 }
 
 #ifndef RTLD_NEXT
@@ -304,11 +306,11 @@ rb_fiddle_handle_sym(VALUE self, VALUE s https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L306
 static VALUE
 rb_fiddle_handle_s_sym(VALUE self, VALUE sym)
 {
-    return fiddle_handle_sym(RTLD_NEXT, StringValueCStr(sym));
+    return fiddle_handle_sym(RTLD_NEXT, sym);
 }
 
 static VALUE
-fiddle_handle_sym(void *handle, const char *name)
+fiddle_handle_sym(void *handle, VALUE symbol)
 {
 #if defined(HAVE_DLERROR)
     const char *err;
@@ -317,6 +319,7 @@ fiddle_handle_sym(void *handle, const ch https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L319
 # define CHECK_DLERROR
 #endif
     void (*func)();
+    const char *name = SafeStringValueCStr(symbol);
 
 #ifdef HAVE_DLERROR
     dlerror();
@@ -365,7 +368,7 @@ fiddle_handle_sym(void *handle, const ch https://github.com/ruby/ruby/blob/trunk/ext/fiddle/handle.c#L368
     }
 #endif
     if( !func ){
-	rb_raise(rb_eFiddleError, "unknown symbol \"%s\"", name);
+	rb_raise(rb_eFiddleError, "unknown symbol \"%"PRIsVALUE"\"", symbol);
     }
 
     return PTR2NUM(func);
Index: test/fiddle/test_handle.rb
===================================================================
--- test/fiddle/test_handle.rb	(revision 53152)
+++ test/fiddle/test_handle.rb	(revision 53153)
@@ -10,6 +10,23 @@ module Fiddle https://github.com/ruby/ruby/blob/trunk/test/fiddle/test_handle.rb#L10
 
     include Test::Unit::Assertions
 
+    def test_safe_handle_open
+      t = Thread.new do
+        $SAFE = 1
+        Fiddle::Handle.new(LIBC_SO.taint)
+      end
+      assert_raise(SecurityError) { t.value }
+    end
+
+    def test_safe_function_lookup
+      t = Thread.new do
+        h = Fiddle::Handle.new(LIBC_SO)
+        $SAFE = 1
+        h["qsort".taint]
+      end
+      assert_raise(SecurityError) { t.value }
+    end
+
     def test_to_i
       handle = Fiddle::Handle.new(LIBC_SO)
       assert_kind_of Integer, handle.to_i

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]