CVE-2021-45232 Unauthorized Access

前几天网上爆出 Apache APISIX Dashboard 存在未授权访问漏洞,我也是在第一时间进行部署复现,但是由于一些原因到现在才写博客。

代码分析

首先打开在线编辑器 https://github.dev/apache/apisix-dashboard/releases/tag/v2.10 定位到路由处理的位置 /api/internal/route.go

factories := []handler.RegisterFactory{
	route.NewHandler,
	ssl.NewHandler,
	consumer.NewHandler,
	upstream.NewHandler,
	service.NewHandler,
	schema.NewHandler,
	schema.NewSchemaHandler,
	healthz.NewHandler,
	authentication.NewHandler,
	global_rule.NewHandler,
	server_info.NewHandler,
	label.NewHandler,
	data_loader.NewHandler,
	data_loader.NewImportHandler,
	tool.NewHandler,
	plugin_config.NewHandler,
	migrate.NewHandler,
	proto.NewHandler,
	stream_route.NewHandler,
}

正常来说,要执行一段路由,会通过 github.com/shiningrush/droplet/wrapper/gin 的 Wrap 函数进行中间件操作,例如一下代码

	r.POST("/apisix/admin/user/login", wgin.Wraps(h.userLogin,
		wrapper.InputType(reflect.TypeOf(LoginInput{}))))

但是出问题的路由中并没有进行鉴权操作,从而导致了未授权漏洞,如下

func (h *Handler) ApplyRoute(r *gin.Engine) {
	r.GET("/apisix/admin/***/*****", h.******)
	r.POST("/apisix/admin/***/*****", h.******)
}

修复

https://github.com/apache/apisix-dashboard/blob/b565f7cd090e9ee2043fbb726fbaae01737f83cd/api/internal/filter/authentication.go