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 |
实测中不加”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( |
其中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