[Python-Dev] Hashes in Python3.5 for tuples and frozensets

Anthony Flury anthony.flury at btinternet.com
Thu May 17 03:21:03 EDT 2018


Victor,
Thanks for the link, but to be honest it will just confuse people - 
neither the link or the related bpo entries state that the fix is only 
limited to strings. They simply talk about hash randomization - which in 
my opinion implies ALL hash algorithms; which is why I asked the question.

I am not sure how much should be exposed about the scope of security 
fixes but you can understand my (and other's) confusion.

I am aware that applications shouldn't make assumptions about the value 
of any given hash value - apart from some simple assumptions based hash 
value equality (i.e. if two objects have different hash values they 
can't be the same value).

/B//TW : //
//
//This question was prompted by a question on a social media platform 
about the whether hash values are transferable between across platforms. 
Everything I could find stated that after Python 3.3 ALL hash values 
were randomized - but that clearly isn't the case; and the original 
questioner identified that some hash values are randomized and other 
aren't.//
//
//I did suggest strongly to the original questioner that relying on the 
same hash value across different platforms wasn't a clever solution - 
their original plan was to store hash values in a cross system database 
to enable quick retrieval of data (!!!). I did remind the OP that a hash 
value wasn't guaranteed to be unique anyway - and they might come across 
two different values with the same hash - and no way to distinguish 
between them if all they have is the hash. Hopefully their revised 
design will store the key, not the hash./


On 17/05/18 07:38, Victor Stinner wrote:
> Hi,
>
> String hash is randomized, but not the integer hash:
>
> $ python3.5 -c 'print(hash("abc"))'
> -8844814677999896014
> $ python3.5 -c 'print(hash("abc"))'
> -7757160699952389646
>
> $ python3.5 -c 'print(hash(1))'
> 1
> $ python3.5 -c 'print(hash(1))'
> 1
>
> frozenset hash is combined from values of the set. So it's only
> randomized if values hashes are randomized.
>
> The denial of service is more likely to occur with strings as keys,
> than with integers.
>
> See the following link for more information:
> http://python-security.readthedocs.io/vuln/cve-2012-1150_hash_dos.html
>
> Victor
>
> 2018-05-16 17:48 GMT-04:00 Anthony Flury via Python-Dev <python-dev at python.org>:
>> This may be known but I wanted to ask this esteemed body first.
>>
>> I understand that from Python3.3 there was a security fix to ensure that
>> different python processes would generate different hash value for the same
>> input - to prevent denial of service based on crafted hash conflicts.
>>
>> I opened two python REPLs on my Linux 64bit PC and did the following
>>
>> Terminal 1:
>>
>>      >>> hash('Hello World')
>>     -1010252950208276719
>>
>>      >>> hash( frozenset({1,9}) )
>>       -7625378979602737914
>>      >>> hash(frozenset({300,301}))
>>     -8571255922896611313
>>
>>      >>> hash((1,9))
>>     3713081631926832981
>>      >>> hash((875,932))
>>     3712694086932196356
>>
>>
>>
>> Terminal 2:
>>
>>      >>> hash('Hello World')
>>     -8267767374510285039
>>
>>      >>> hash( frozenset({1,9}) )
>>       -7625378979602737914
>>      >>> hash(frozenset({300,301}))
>>     -8571255922896611313
>>
>>      >>> hash((1,9))
>>     3713081631926832981
>>      >>> hash((875,932))
>>     3712694086932196356
>>
>> As can be seen - taking a hash of a string does indeed create a different
>> value between the two processes (as expected).
>>
>> However the frozen set hash, the same in both cases, as is the hash of the
>> tuples - suggesting that the vulnerability resolved in Python 3.3 wasn't
>> resolved across all potentially hashable values. lI even used different
>> large numbers to ensure that the integers weren't being interned.
>>
>> I can imagine that frozensets aren't used frequently as hash keys - but I
>> would think that tuples are regularly used. Since that their hashes are not
>> salted does the vulnerability still exist in some form ?.
>>
>> --
>> --
>> Anthony Flury
>> email : *Anthony.flury at btinternet.com*
>> Twitter : *@TonyFlury <https://twitter.com/TonyFlury/>*
>>
>> _______________________________________________
>> Python-Dev mailing list
>> Python-Dev at python.org
>> https://mail.python.org/mailman/listinfo/python-dev
>> Unsubscribe:
>> https://mail.python.org/mailman/options/python-dev/vstinner%40redhat.com


-- 
-- 
Anthony Flury
email : *Anthony.flury at btinternet.com*
Twitter : *@TonyFlury <https://twitter.com/TonyFlury/>*



More information about the Python-Dev mailing list