CVE-2022-29266 Apache Apisix jwt-auth插件 密钥泄漏
字数 2111 2025-08-29 08:32:30
Apache APISIX jwt-auth插件密钥泄漏漏洞(CVE-2022-29266)分析报告
漏洞概述
CVE-2022-29266是Apache APISIX中jwt-auth插件存在的一个敏感信息泄露漏洞。在2.13.1版本之前的Apache APISIX中,攻击者可以通过向受jwt-auth插件保护的路由发送不正确的JSON Web令牌(JWT),通过错误消息响应获取插件配置的机密信息。
漏洞详情
漏洞描述
该漏洞源于依赖库lua-resty-jwt中的错误逻辑,允许将RS256令牌发送到需要HS256令牌的端点,错误响应中包含原始密钥值。具体表现为:
- 当攻击者构造特定的RS256格式JWT令牌发送到配置了jwt-auth插件(使用HS256算法)的路由时
- 服务器会返回包含敏感信息(secret)的错误消息
- 攻击者可以从错误响应中获取jwt-auth插件配置的密钥
影响版本
- Apache APISIX < 2.13.1
环境搭建
搭建方式
- Docker搭建:推荐使用Docker方式快速搭建测试环境
- 手动构建:参考官方文档如何构建Apache APISIX
插件配置步骤
-
访问Dashboard页面(http://127.0.0.1:9000),默认账号密码为admin/admin)
-
创建consumer:
- 名称可任意设置
- 启用jwt-auth插件
- 配置示例:
{ "key": "Vul_test", "secret": "admin_admin" } - 算法默认使用HS256
-
创建路由:
- 设置路由名称和路径(建议简单易记)
- 配置上游服务(目标节点)
- 启用jwt-auth插件(无需额外配置)
-
验证配置:
- 访问
/apisix/plugin/jwt/sign接口获取合法token:curl http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=Vul_test -i - 使用获取的token测试路由访问:
curl "http://127.0.0.1:9080/Vul_test?jwt=<TOKEN>" -i
- 访问
JWT基础知识
什么是JSON Web令牌(JWT)
JWT是一种开放标准(RFC 7519),定义了一种紧凑且独立的方式,用于将信息作为JSON对象在各方之间安全传输。特点包括:
- 经过数字签名,可验证和信任
- 可使用密钥(HMAC算法)或公钥/私钥对(RSA/ECDSA)进行签名
JWT结构
由三部分组成,格式为header.payload.signature:
-
Header:
- 包含令牌类型和签名算法(如HS256或RS256)
- JSON格式,Base64Url编码
-
Payload:
- 包含声明(注册声明、公共声明、私人声明)
- JSON格式,Base64Url编码
-
Signature:
- 对编码后的header和payload使用指定算法签名
- 例如HS256签名:
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
JWT使用场景
- 授权:最常见的使用场景
- 信息交换:安全地在各方之间传输信息
漏洞复现
攻击步骤
-
构造RS256令牌:
- 使用在线工具(如jwt.io)生成RS256格式JWT
- Header:
{"alg":"RS256","typ":"JWT"} - Payload:
{"key":"Vul_test"}(key值为consumer配置的key) - 使用默认的公钥/私钥对生成签名
-
发送恶意请求:
curl "http://127.0.0.1:9080/Vul_test?jwt=<RS256_TOKEN>" -i -
获取敏感信息:
- 服务器返回的错误消息中将包含配置的secret值
技术原理分析
漏洞位于/apisix/plugins/jwt-auth.lua#_M.rewrite()函数中:
- 函数会验证令牌的Header、Payload和user-key
- 验证失败时返回401及包含错误细节的message
- 当处理RS256令牌发送到HS256端点时,错误响应会泄露secret值
关键问题点:
- 错误处理逻辑过于详细,暴露了敏感信息
- 未对不同类型的JWT算法做适当隔离处理
修复方案
官方修复措施
-
升级版本:
- 升级到2.13.1或更高版本
-
应用补丁:
- 对于LTS 2.13.x或master分支:
- https://github.com/apache/apisix/pull/6846
- https://github.com/apache/apisix/pull/6847
- https://github.com/apache/apisix/pull/6858
- 对于LTS 2.10.x版本:
- https://github.com/apache/apisix/pull/6847
- https://github.com/apache/apisix/pull/6855
- 对于LTS 2.13.x或master分支:
-
手动修改:
- 根据上述提交手动修改当前使用版本并重新构建
修复效果
修复后:
- 错误消息不再包含敏感信息
- 向调用方返回固定的错误消息
参考资源
- Apache APISIX官方文档
- JWT官方规范(RFC 7519)
- 漏洞相关补丁提交记录
备注
测试环境可通过提供的Docker配置快速搭建,解压附件CVE-2022-29266-环境.zip后运行sh脚本即可。