joserfc库资源耗尽漏洞深度解析:超大JWT令牌引发的日志风险

本文详细分析了joserfc库(Python JWT处理库)中的一个严重安全漏洞。当攻击者发送超大JWT令牌时,库的异常错误消息会完整记录令牌内容,可能导致Python日志系统处理无限大的数据,从而引发资源耗尽攻击。

漏洞概述

CVE-2025-65015 是一个影响 joserfc Python库的严重安全漏洞。该库是一个用于处理JSON Web Tokens (JWT) 的Python实现。漏洞的核心在于,当joserfc.jwt.decode()操作因JWT头部、声明或签名载荷过大而抛出joserfc.errors.ExceededSizeError异常时,异常消息中会嵌入未解码的完整JWT令牌部分。这可能导致Python日志记录系统或诊断工具(如Sentry)处理包含完整JWT头部或载荷的、极其庞大的日志消息,从而引发资源消耗不受控制的问题。

漏洞详情

问题根源

该漏洞的根本原因在于异常处理机制。在joserfc/_rfc7515/registry.pyjoserfc/_rfc7516/registry.py等文件中,validate_header_sizevalidate_payload_size等方法在检测到大小超标时,会抛出ExceededSizeError异常,并将引发问题的载荷内容(例如header!rpayload!r)直接格式化到异常消息字符串中。

当应用程序配置了日志记录(例如通过logger.exception(...)),这些包含完整、可能非常庞大的JWT载荷的异常消息会被记录。由于此时恶意载荷已完全加载到内存中,库本身无法在此时拒绝或阻止它。

触发场景

此漏洞通常在以下场景中被利用:

  1. 前置Web服务器缺失或配置不当:生产环境中,如果Python Web应用前面没有部署生产级的Web服务器(如nginx)或者服务器配置不当,无法强制限制HTTP请求头部的大小。
  2. 攻击者构造超大令牌:攻击者能够向HTTP请求的头部(如Authorization: Bearer <巨型JWT>)发送任意大的Bearer令牌。
  3. 应用尝试解码:应用使用joserfc.jwt.decode()尝试解码此令牌。
  4. 异常触发与日志记录:库检测到载荷超标,抛出包含完整载荷的异常。如果应用代码或框架捕获并记录此异常,就会将庞大的载荷写入日志。

相关约束与责任

文章指出,joserfc库本身无法安全地处理任意大小的载荷。限制请求头部大小是底层Web服务器或反向代理的责任。例如:

  • Uvicorn/h11:可以通过--h11-max-incomplete-event-size选项限制头部加正文的总大小,但无法单独限制头部大小。
  • vLLM serve:因其依赖于uvicorn/h11且机器学习推理工作负载需要大量数据传输,默认将头部加正文的限制设为4MB,并且经常被调高。
  • 稳健的反向代理(如nginx):通常需要此类代理来明确设置最大头部大小限制。不幸的是,许多Web应用并未在正确的反向代理后运行。

这使得该漏洞非常隐蔽,因为只有当恶意构造的JWT最终到达Python应用时才会触发,这是大多数开发者在日常开发和测试中永远不会遇到的情况。

概念验证

文章提供了一个完整的PoC脚本,演示了漏洞的触发过程:

  1. 环境:Ubuntu 24.04 LTS, Python 3.12, joserfc 1.4.1。
  2. 脚本逻辑
    • 尝试使用一个包含超长alg字段的伪造头部编码JWT(这会失败并抛出UnsupportedAlgorithmError)。
    • 随后,直接使用一个预先生成的、包含超长头部的JWT字符串(LONG_JWT_TOKEN)。
    • 调用jwt.decode()尝试解码这个超大的令牌。
    • 捕获抛出的ExceededSizeError异常,并使用logger.exception()记录。此时,日志中将包含完整的、庞大的JWT头部内容。

执行PoC的输出显示,异常回溯信息中确实包含了完整的、超长的JWT头部Base64编码字符串。

受影响的代码位置

  • joserfc/_rfc7515/registry.py (第102-112行):validate_header_size, validate_payload_size, validate_signature_size 方法。
  • joserfc/_rfc7516/registry.py (第103-123行):validate_protected_header_size, validate_encrypted_key_size, validate_initialization_vector_size, validate_ciphertext_size, validate_auth_tag_size 方法。

这些方法在抛出ExceededSizeError时,都在异常消息中直接格式化了触发问题的载荷内容。

影响与风险

此漏洞可能导致资源分配无限制或节流问题(CWE-770)。在Web应用未拒绝超大HTTP头部载荷的场景下,使用joserfc可能使系统面临以下风险:

  • 对应用主机的影响:消耗大量磁盘空间(日志文件)、内存(处理日志消息)和CPU资源。
  • 对外部系统的影响:影响任何外部日志存储、数据摄取管道或告警服务。

修复与缓解

  • 库修复:应修改joserfc库,在ExceededSizeError异常消息中移除或截断JWT载荷内容。
  • 文档建议:库的文档应建议将其部署在能够正确强制执行最大请求头部大小的稳健Web服务器或反向代理之后。
  • 已修补版本:漏洞在 joserfc 版本 1.3.51.4.2 中已得到修复。

参考链接

  • 安全公告:GHSA-frfh-8v73-gjg4
  • 修复提交:authlib/joserfc@63932f1, authlib/joserfc@673c874
  • 发布版本:https://github.com/authlib/joserfc/releases/tag/1.3.5, https://github.com/authlib/joserfc/releases/tag/1.4.2
  • NVD条目:https://nvd.nist.gov/vuln/detail/CVE-2025-65015
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计