漏洞深度分析 | CVE-2023-36053-Django 表达式拒绝服务

项目介绍

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

猜你喜欢

转载自blog.csdn.net/LJQClqjc/article/details/131637860
今日推荐