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头部/签名限制的后续快照不受影响。
概念验证
本地演示(请勿针对第三方系统运行):
|
|
环境要求: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 KBMAX_SIGNATURE_SEGMENT_BYTES = 256 KB
在authlib/jose/util.extract_segment和_extract_signature中强制执行限制。
立即部署修补后的版本。
深度防御
- 在代理或WAF层拒绝超过几KB的JWS/JWT输入
- 对验证端点进行速率限制
临时解决方案
- 在将令牌交给Authlib之前强制执行输入大小限制
- 使用应用程序级限制来降低放大风险
资源链接
- 演示脚本:
jws_segment_dos_demo.py - 测试:
authlib/tests/dos/test_jose_dos.py - OWASP JWT备忘单(DoS指南)
- 参考链接:
- GHSA-pq5p-34cr-23v9
- authlib/authlib@867e3f8
- https://nvd.nist.gov/vuln/detail/CVE-2025-61920
安全弱点
- CWE-20:不当的输入验证
- CWE-400:不受控制的资源消耗
- CWE-770:无限制或节流的资源分配
标识信息
- CVE ID: CVE-2025-61920
- GHSA ID: GHSA-pq5p-34cr-23v9
- 源代码: authlib/authlib
报告者: AL-Cybision