MinIO信息泄露(CVE-2023-28432)复现与原理分析
2023-03-24 13:44:00

0x00、前言

MinIO信息泄露(CVE-2023-28432)复现与分析

0x01、MinIO描述

MinIO是一个用Golang开发的基于Apache License v2.0开源协议的对象存储服务。

0x02、漏洞描述

MinIO 存在信息泄露漏洞,在集群部署的MinIO中,未经身份认证的远程攻击者通过发送特殊HTTP请求即可获取所有环境变量,其中包括MINIO_SECRET_KEY和MINIO_ROOT_PASSWORD,造成敏感信息泄露,最终可能导致攻击者以管理员身份登录MinIO。

0x03、漏洞范围

RELEASE.2019-12-17T23-16-33Z <= MinIO < RELEASE.2023-03-20T20-16-18Z
(注:漏洞存在于分布式集群配置情况下的MinIO组件,独立MinIO不受影响)

0x04、复现

POST /minio/bootstrap/v1/verify
host: ip
Content-Type: application/x-www-form-urlencoded

实测中不加”Content-Type”字段也能返回数据

0x05、分析

根据官方修复代码段进行简述分析
问题出在cmd/bootstrap-peer-server.go文件
声明的bootstrap相关常量信息

入口在调用该文件的registerBootstrapRESTHandlers方法

其中server是bootstrapRESTServer属性

server := &bootstrapRESTServer{}

然后的subrouter是路由前缀,指向地址bootstrapRESTPrefix也就是上面常量(minioReservedBucketPath + “/bootstrap”)即路径:minio/bootstrap

subrouter := router.PathPrefix(bootstrapRESTPrefix).Subrouter()

最后调用,方法类型为post,路径(bootstrapRESTVersionPrefix + bootstrapRESTMethodVerify)即上面的常量组合起来的路径(v1/verify),然后调用VerifyHandler

subrouter.Methods(http.MethodPost).Path(bootstrapRESTVersionPrefix + bootstrapRESTMethodVerify).HandlerFunc(
httpTraceHdrs(server.VerifyHandler))

其中ctx为获取的包含请求、响应和其他的上下文信息

ctx := newContext(r, w, "VerifyHandler")

然后获取系统配置信息

cfg := getServerSystemCfg()

这里获取环境变量列表中前缀为”MINIO_”的数据,但遇到skipEnvs[]数组中的变量名则跳过

也就是图中红色区域的环境变量名字,将不存储在列表中(目的是这些变量的值内容不会输出出来,因此更新后加了绿色区域的一些环境变量,也让其不输出)

获取后系统配置信息,调用logger.LogIf方法,其中会将ctx获取的上下文请求进行写入http响应体中,响应内容则为cfg即系统配置变量的值内容

因此在POST请求/minio/bootstrap/v1/verify路径时,会返回系统配置信息

其中不包括下列跳过的配置内容

至此结束,实际就是接口的未授权访问,返回了系统配置信息

0x06、修复

目前官方已发布安全修复版本,受影响用户可以升级到RELEASE.2023-03-20T20-16-18Z及以上版本。

https://github.com/minio/minio/releases/tag/RELEASE.2023-03-20T20-16-18Z

修复方式:

  • 添加了请求方法storageServerRequestValidate()进行请求黑名单匹配,匹配到则将错误写入响应日志并返回,不会进入logger.LogIf方法中写入http响应的阶段。

  • 添加环境变量过滤,将更多的敏感系统配置信息进行跳过不显示

0x07、参考链接

https://github.com/minio/minio/security/advisories/GHSA-6xvq-wj2x-3h3q
https://mp.weixin.qq.com/s/0rOObnlqoJY7KJSRnhNJuA