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令牌的端点,错误响应中包含原始密钥值。具体表现为:

  1. 当攻击者构造特定的RS256格式JWT令牌发送到配置了jwt-auth插件(使用HS256算法)的路由时
  2. 服务器会返回包含敏感信息(secret)的错误消息
  3. 攻击者可以从错误响应中获取jwt-auth插件配置的密钥

影响版本

  • Apache APISIX < 2.13.1

环境搭建

搭建方式

  1. Docker搭建:推荐使用Docker方式快速搭建测试环境
  2. 手动构建:参考官方文档如何构建Apache APISIX

插件配置步骤

  1. 访问Dashboard页面(http://127.0.0.1:9000),默认账号密码为admin/admin)

  2. 创建consumer:

    • 名称可任意设置
    • 启用jwt-auth插件
    • 配置示例:{ "key": "Vul_test", "secret": "admin_admin" }
    • 算法默认使用HS256
  3. 创建路由:

    • 设置路由名称和路径(建议简单易记)
    • 配置上游服务(目标节点)
    • 启用jwt-auth插件(无需额外配置)
  4. 验证配置:

    • 访问/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

  1. Header

    • 包含令牌类型和签名算法(如HS256或RS256)
    • JSON格式,Base64Url编码
  2. Payload

    • 包含声明(注册声明、公共声明、私人声明)
    • JSON格式,Base64Url编码
  3. Signature

    • 对编码后的header和payload使用指定算法签名
    • 例如HS256签名:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

JWT使用场景

  1. 授权:最常见的使用场景
  2. 信息交换:安全地在各方之间传输信息

漏洞复现

攻击步骤

  1. 构造RS256令牌

    • 使用在线工具(如jwt.io)生成RS256格式JWT
    • Header:{"alg":"RS256","typ":"JWT"}
    • Payload:{"key":"Vul_test"} (key值为consumer配置的key)
    • 使用默认的公钥/私钥对生成签名
  2. 发送恶意请求

    curl "http://127.0.0.1:9080/Vul_test?jwt=<RS256_TOKEN>" -i
    
  3. 获取敏感信息

    • 服务器返回的错误消息中将包含配置的secret值

技术原理分析

漏洞位于/apisix/plugins/jwt-auth.lua#_M.rewrite()函数中:

  1. 函数会验证令牌的Header、Payload和user-key
  2. 验证失败时返回401及包含错误细节的message
  3. 当处理RS256令牌发送到HS256端点时,错误响应会泄露secret值

关键问题点:

  • 错误处理逻辑过于详细,暴露了敏感信息
  • 未对不同类型的JWT算法做适当隔离处理

修复方案

官方修复措施

  1. 升级版本

    • 升级到2.13.1或更高版本
  2. 应用补丁

    • 对于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
  3. 手动修改

    • 根据上述提交手动修改当前使用版本并重新构建

修复效果

修复后:

  • 错误消息不再包含敏感信息
  • 向调用方返回固定的错误消息

参考资源

  1. Apache APISIX官方文档
  2. JWT官方规范(RFC 7519)
  3. 漏洞相关补丁提交记录

备注

测试环境可通过提供的Docker配置快速搭建,解压附件CVE-2022-29266-环境.zip后运行sh脚本即可。

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: 使用获取的token测试路由访问: 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) 使用默认的公钥/私钥对生成签名 发送恶意请求 : 获取敏感信息 : 服务器返回的错误消息中将包含配置的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 手动修改 : 根据上述提交手动修改当前使用版本并重新构建 修复效果 修复后: 错误消息不再包含敏感信息 向调用方返回固定的错误消息 参考资源 Apache APISIX官方文档 JWT官方规范(RFC 7519) 漏洞相关补丁提交记录 备注 测试环境可通过提供的Docker配置快速搭建,解压附件 CVE-2022-29266-环境.zip 后运行sh脚本即可。