[New-bugs-announce] [issue41004] Hash collisions in IPv4Interface and IPv6Interface

martin w report at bugs.python.org
Wed Jun 17 09:11:52 EDT 2020


New submission from martin w <marwenn02 at gmail.com>:

In the ipaddress library there exists two classes IPv4Interface, and IPv6Interface. These classes' hash functions will always return 32 and 64 respectively. If IPv4Interface or IPv6Interface objects then are put in a dictionary, on for example a server storing IPs, this will cause hash collisions, which in turn can lead to DOS.

The root of this is on line 1421 and 2095. On both lines, self._ip and self.network.network_address will both be same, and when xor is applied they will cancel eachother out, leaving return self._prefixlen .
Since self._prefixlen is a constant, 32 and 64 respectively, this will lead to a constant hash.

The fix is trivial, on line 1421, change to:
return hash((self._ip, self._prefixlen, int(self.network.network_address)))

and on line 2095, change to:
return hash((self._ip, self._prefixlen, int(self.network.network_address)))

----------
components: Library (Lib)
messages: 371738
nosy: nnewram
priority: normal
severity: normal
status: open
title: Hash collisions in IPv4Interface and IPv6Interface
versions: Python 3.8

_______________________________________
Python tracker <report at bugs.python.org>
<https://bugs.python.org/issue41004>
_______________________________________


More information about the New-bugs-announce mailing list