文章目录
- 信息泄露
- 漏洞利用
- 漏洞分析
- 漏洞修复
- RCE
- 漏洞分析
- 参考文章
信息泄露
漏洞利用
如果MinIO以集群方式部署,存在信息泄露漏洞,攻击者可以通过HTTP请求获取目标进程的所有环境变量,包括MINIO_SECRET_KEY
和MINIO_ROOT_PASSWORD
.
vulhub有环境可以复现
payload:
POST: /minio/bootstrap/v1/verify
拿到预存的用户名和密码可以直接登录了
漏洞分析
根据main.go中的加载模块得知代码逻辑在minio/cmd中
package main // import "github.com/minio/minio"
import (
"os"
// MUST be first import.
_ "github.com/minio/minio/internal/init"
minio "github.com/minio/minio/cmd"
)
func main() {
minio.Main(os.Args)
}
漏洞代码在minio/cmd/bootstrap-peer-server.go
接受HTTP请求的方法只有两个
line133,代码新建上下文对象,用于传递HTTP请求和响应。 line135,用于输出错误日志。 line134作为则是获取服务器系统配置。
跟进line134的getServerSystemCfg()
在getServerSystemCfg()方法中获取所有以MINIO_
开头的环境变量
将环境变量存储在envValues里面,其中envValues采用遍历的方式获取了skipEnvs[envK]的value
然后,函数返回一个名为ServerSystemConfig
的结构体,其中包含了全局变量和环境变量。
跟进skipEnvs
包含一些敏感信息,有预先设置的密码MINIO_CERT_PASSWD
bootstrap-peer-server.go也定义了Verify的路由
cmd/routers.go:75 判断了一下是集群才会注册上述路由
漏洞修复
环境变量进行了加密处理
https://github.com/minio/minio/commit/3b5dbf90468b874e99253d241d16d175c2454077?diff=split
RCE
漏洞分析
当通过信息泄漏获得账号密码之后,可以登陆MinIO更新恶意升级URL,并且执行update触发RCE
验证管理员权限→获取最新版本→获取最新版本的sha256sum信息→下载并验证sha256sum→验证无误后替换自身并重启。
cmd/admin-handlers.go ,ServerUpdateHandler函数
在/minio/admin/v3/update?updateURL={updateURL}
这个路由的功能中,可以从远程加载二进制文件,下载并更新。
func (a adminAPIHandlers) ServerUpdateHandler(w http.ResponseWriter, r *http.Request) {
// 验证是否是admin权限
objectAPI, _ := validateAdminReq(ctx, w, r, iampolicy.ServerUpdateAdminAction)
// 从POST /minio/admin/v3/update?updateURL={updateURL}取updateURL参数
vars := mux.Vars(r)
updateURL := vars["updateURL"]
mode := getMinioMode()
// 解析url
u, err := url.Parse(updateURL)
// 下载Release信息并解析出对应的更新信息
content, err := downloadReleaseURL(u, updateTimeout, mode)
sha256Sum, lrTime, releaseInfo, err := parseReleaseData(content)
// 指定二进制文件的下载路径
u.Path = path.Dir(u.Path) + SlashSeparator + releaseInfo
// 下载二进制文件
reader, err := downloadBinary(u, mode)
// 验证签名
err = verifyBinary(u, sha256Sum, releaseInfo, mode, reader)
// 提交二进制文件
err = commitBinary()
// 发送重启信号给channel
globalServiceSignalCh <- serviceRestart
}
验证签名用的verifyBinary()
,跟进后是
由于envMinisignPubKey为空,所以sha256sum失效了。所以我们可以构造恶意升级包,最终形成RCE
具体利用可以参考https://github.com/AbelChe/evil_minio
参考文章
https://www.gksec.com/MinIO_RCE.html
https://y4er.com/posts/minio-cve-2023-28432/
https://ek1ng.com/CVE-2023-28432.html