内容提要
Django发布6.1.2、6.0.9和5.2.18安全更新,修复多个漏洞:语言代码处理可致拒绝服务(低危);parse_header_parameters()存在二次时间复杂度问题(中危);空间查询接受bytes栅格值可能触发外部请求;模型表单集可被伪造POST数据越权删除或创建实例。建议尽快升级。
延伸解读
语言代码拒绝服务漏洞的触发条件
该漏洞位于django.utils.translation.get_supported_language_variant(),当处理大量不同且超长的语言代码时,这些代码在长度限制前被用作内存缓存键,可能消耗过多进程内存。攻击者可通过发送包含超长语言代码的请求触发。缓解措施是拒绝或截断超过500字符的语言代码。此漏洞被评级为低危,但若应用暴露语言协商接口,仍建议关注。
parse_header_parameters()二次时间复杂度的影响
django.utils.http.parse_header_parameters()在解析引号参数内包含大量分隔符的值时存在二次时间复杂度,可导致拒绝服务。未认证请求可通过Accept或Content-Type等头部到达该解析,例如HttpRequest.accepts()的内容协商。每次调用的长度限制无法约束重复头部的总大小。该函数现已改用Python的email.message.Message解析,可能导致某些畸形头部的解析结果变化,例如缺少编码的RFC 2231值现在会被解码。
空间查询bytes栅格值的安全风险
空间查询此前接受bytes栅格值而无需显式包装为GDALRaster。这些值虽通过GDAL内存虚拟文件系统打开,但可能包含引用外部栅格源的VRT文档,导致GDAL以Django进程用户身份发出网络请求。该问题可能被将攻击者控制的bytes直接传递给空间查询的应用利用,且是CVE-2026-15307修复中的遗漏。缓解措施要求bytes栅格值必须包装为GDALRaster,这是向后不兼容变更;表示有效十六进制几何的字节值仍被接受。
模型表单集伪造POST数据的越权风险
模型表单集错误地允许伪造的POST数据删除限制查询集之外的实例,或通过仅编辑表单集创建实例,前提是模型主键可通过表单设置,例如OneToOneField(或用作内联表单集模型主键的父链接),或表单字段中包含自然键或UUID主键。使用默认BigAutoField主键的模型不受影响。该漏洞由Seonggwon Yoon报告,补丁已应用于main、6.1、6.0和5.2分支。
Q&A
Django 6.1.2、6.0.9 和 5.2.18 安全更新修复了哪些漏洞?
修复了四个漏洞:1) get_supported_language_variant() 处理超长语言代码可致拒绝服务(低危);2) parse_header_parameters() 存在二次时间复杂度问题(中危);3) 空间查询接受 bytes 栅格值可能触发外部请求;4) 模型表单集可被伪造 POST 数据越权删除或创建实例。
Django 的 get_supported_language_variant() 漏洞具体是什么?如何缓解?
该函数在处理大量不同且超长的语言代码时存在拒绝服务风险,因为语言代码在限制长度前被用作内存缓存键,可能消耗过多内存。缓解措施:超过 500 字符的语言代码现在会被拒绝或截断。严重性为低。
parse_header_parameters() 的二次时间复杂度问题如何被利用?
攻击者可通过 Accept 或 Content-Type 等头部,在引号参数内包含大量分隔符,触发二次时间复杂度解析,导致拒绝服务。未认证请求可通过 HttpRequest.accepts() 的内容协商到达该解析。每次调用的长度限制无法约束重复头部的总大小。严重性为中。
空间查询接受 bytes 栅格值会带来什么风险?
bytes 栅格值可能包含引用外部栅格源的 VRT 文档,导致 GDAL 在准备查询时以 Django 进程用户身份发起网络请求。攻击者控制的 bytes 直接传入空间查询可被利用。缓解措施:bytes 栅格值必须先用 GDALRaster 包装,但表示有效十六进制几何的字节值仍被接受。这是向后不兼容的更改。
模型表单集伪造 POST 数据漏洞影响哪些模型?
影响主键可通过表单设置的模型,例如使用 OneToOneField(或作为内联表单集模型主键的父链接)或表单字段中包含自然键或 UUID 主键的模型。使用默认 BigAutoField 主键的模型不受影响。
Django 安全更新后,用户应该怎么做?
建议所有用户尽快升级到 Django 6.1.2、6.0.9 或 5.2.18。补丁已应用于 main、6.1、6.0 和 5.2 分支。潜在安全问题应通过私人邮件报告至 security@djangoproject.com,不要通过 Trac 或论坛。