CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

admin 2022年5月16日20:16:421 97 views字数 4209阅读14分1秒阅读模式

漏洞描述

在2.13.1版本之前的APache APISIX中,攻击者可以通过向受 jwt-auth 插件保护的路由发送不正确的 JSON Web 令牌来通过错误消息响应获取插件配置的机密。依赖库 lua-resty-jwt 中的错误逻辑允许将 RS256 令牌发送到需要 HS256 令牌的端点,错误响应中包含原始密钥值。

漏洞版本

Apache Apisix < 2.13.1

环境搭建

搭建方式 如何构建 Apache APISIX(https://apisix.apache.org/zh/docs/apisix/2.12/how-to-build/)

Docker 搭建(https://hub.docker.com/r/apache/apisix)

插件开启

命令行方式开启插件 jwt-auth(https://apisix.apache.org/zh/docs/apisix/2.12/plugins/jwt-auth/)

在这里给大家演示的是Dashboard页面开启jwt插件。

1、当我们环境搭建完毕后、通过访问http://127.0.0.1:9000 登陆页 默认账号密码 admin admin

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


jwt-auth 是一个认证插件,它需要与 consumer 一起配合才能工作。
添加 JWT Authentication 到一个 service 或 route。然后 consumer 将其密钥添加到查询字符串参数、请求头或 cookie 中以验证其请求。

2、我们先创建一个consumer 名称的话 随便写。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

3、点击下一步、启用jwt-auth插件。


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


将{ "key": "Vul_test", "secret": "admin_admin" } 填写到编辑器里,值的话可以随便写。


算法的默认配置是HS256 。


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


4、接下来让我们创建路由。


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


5、在设置路由这项里、名称需要添加、路径需要添加。路径的话、因为后面需要用、可以写个简单易记的。接着点击下一步。


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

6、在设置上游服务里,只需要修改目标节点就行(有配置上游服务的不用写)。然后点击下一步


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


7、在插件配置里,只需启用jwt-auth ,不需要配置。然后点击提交下一步。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


8、最后将全部配置进行提交,点开路由,有我们新增路由表示创建成功。


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏



9、为了保险起见我们通过命令行测试一下。
当我们启用了jwt-auth插件后,会增加 /apisix/plugin/jwt/sign 这个接口。
在命令行输入以下命令,参数key的值就是我们刚刚在consumer 配置的key值,访问了这个api,我们可以获取到认证token。

curl http://127.0.0.1:9080/apisix/plugin/jwt/sign?key=Vul_test -i

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


然后再使用我们获取到的token值,尝试进行请求。返回的502,就可以做下一步的漏洞测试了。

注意:路由地址是我们在上面配置好的。token 是上一步请求回来的,将jwt参数值修改为获取到的token。

在官网中有三种认证方式:

  • 在url参数中;

  • 在头部信息的cookie中;

  • 请求头Authorization 中。

这里参与的是在参数中

curl http://127.0.0.1:9080/Vul_test?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJWdWxfdGVzdCIsImV4cCI6MTY1MDk1NTEzM30.JEzqCqEFe0M1MVLioRRWHl2yuxrpN3rL29rpR7N6UOI -i

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

到此为止,整个环境就搭建完毕了。下面有些关于json web token的知识,可以了解了解。

什么是 JSON Web 令牌?

JSON Web Token (JWT) 是一种开放标准 (RFC 7519),它定义了一种紧凑且独立的方式,用于将信息作为 JSON 对象在各方之间安全地传输。此信息可以进行验证和信任,因为它是经过数字签名的。JWT 可以使用密钥(使用 HMAC 算法)或使用 RSA 或 ECDSA 的公钥/私钥对进行签名。

JWT 获取 及访问 API 或资源流出:

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


  1. 应用程序或客户端请求对授权服务器进行授权。这是通过不同的授权流之一执行的。例如,典型的 OpenID Connect 兼容 Web 应用程序将使用授权代码流通过终结点。/oauth/authorize

  2. 授予授权后,授权服务器将向应用程序返回访问令牌。

  3. 应用程序使用访问令牌访问受保护的资源(如 API)。

JSON Web 令牌的使用

授权:这是使用 JWT 的最常见方案。
信息交换:JSON Web令牌在各方之间安全传输信息。

JSON Web 令牌格式

三部分组成
Header Payload Signature

通常如下所示:
header.payload.Signature

Header 是由 令牌类型(jwt) 和签名算法组成(HS256) ,格式是JSON,会进行Base64Url 编码

Payload 是由注册声明、公共声明组成、私人声明组成,格式是JSON,会进行Base64Url 编码

Signature 是签名部分、创建签名部分,您必须获取编码的Header、编码的Payload、中指定的算法,并对其进行签名。

例如,如果要使用 HMAC SHA256 算法,将按以下方式创建签名:
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
secret)

最后输出的部分是三个Base64-URL字符串 由点分割。
下面显示了一个 JWT,它具有编码的Header和Payload,并使用密钥对其进行签名。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


漏洞复现

通过diff记录,可以看到漏洞不复杂,是在返回的message中将报错输出,输出的内容包含敏感数据。在漏洞描述中已经讲明白了,依赖库 lua-resty-jwt 中的错误逻辑允许将 RS256 令牌发送到需要 HS256 令牌的端点,错误响应中包含原始密钥值。
看了描述,下一步就是构建RS256令牌、然后发送到接受HS256令牌的路由上。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

开始构建RS256令牌。与HS256有些区别。在构建的时候需要一组私钥、公钥。

RS256令牌构建

JSON Web Tokens 网站中有个Debugger 可以帮助我们去快速构建。
我们需要填写三个部分、Header Payload VERIFY SIGNATURE

1、先将 Algorithm 修改为RS256

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏



2、Header 可以保持不变。

3、Payload 填写:{ "key": "Vul_test" } 。此时的key值是我们在注册 consumer 填写的key值。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


4、VERIFY SIGNATURE 公钥、私钥不用改,可以使用。

5、最后在左边文本框里会帮我们自动生成 RS256令牌。前提是格式不能错,前两部分都是JSON格式。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


OK!准备完毕。
还记得我们上边的token测试嘛,将jwt的参数换成获取到的RS256令牌。

curl http://127.0.0.1:9080/Vul_test?jwt=eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJWdWxfdGVzdCJ9.Q-psC9EqmVdjSSQW4gjNl_pcBt_vKoQbWz6j_YI-yHXOurShJIkceShVSHU2XZfH1E5g5pwOQ_JizDC_mp95_3FTv6j6ECcRdUOsXrMP8L5CJhNJhNh-UddrpBfep4WWn-bZsJV2mYyp4fLAXwMVH2JsOPRi9nkuR4_F8ZJzU-2KwrIRBDGo8NsgVpYhuQcjIDRBOmKloBzqdPKXbVPFetkDgqJgN0jLSuYV7mKJSN2R6XLF62gtZilf03pIf9UQFs7XE5kY2H4BSOBIZlD3ET6pvpo1PJRVmvxBU9_y7DfMkUzkq9S3gihsabHGuybKOUbQ_GqOGv_knule8wTimg -i

命令行发起请求。命令行发起请求。在messages信息中能够获取到我们刚开始在 consumer 插件配置中填写的 secret

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

浅析

/apisix/plugins/jwt-auth.lua#_M.rewrite() 判断 令牌、及令牌的 Header、Payload、user-key。未通过会返回401及message信息。可以看到有两个会输出报错信息:一个是判断token、一个是判断secret。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


我构建了很多RS256令牌,Payload的配置各种尝试更改。在看源码的时候,考虑绕过各种固定报错信息,才能够往下走。
有一个错误一直不理解,Invalid user key in JWT token 。尝试修改Key值。

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


在分析CVE描述的时候认为从该漏洞中泄漏的是Key值,然而实际是 secret值。

缓解措施:

官方通告及修复方案
1.升级到2.13.1及以上版本

2.在Apache APISIX上应用以下补丁并重建:

这将使此错误消息不再包含敏感信息,并向调用方返回一个固定的错误消息。

对于当前的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.根据上面的提交手动修改您正在使用的版本,并重新构建它以规避漏洞。

参考材料

Apisix jwt-auth 插件开启
jwt介绍

来源:先知(https://xz.aliyun.com/t/11283)

注:如有侵权请联系删除



CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏


船山院士网络安全团队长期招募学员,零基础上课,终生学习,知识更新,学习不停!包就业,护网,实习,加入团队,外包项目等机会,月薪10K起步,互相信任是前提,一起努力是必须,成就高薪是目标!相信我们的努力你可以看到!想学习的学员,加下面小浪队长的微信咨询!


CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

欢迎大家加群一起讨论学习和交流

CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

快乐要懂得分享,

才能加倍的快乐。

原文始发于微信公众号(衡阳信安):CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年5月16日20:16:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2022-29266 Apache Apisix jwt-auth插件密钥泄漏http://cn-sec.com/archives/1011857.html
评论  1  访客  1
    • pepsi 0

      "当我们启用了jwt-auth插件后,会增加 /apisix/plugin/jwt/sign 这个接口。",这个接口能直接访问吗,404了

    发表评论

    匿名网友 填写信息