Authlib 因超大JOSE段存在拒绝服务漏洞
漏洞详情
包管理器: pip
受影响包: authlib (pip)
受影响版本: < 1.6.5
已修复版本: 1.6.5
漏洞描述
摘要
Authlib的JOSE实现接受无限制的JWS/JWT头部和签名段。远程攻击者可以构造一个base64url编码的头部或签名段达数百兆字节的令牌。在验证过程中,Authlib会在拒绝输入之前解码和解析完整内容,导致CPU和内存消耗达到恶意水平,从而实现拒绝服务攻击。
影响
- 攻击向量: 未经身份验证的网络攻击者提交恶意JWS/JWT
- 效果: 对大缓冲区进行base64解码+JSON/加密处理会占用CPU并分配大量RAM;单个请求即可耗尽服务容量
- 观察到的行为: 在测试主机上,旧版代码验证500MB头部时消耗约4GB RSS和约9秒CPU时间后才失败
- 严重程度: 高。CVSS v3.1: AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H (7.5)
受影响版本
Authlib ≤ 1.6.3(及更早版本)在验证JWS/JWT令牌时存在此漏洞。具有256KB头部/签名限制的后续快照不受影响。
概念验证
本地演示(请勿针对第三方系统运行):
- 在authlib/目录中下载jws_segment_dos_demo.py PoC
- 运行以下命令:
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层拒绝超过几千字节的JWS/JWT输入
- 对验证端点进行速率限制
临时解决方法
- 在将令牌交给Authlib之前强制执行输入大小限制
- 使用应用程序级限制来降低放大风险
资源
- 演示脚本: jws_segment_dos_demo.py
- 测试: authlib/tests/dos/test_jose_dos.py
- OWASP JWT Cheat Sheet (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(报告者)
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
对网络安全、黑客技术感兴趣的朋友可以关注我的安全公众号(网络安全技术点滴分享)
公众号二维码

公众号二维码
