Authlib JOSE组件漏洞解析:拒绝服务攻击与防护方案

本文详细分析Authlib JOSE实现中的安全漏洞CVE-2025-61920,攻击者可通过构造超大JOSE段发起拒绝服务攻击,影响版本≤1.6.3,已发布补丁版本1.6.5修复此问题。

Authlib JOSE组件漏洞:拒绝服务攻击深度分析

漏洞概述

Authlib的JOSE实现存在安全漏洞,接受无限制的JWS/JWT头部和签名段。远程攻击者可以构造一个base64url编码的头部或签名达数百MB的令牌。在验证过程中,Authlib会在拒绝输入之前解码和解析完整内容,导致CPU和内存消耗达到恶意水平,从而实现拒绝服务攻击。

影响评估

  • 攻击向量:未经身份验证的网络攻击者提交恶意JWS/JWT
  • 影响效果:base64解码+大缓冲区的JSON/加密处理会占用CPU并分配大量RAM;单个请求即可耗尽服务容量
  • 观察到的行为:在测试主机上,遗留代码验证500MB头部时消耗约4GB RSS和约9秒CPU时间后才失败
  • 严重程度:高危。CVSS v3.1评分:7.5(AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H)

受影响版本

Authlib ≤ 1.6.3(及更早版本)在验证JWS/JWT令牌时受影响。具有256KB头部/签名限制的后续快照不受影响。

概念验证

本地演示(请勿针对第三方系统运行):

1
python3 jws_segment_dos_demo.py --variant both --sizes "500MB" --fork-per-case

环境要求:Python 3.13.6, Authlib 1.6.4, Linux x86_64, CPUs=8

编译脚本分别打印"[ATTACKER]"(令牌构造)和"[SERVER]"(Authlib验证)RSS增量,以便防御者区分客户端准备和服务器端放大。

回归测试authlib/tests/dos/test_jose_dos.py进一步捕获该问题;保存的original_util.py/original_jws.py重现仍接受恶意负载。

修复方案

主要修复

应用引入解码大小限制的上游补丁:

  • MAX_HEADER_SEGMENT_BYTES = 256 KB
  • MAX_SIGNATURE_SEGMENT_BYTES = 256 KB

authlib/jose/util.extract_segment_extract_signature中强制执行限制。

立即部署修补后的版本。

深度防御

  • 在代理或WAF层拒绝超过几KB的JWS/JWT输入
  • 对验证端点进行速率限制

临时解决方案

  • 在将令牌交给Authlib之前强制执行输入大小限制
  • 使用应用程序级限制来降低放大风险

资源链接

安全弱点

  • CWE-20:不当的输入验证
  • CWE-400:不受控制的资源消耗
  • CWE-770:无限制或节流的资源分配

标识信息

  • CVE ID: CVE-2025-61920
  • GHSA ID: GHSA-pq5p-34cr-23v9
  • 源代码: authlib/authlib

报告者: AL-Cybision

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计