内容提要
Django发布安全更新,修复多个漏洞:空间查询允许str和dict类型导致潜在远程代码执行;check_for_language()存在拒绝服务风险;GEOSGeometry处理深层嵌套对象可致崩溃;URLField未验证链接安全性。建议用户尽快升级至6.0.8或5.2.17版本。
延伸解读
升级优先级与影响范围
本次安全更新覆盖Django 6.0.8和5.2.17,修复了四个安全问题,其中空间查询漏洞被评定为“高”严重性,可能导致远程代码执行。该漏洞影响所有包含空间字段的模型,且管理员后台的普通员工用户(具有查看权限)即可触发,因此升级优先级较高。其他问题严重性为“低”或“中等”,但建议所有用户尽快升级,尤其是使用空间功能的项目。
空间查询的向后不兼容变更
修复空间查询漏洞时,Django不再允许在空间查找中直接传递str和dict类型的栅格值,这是一项向后不兼容的变更。开发者需要调整代码,在传入前验证用户输入,或参考官方文档中的栅格安全注意事项。模型字段赋值不受影响,仍接受这些类型,但查询时需注意。
拒绝服务攻击的缓解措施
check_for_language()函数因语言代码过长可能导致内存消耗,现限制语言代码长度不超过500字符。GEOSGeometry处理深层嵌套的GEOMETRYCOLLECTION对象时可能崩溃,现强制限制最大深度和总数为198,并可通过新增的max_geom_collections参数自定义。这些限制有助于防止恶意输入导致的拒绝服务。
URLField链接安全验证
管理员后台渲染URLField值时,现在会先通过URLValidator验证链接安全性,若验证失败则显示为纯文本,避免使用危险协议(如javascript:)的链接被点击。这降低了存储型XSS风险,但开发者仍应确保输入数据的合法性。
Q&A
Django 6.0.8和5.2.17修复了哪些安全漏洞?
修复了四个安全漏洞:空间查询允许str和dict类型导致潜在远程代码执行;check_for_language()存在拒绝服务风险;GEOSGeometry处理深层嵌套对象可致崩溃;URLField未验证链接安全性。
Django空间查询漏洞的严重程度和影响是什么?
该漏洞严重程度为“高”。攻击者可能通过传递str或dict类型的栅格值给GDALRaster,导致写入文件(可能远程代码执行)或发起网络请求。管理员用户可通过ModelAdmin.lookup_allowed()利用此漏洞。
如何缓解Django空间查询漏洞?
升级到Django 6.0.8或5.2.17版本,这些版本已禁止在空间查询中使用str和dict类型。同时,建议对所有不受信任的用户输入进行验证。
Django check_for_language()拒绝服务漏洞是如何被利用的?
攻击者通过向django.views.i18n.set_language()视图发送大量不同的超长语言代码,这些代码被用作内存缓存键,消耗进程内存,可能导致拒绝服务。该漏洞严重程度为“低”。
Django如何修复check_for_language()拒绝服务漏洞?
修复方法是拒绝长度超过500个字符的语言代码,在缓存查找之前进行拦截,从而限制内存消耗。
GEOSGeometry漏洞的触发条件和影响是什么?
当提供深度嵌套的GEOMETRYCOLLECTION对象时,可能导致GEOS分段错误,造成拒绝服务。影响空间字段查询和GeometryField表单字段。严重程度为“中等”。
如何自定义GEOSGeometry的嵌套限制?
可以通过新的max_geom_collections参数自定义限制,该参数可用于GEOSGeometry、表单字段和模型字段。默认限制为198个GEOMETRYCOLLECTION。
URLField漏洞的具体表现是什么?
管理员界面将URLField值渲染为可点击链接,但未验证URL安全性,可能导致存储的危险scheme被渲染为链接。修复后,URLField值会通过URLValidator验证,验证失败则显示为纯文本。
Django安全更新是否包含向后不兼容的更改?
是的,空间查询漏洞的修复是向后不兼容的更改,因为现在禁止在空间查询中使用str和dict类型。但模型字段赋值不受影响,仍接受这些类型。