[#53072] [ruby-trunk - Feature #7994][Open] Make iterators pass an implicit named parameter `iteration` to the executed block — "alexeymuranov (Alexey Muranov)" <redmine@...>

10 messages 2013/03/01

[#53097] [ruby-trunk - Bug #8000][Open] "require 'tk'" segfaults on 64-bit linux with Tk 8.6 — "edmccard (Ed McCardell)" <edmccard@...>

25 messages 2013/03/02

[#53137] [ruby-trunk - Bug #8017][Open] Got segmentation fault on attempt to install ruby 2.0.0-p0 on Mac 10.6.8 via RVM — "adantel (Alex Filatau)" <filatau@...>

9 messages 2013/03/05

[#53168] [ruby-trunk - Bug #8034][Open] File.expand_path('something', '~') do not include home path — "rap-kasta (Pavel Manylov)" <rapkasta@...>

12 messages 2013/03/06

[#53199] [ruby-trunk - Bug #8040][Open] Unexpect behavior when using keyword arguments — "pabloh (Pablo Herrero)" <pablodherrero@...>

11 messages 2013/03/07

[#53203] [ruby-trunk - Feature #8042][Open] Add Addrinfo#socket to create a socket that is not connected or bound — "drbrain (Eric Hodel)" <drbrain@...7.net>

12 messages 2013/03/07

[#53248] Github commit log should not be used as references on redmine — Marc-Andre Lafortune <ruby-core-mailing-list@...>

Github commit log should not be used as references on redmine. E.g:

10 messages 2013/03/09

[#53386] [CommonRuby - Feature #8088][Open] Method#parameters (and friends) should provide useful information about core methods — "headius (Charles Nutter)" <headius@...>

14 messages 2013/03/13

[#53412] [CommonRuby - Feature #8096][Open] introduce Time.current_timestamp — "vipulnsward (Vipul Amler)" <vipulnsward@...>

34 messages 2013/03/14

[#53439] [ruby-trunk - Bug #8100][Open] Segfault in ruby-2.0.0p0 — "judofyr (Magnus Holm)" <judofyr@...>

22 messages 2013/03/15

[#53478] [ruby-trunk - Feature #8107][Open] [patch] runtime flag to track object allocation metadata — "tmm1 (Aman Gupta)" <ruby@...1.net>

20 messages 2013/03/16

[#53498] [ruby-trunk - Feature #8110][Open] Regex methods not changing global variables — "prijutme4ty (Ilya Vorontsov)" <prijutme4ty@...>

21 messages 2013/03/18

[#53502] [ruby-trunk - Bug #8115][Open] make install DESTDIR=/my/install/path fails — "vo.x (Vit Ondruch)" <v.ondruch@...>

11 messages 2013/03/18

[#53688] [ruby-trunk - Feature #8158][Open] lightweight structure for loaded features index — "funny_falcon (Yura Sokolov)" <funny.falcon@...>

27 messages 2013/03/24

[#53692] [ruby-trunk - Bug #8159][Open] Build failure introduced by Rinda changes — "luislavena (Luis Lavena)" <luislavena@...>

22 messages 2013/03/24

[#53733] [ruby-trunk - Bug #8165][Open] Problems with require — "Krugloff (Alexandr Kruglov)" <mr.krugloff@...>

12 messages 2013/03/26

[#53742] [ruby-trunk - Bug #8168][Open] Feature request: support for (single) statement lambda syntax/definition — "garysweaver (Gary Weaver)" <garysweaver@...>

9 messages 2013/03/26

[#53765] [ruby-trunk - Bug #8174][Open] AIX header file conflict with rb_hook_list_struct — "edelsohn (David Edelsohn)" <dje.gcc@...>

11 messages 2013/03/27

[#53808] [ruby-trunk - Feature #8181][Open] New flag for strftime that supports adding ordinal suffixes to numbers — "tkellen (Tyler Kellen)" <tyler@...>

10 messages 2013/03/28

[#53811] [ruby-trunk - Bug #8182][Open] XMLRPC request fails with "Wrong size. Was 31564, should be 1501" — "tsagadar (Marcel Mueller)" <marcel.mueller@...>

28 messages 2013/03/28

[#53849] [ruby-trunk - Feature #8191][Open] Short-hand syntax for duck-typing — "wardrop (Tom Wardrop)" <tom@...>

48 messages 2013/03/31

[#53850] An evaluation of 2.0.0 release — Yusuke Endoh <mame@...>

Let's look back at 2.0.0 release so that we can do better next time.

12 messages 2013/03/31

[ruby-core:53611] Re: Consistent hashing in the face of HashDOS?

From: Martin Bo煬et <martin.bosslet@...>
Date: 2013-03-21 17:50:19 UTC
List: ruby-core #53611
2013/3/21 "Martin J. Dst" <duerst@it.aoyama.ac.jp>

> Hello Charlie,
>
>
> On 2013/03/21 9:03, Charles Oliver Nutter wrote:
>
>> It had to happen eventually...
>>
>> We received a pull request recently for a change that makes JRuby's
>> hashing of Strings, Booleans, nil, and Symbols be consistent.
>> Basically, it provides hardcoded hashes for Booleans and nil, and
>> makes it possible to disable seeded hashes for String and Symbol.
>>
>> PR: https://github.com/jruby/**jruby/pull/590<https://github.com/jruby/jruby/pull/590>
>>
>> My question for ruby-core: at what point did you decide to make hash
>> for e.g. nil not be a single value (it was "4" in 1.8.7 and
>> different/random in 1.9.3+), and why did you do it?
>>
>
> Yui already gave a pointer. Actually, neither NilClass nor TrueClass nor
> FalseClass implement #hash. All three fall back to Object. So do Symbol and
> Fixnum. So it seems to be mainly the result of not doing anything more than
> necessary in terms of implementation against the potential DOS attacks.
>
>
>  I think it's valid to want to be able to consistently hash these
>> values across runtimes, but I want to understand the implications
>> before I merge this patch into JRuby proper.
>>
>> Thoughts?
>>
>
> I can't currently see a security problem with making the hash values of
> nil, true, and false consistent across runtimes. But then that's not a
> guarantee that there are none (I'm not a security expert). And I don't see
> a reason for making only these three stable.
>
> When it comes to Symbols, we get back to the question to what extent
> Symbols may/can/shouldn't be created based on data coming in from the
> outside of an application, which we discussed related to garbage collection
> of symbols.
>
> Overall, having a switch to eliminate introducing randomness into hash
> values may be something to consider. But it will produce problems when an
> application is put together from various libraries: Some of these libraries
> may depend on hashes being stable, while some others may be open to DOS
> attacks when hashes are stable.
>
>

I agree that NilClass, TrueClass and FalseClass are probably not an issue
since they are singletons. The core problem is a user being able to
predictably create different objects that hash to the same value. Symbol,
Fixnum and Bignum fall back to Object/Kernel#hash, and Kernel#hash uses
MurmurHash [1] & [2].

While randomized, Jean-Philippe Aumasson and Daniel Bernstein showed last
year that a randomized MurmurHash isn't enough in general to prevent this
kind of denial of service attacks. The proof of concept can be found at [3]
and in response, SipHash was introduced, replacing MurmurHash in
rb_mem_hash [4].

[1]
https://github.com/ruby/ruby/blob/7e052c7b81d22fe4556e313c1f24ccda15502ab1/object.c#L129
[2]
https://github.com/ruby/ruby/blob/7e052c7b81d22fe4556e313c1f24ccda15502ab1/st.c#L1477
[3] https://github.com/emboss/schadcode/tree/master/ruby/cruby
[4]
https://github.com/ruby/ruby/blob/f7108c5d1a10cacfbb79a0b370c8136bed74af66/random.c#L1422

Off the top of my head I would argue that the same technique cannot be
applied to Kernel#hash. The argument to be hashed is bounded and just a few
bytes long - for the attack to work we would need potentially unbounded
byte arrays.

Of course, the safest thing would probably be switching Kernel#hash to
SipHash, too. I'm not sure to what extent this would affect performance.
Maybe we could follow the JRuby approach - MurmurHash was replaced with
Perl's hash, with the option to switch to SipHash on demand (@headius -
this is correct?). Jean-Philippe confirmed that Perl's hash has not been
broken (yet), but it's not unlikely that this could happen in the future.
Since we already have SipHash in CRuby, it would be relatively easy to do
the same thing, I guess. Another upshot would be that Perl's hash is faster
than MurmurHash, too. What do you think?

So maybe those who need stable hashes should implement #stable_hash
> methods, and if it turns out that this is used often, we can add it to Ruby
> itself.
>
>
I like the idea. It is stated in the docs [5] that nobody should assume the
values to be consistent across VM boundaries, doing otherwise would clearly
violate this contract.

-Martin

[5] http://www.ruby-doc.org/core-2.0/Object.html#method-i-hash

In This Thread

Prev Next