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

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

文章首发于:

火线Zone社区

背景

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

https://pic1.zhimg.com/80/v2-c83c1ada91359c770e4e358b4bc3c820_1440w.jpgimage.png

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

https://pic4.zhimg.com/80/v2-dcb5dcc21fc8875d71b6f9eac4018fd7_1440w.jpgimage.png

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

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

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

分析

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

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

https://pic1.zhimg.com/80/v2-964c0db8f519fe678b6e3366dd66aed8_1440w.jpgimage.png

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

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

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

https://pic4.zhimg.com/80/v2-619c1488722f0cdf04967cffc805e36f_1440w.jpgimage.png

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

https://pic2.zhimg.com/80/v2-75af1456da7eb158c829cc8c7baee12d_1440w.jpgimage.png
https://pic3.zhimg.com/80/v2-48f62ba8efeea4acb0252ab6aba0dcee_1440w.jpgimage.png

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

02.为什么

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

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

https://pic3.zhimg.com/80/v2-22559c5df672d087a8496b7ac9a70df2_1440w.jpgimage.png

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

https://pic3.zhimg.com/80/v2-78024ce01f07495487c0e726a6f045fe_1440w.jpgimage.png

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

03.怎么修复的?

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

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

https://pic1.zhimg.com/80/v2-57c73849d8e7a5748775549a521273f4_1440w.jpgimage.png

总结

本文只零散地记录一小部分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

相关文章
|
6月前
|
负载均衡 应用服务中间件 API
Nginx、Kong、Apisix、Gateway网关比较
Nginx、Kong、Apisix、Gateway网关比较
1092 1
Nginx、Kong、Apisix、Gateway网关比较
|
6月前
|
资源调度 监控 API
开源API网关APISIX分析与使用
开源API网关APISIX分析与使用
452 0
|
6月前
|
JSON 缓存 应用服务中间件
开源API网关APISIX源码分析(一)
开源API网关APISIX源码分析
264 0
|
5天前
|
监控 负载均衡 API
Apache Apisix轻松打造亿级流量Api网关
Apache APISIX 是一个动态、实时、高性能的 API 网关,提供负载均衡、动态上行、灰度发布、熔断、鉴权、可观测等丰富的流量管理功能。适用于处理传统南北向流量、服务间东西向流量及 k8s 入口控制。Airflow 是一个可编程、调度和监控的工作流平台,基于有向无环图 (DAG) 定义和执行任务,提供丰富的命令行工具和 Web 管理界面,方便系统运维和管理。
Apache Apisix轻松打造亿级流量Api网关
|
8天前
|
监控 网络协议 数据安全/隐私保护
vos3000外呼系统如何检查落地网关配置正常,路由分析
使用VOS3000外呼系统时,确保呼叫畅通的关键在于检查落地网关配置和进行路由分析。具体步骤包括:登录管理界面,检查网关状态和配置,配置外呼规则,测试拨打电话,以及分析日志和报告。通过这些步骤,可以确保系统稳定运行,提高外呼成功率和通话质量。
|
2月前
|
负载均衡 Java 网络架构
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
实现微服务网关:Zuul与Spring Cloud Gateway的比较分析
85 5
|
22天前
|
弹性计算 网络协议 网络安全
内网DNS解析&VPN网关联动实现云上访问云下资源
内网DNS解析&VPN网关联动实现云上访问云下资源
|
6月前
|
安全 网络协议 网络安全
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
【网络连接】ping不通的常见原因+解决方案,如何在只能访问网关时诊断,并修复IP不通的问题
8455 0
|
3月前
|
负载均衡 应用服务中间件 nginx
搭建域名访问环境二(负载均衡到网关)
这篇文章讲述了如何配置Nginx实现域名访问环境,通过负载均衡将请求从Nginx反向代理到服务网关,并提供了详细的配置步骤和测试验证方法。
搭建域名访问环境二(负载均衡到网关)
|
3月前
|
Kubernetes 安全 数据安全/隐私保护
利用服务网格实现全链路mTLS(二):通过出口网关访问外部mTLS服务
阿里云服务网格(Service Mesh,简称ASM)提供了一个全托管式的服务网格平台,兼容Istio开源服务网格,简化服务治理,包括流量管理、服务间通信安全及网格可观测性。ASM出口网关统一管理网格内的出口流量,实现全链路加密通信与精细访问控制。本文介绍如何配置ASM出口网关以管理出口流量并发起mTLS通信,涉及配置ServiceEntry、创建出口网关、设置虚拟服务及目标规则等步骤,最终实现安全可控的mTLS服务访问。
148 3