内容提要
Django发布6.1.3、6.0.10和5.2.19安全版本,修复多个漏洞:MultiPartParser处理base64编码上传时可能耗尽内存;GeometryField日志未转义控制字符,可致日志注入;GeoJSON的CRS引用可触发外部请求或读取文件;缓存键未区分缺失与空值请求头,可能泄露私有数据;部分管理员可见密码哈希;SpatialReference解析字符串时可访问网络或文件。建议尽快升级,并优先使用整数SRID。
延伸解读
升级紧迫性因漏洞等级而异
本次安全版本修复了六个漏洞,严重程度分为低、中两档。其中GeoJSON的CRS引用和SpatialReference字符串解析被定为“中危”,可导致网络请求或文件读取;其余四个为“低危”,涉及内存耗尽、日志注入、缓存键混淆和密码哈希泄露。尽管多数为低危,但缓存键问题可能暴露私有数据,管理员密码哈希泄露也值得警惕,因此官方仍建议所有用户尽快升级。
GeoJSON与SpatialReference的输入信任边界
文章明确区分了可信与不可信输入:GeoJSON的CRS引用在验证、保存或查询路径中会拒绝外部资源,但DataSource和LayerMapping加载可信数据时仍接受这些值。SpatialReference在GDAL 3.9及以上禁用网络和文件访问,但低版本GDAL无法获得完整保护。这意味着使用地理功能的项目需检查GDAL版本,并对不可信输入优先使用整数SRID或允许列表。
缓存键修复的副作用与应对
Vary头缓存键现在区分“缺失”与“空值”,符合RFC 9111。此前为省略Vary头的请求生成的缓存响应将不再匹配,并会在下次请求时重新缓存。这可能导致升级后短暂出现缓存命中率下降或重复回源,但属于预期行为。运维人员应关注缓存层表现,避免误判为故障。
管理员密码哈希泄露的特定条件
该漏洞仅在两种情况下触发:用户模型不是AUTH_USER_MODEL,或AUTH_USER_MODEL通过多表继承从具体父模型继承密码字段。拥有view但无change权限的管理员会看到完整密码哈希。若项目使用自定义用户模型或复杂继承结构,应优先排查此风险,并确认升级后权限展示逻辑已修复。
Q&A
Django 6.1.3、6.0.10 和 5.2.19 修复了哪些安全漏洞?
修复了多个漏洞:MultiPartParser 处理 base64 编码上传时可能耗尽内存;GeometryField 日志未转义控制字符,可致日志注入;GeoJSON 的 CRS 引用可触发外部请求或读取文件;缓存键未区分缺失与空值请求头,可能泄露私有数据;部分管理员可见密码哈希;SpatialReference 解析字符串时可访问网络或文件。
MultiPartParser 的 base64 上传漏洞具体是什么?
使用 django.http.multipartparser.MultiPartParser 时,带有 Content-Transfer-Encoding: base64 的多部分上传会完全缓冲在内存中,无视 FILE_UPLOAD_MAX_MEMORY_SIZE 设置,可能消耗过多内存。该漏洞严重性为低。
GeoJSON 的 CRS 引用漏洞有什么风险?
早期 GeoJSON 规范允许通过 URL 指定坐标参考系统(CRS),GDAL 仍会解析这些 URL。当从用户输入实例化几何体时,攻击者可提交恶意 CRS,使 Django 进程发起网络请求或读取文件。现在空间字段查找、GeometryField 表单字段和 GEOSGeometry 会拒绝带有外部资源 CRS 引用的 GeoJSON 几何体,但 DataSource 和 LayerMapping 工具仍接受这些值。该漏洞严重性为中等。
缓存键漏洞如何导致私有数据泄露?
UpdateCacheMiddleware 和 cache_page() 为省略 Vary 头中列出的请求头的请求与发送该头但值为空的请求生成相同的缓存键。因此,为一个请求缓存的响应可能被提供给另一个请求,导致私有数据暴露。现在缓存键区分缺失和空的头值,符合 RFC 9111#section-4.1。之前为省略 Vary 头的请求缓存的响应将不再匹配,并会在下次请求时重新缓存。该漏洞严重性为低。
SpatialReference 漏洞的修复措施是什么?
SpatialReference 现在在 GDAL 3.9 及更高版本上解析字符串输入时禁用网络和文件访问。因此,不再接受文件路径和 URL 作为 SpatialReference 输入。使用 DICT: 前缀的字典引用(包括带 ESRI:: 前缀的)在所有 GDAL 版本上都被拒绝。完全防护需要 GDAL 3.9 或更高版本。建议优先使用整数 SRID,因为它们在 EPSG 数据库中直接查找;如果必须在较低 GDAL 版本上使用字符串,请与允许列表比较。新的 gis.W001 系统检查会在 GDAL 版本低于 3.9 时发出警告。
管理员密码哈希泄露漏洞在什么情况下发生?
当用户模型不是 AUTH_USER_MODEL,或者 AUTH_USER_MODEL 通过多表继承从具体父模型继承密码字段时,具有用户模型查看权限(但没有更改权限)的管理员用户会看到完整的密码哈希。