项目介绍
Django 是一个高级 Python Web 框架,鼓励快速开发和简洁、务实的设计。它由经验丰富的开发人员构建,解决了 Web 开发的大部分麻烦,因此您可以专注于编写应用程序,而无需重新发明轮子。它是免费且开源的。
项目地址
https://github.com/django/django
https://github.com/django/django/releases/tag/4.2.2
漏洞概述
当处理电子邮件和URL的域名标签数量非常大时,可能会导致正则表达式拒绝服务攻击。这是因为正则表达式的处理时间与输入的长度呈指数关系,如果输入的长度非常大会导致处理时间过长,实现DoS。
影响版本
Django main branch
Django 4.2
Django 4.1
Django 3.2
漏洞分析
根据patch代码分析漏洞点及原理如下:
在URLValidator中,增加了一个max_length属性,其值为2048,用于限制URL的最大长度。如果URL的长度超过这个值,将会抛出一个验证错误。
class URLValidator(RegexValidator):
...
max_length = 2048
...
def __call__(self, value):
if not isinstance(value, str) or len(value) > self.max_length:
raise ValidationError(self.message, code=self.code, params={'value': value})
对于EmailValidator,同样增加了长度的限制。根据RFC 3696的第3节,电子邮件的最大长度为320个字符。如果电子邮件的长度超过这个值,也将抛出一个验证错误。
class EmailValidator:
...
def __call__(self, value):
if not value or '@' not in value or len(value) > 320:
raise ValidationError(self.message, code=self.code, params={'value': value})
在EmailField中,将max_length的默认值设置为320,以符合RFC 3696的规定。
class EmailField(CharField):
...
def __init__(self, **kwargs):
kwargs.setdefault("max_length", 320)
super().__init__(strip=True, **kwargs)
这些修改都是为了限制输入的长度,从而防止正则表达式处理时间过长,避免了ReDoS攻击。
攻击者可以通过提供一个超过长度限制的URL来触发这个漏洞。例如可以提供一个长度超过253个字符的URL。当这个输入被URLValidator处理时,由于正则表达式的处理时间与输入的长度呈指数关系,所以可能会导致处理时间过长实现导致服务拒绝。
修复方式
厂商已发布了漏洞修复程序,请用户尽快更新至安全版本。
版本链接:
https://www.djangoproject.com/weblog/2023/jul/03/security-releases/
修复方式
https://www.djangoproject.com/weblog/2023/jul/03/security-releases/
https://github.com/django/django/commit/b7c5feb35a31799de6e582ad6a5a91a9de74e0f9