Description
Bug report
Bug description:
While working with IPv4Network
objects, @cakekoa and I discovered that hash collisions were common. Below is a small script that shows a few examples of different networks that have hash collisions.
from ipaddress import IPv4Network, IPv6Network
def test_hash_collision(network_1, network_2):
# Shows that the networks are not equivalent.
assert network_1 != network_2
assert network_1.num_addresses != network_2.num_addresses
# Shows a hash collision similar to CVE-2020-14422
assert hash(network_1) == hash(network_2)
test_hash_collision(IPv4Network("192.168.1.255/32"), IPv4Network("192.168.1.0/24"))
test_hash_collision(IPv4Network("172.24.255.0/24"), IPv4Network("172.24.0.0/16"))
test_hash_collision(IPv4Network("192.168.1.87/32"), IPv4Network("192.168.1.86/31"))
test_hash_collision(
IPv4Network("10.0.0.0/8"), IPv6Network("ffff:ffff:ffff:ffff:ffff:ffff:aff:0/112")
)
Upon investigating, we discovered CVE-2020-14422, which fixed a similar (albeit much more severe) hash collision in the IPv4Interface
and IPv6Interface
classes. This CVE was fixed in b98e779.
The implementation of _BaseNetwork.__hash()
looks like this on the main branch:
def __hash__(self):
return hash(int(self.network_address) ^ int(self.netmask))
Based on the fix for CVE-2020-14422, the fix for the _BaseNetwork
class would likely look like:
diff --git a/Lib/ipaddress.py b/Lib/ipaddress.py
index 703fa289dda..d8a84f33264 100644
--- a/Lib/ipaddress.py
+++ b/Lib/ipaddress.py
@@ -729,7 +729,7 @@ def __eq__(self, other):
return NotImplemented
def __hash__(self):
- return hash(int(self.network_address) ^ int(self.netmask))
+ return hash((int(self.network_address), int(self.netmask)))
def __contains__(self, other):
# always false if one is v4 and the other is v6.
As this method produces far fewer collisions than what caused CVE-2020-14422, the security impact is likely negligible. @sethmlarson from the PSRT team has given us the green light to publicly submit a fix.
CPython versions tested on:
3.12
Operating systems tested on:
Linux, macOS
Linked PRs
- gh-134062: Fix hash collisions in IPv4Network and IPv6Network #134063
- [3.14] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134476
- [3.13] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134477
- [3.12] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134478
- [3.11] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134479
- [3.10] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134480
- [3.9] gh-134062: Fix hash collisions in IPv4Network and IPv6Network (GH-134063) #134481