Slow IDNA decoding with large strings

IDNA decoding execution time is not linear in relation to the input string size, which can cause slowness with large inputs:

  • 10 chars = 0.016 seconds
  • 100 chars = 0.047 seconds
  • 1000 chars = 2.883 seconds
  • 2500 chars = 17.724 seconds
  • 5000 chars = 1 min 10 seconds

According to Unicode Technical Standard #46, an IDNA label must not be longer than 63 characters. The Python idna module enforces the restriction, but too late.

Dates:

  • Disclosure date: 2022-10-19 (Python issue gh-98433 reported)
  • Reported at: 2022-09-09 (email to PSRT)
  • Reported by: Guido Vranken

Fixed In

Python issue

Slow IDNA decoding with large strings [CVE-2022-45061].

  • Python issue: gh-98433
  • Creation date: 2022-10-19
  • Reporter: guidovranken

CVE-2022-45061

An issue was discovered in Python before 3.11.1. An unnecessary quadratic algorithm exists in one path when processing some inputs to the IDNA (RFC 3490) decoder, such that a crafted, unreasonably long name being presented to the decoder could lead to a CPU denial of service. Hostnames are often supplied by remote servers that could be controlled by a malicious actor; in such a scenario, they could trigger excessive CPU consumption on the client attempting to make use of an attacker-supplied supposed hostname. For example, the attack payload could be placed in the Location header of an HTTP response with status code 302. A fix is planned in 3.11.1, 3.10.9, 3.9.16, 3.8.16, and 3.7.16.

Timeline

Timeline using the disclosure date 2022-10-19 as reference: