前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CVE-2021-45232分析(APISIX网关未授权访问)

CVE-2021-45232分析(APISIX网关未授权访问)

原创
作者头像
火线安全
发布2022-03-17 12:18:37
8000
发布2022-03-17 12:18:37
举报
文章被收录于专栏:云安全社区云安全社区

文章首发于:火线Zone社区

作者:leveryd

背景

apisix网关之前出过一个dashboard api未授权访问漏洞 [1]:因为访问下面两个接口不需要身份认证,所以可以利用这两个接口进行rce。

在刚分析这个漏洞时,我有点困惑:

filter目录下的代码看着像是"中间件"(或者叫"过滤器")的实现,而"中间件"应该是所有请求都会经过"中间件"的业务逻辑,那为什么访问上面的两个接口就没有经过filter.AuthenticationMiddleware中间件的认证逻辑呢?为什么访问其他接口就会经过filter.AuthenticationMiddleware中间件的认证逻辑呢?

虽然动态调试下个断点,就能看到函数调用流程,但是我还想知道"路由"和"中间件"从web框架层来看是怎么设计的。

apisix项目用到了gin框架和droplet框架,本文记录我对这两个框架"路由"和"中间件"使用和设计的研究,以解决自己的疑惑。

分析

01.为什么其他接口就会经过filter.AuthenticationMiddleware中间件的逻辑?

"业务代码"可以使用"gin框架提供的Use接口"注册中间件,比如下面这样

从上图中并没有看到filter.AuthenticationMiddleware中间件被注册,那么为什么其他接口就会经过auth中间件的逻辑?

比如GET /apisix/admin/routes HTTP/1.1

答案在droplet库:apisix通过droplet接口注册了filter.AuthenticationMiddleware中间件。

这样当访问/apisix/admin/routes路径时,请求会经过gin框架注册的"中间件"、droplet注册的"中间件"。

有一个不严谨的结论:上面的两张图中,handlers和mws数组中的所有"函数"会被依次调用。

02.为什么

/apisix/admin/migrate/export接口不会经过filter.AuthenticationMiddleware中间件的逻辑?

/apisix/admin/migrate/export路由对应的"处理函数"并不是wgin.Wraps包装的,这样代码流程会不从gin框架转移到droplet框架。

对比可以看到/apisix/admin/routes路由对应的"处理函数"是wgin.Wraps返回的,这样代码流程会从gin框架转移到droplet框架。

小结:gin框架和droplet框架通过wgin.Wraps包装的func(ctx *gin.Context)函数类型连接到了一起。

03.怎么修复的?

从这个commit[2]中可以看到:

  • gin框架中 filter.AuthenticationMiddleware中间件被添加
  • droplet框架中 filter.AuthenticationMiddleware中间件被删除

总结

本文只零散地记录一小部分gin和droplet框架的内部逻辑,对gin路由和中间件实现有兴趣的可以看《gin框架源码解析》[3]这篇文章。

在分析过程中感觉"实现一个web框架"非常需要"接口"或者"函数类型",比如net/http和gin框架的连接、gin框架和droplet框架的连接,都是依靠"接口"或者"函数类型"来通信。

参考链接:

[1]https://apisix.apache.org/zh/blog/2021/12/28/dashboard-cve-2021-45232/

[2]https://github.com/apache/apisix-dashboard/commit/b565f7cd090e9ee2043fbb726fbaae01737f83cd

[3]https://www.liwenzhou.com/posts/Go/read_gin_sourcecode/

[4]漏洞分析:

https://mp.weixin.qq.com/s/WEfuVQkhvM6k-xQH0uyNXg

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • 分析
    • 01.为什么其他接口就会经过filter.AuthenticationMiddleware中间件的逻辑?
      • 02.为什么
        • 03.怎么修复的?
        • 总结
          • 参考链接:
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档