HexBrain

shopify-scripts · Report #181685

Range#initialize_copy null pointer dereference

Validstatus
highseverity
$10,000bounty
9upvotes
17 Dec 2016disclosed

How it was found

Heya!

It's possible to segfault mruby through mruby-engine with the following snippet of code:

Range.remove_method(:initialize_copy)
(1..2).dup.to_s

This can be triggered through mruby-engine like this:

MRubyEngine.new(512*1024, 1000, 1000).sandbox_eval("/tmp", %{
  Range.remove_method(:initialize_copy)
  (1..2).dup.to_s
})

The dup and clone methods allocate a new object and then call initialize_copy on the new object with the old object as an argument to copy over internal state.

Removing Range#initialize_copy makes it possible to construct an uninitialized Range object. Calling (pretty much) any instance method on the uninitialized Range object afterwards causes mruby to dereference a null pointer, leading to a segfault.

I've attached a patch that fixes the bug by copying internal range state before calling initialize_copy, similar to what mruby already does for classes and modules.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original