mcli 20260804 发布
发布日期: 2026-08-04 · 版本: RELEASE.2026-08-04T00-00-00Z
这是 pgsty/mc 社区分支自 20260417 以来的首次发布。本次更新修复了一处调试日志泄密问题,彻底切断了客户端与上游发布渠道之间的所有连接,将容器与软件包完全改由本分支自建,并把打包体系从 MinIO 的 pkger 迁移到标准 nFPM,同时首次为 RPM 包提供 GPG 签名。
上游 minio/mc 仓库已于 2026 年 7 月归档。其最后一个提交 77f82e18 正是本分支的基线,而上游从未发布过包含该提交的版本 —— 因此本次构建比历史上任何官方 mc 二进制都要新。
行为变更
mcli update 自更新功能在本分支中已被禁用。命令本身保留(接受原有参数以维持脚本兼容),但不再联网检查、也不会替换自身二进制,执行时会打印明确的提示信息,并恒定以退出码 1 结束。上游 mc update 在已是最新版时返回 0,脚本中如有依赖其退出码的调用应予移除。请通过 Pigsty 软件仓库或 GitHub Releases 升级。
同时,每次执行命令时向上游发布源发起的自动版本检查已完全移除,MC_UPDATE / MINIO_UPDATE 环境变量不再被读取。
主要变更
- 禁用自更新,切断上游发布渠道:移除
minio/selfupdate与aead.dev/minisign依赖及全部二进制替换逻辑,删除更新通知器与 FIPS/非 FIPS 更新分支。update命令保留为兼容壳,运行时辅助函数(Docker / DCOS / Kubernetes / 源码构建检测)迁移至独立的cmd/runtime-info.go。此前该客户端会在每次执行时静默访问上游发布源并提示升级,现已不再有任何出站发布探测。 - 容器与制品全部本地化:默认镜像改为从检出的分支源码构建,hotfix 二进制从本地构建上下文拷贝,不再下载任何上游预编译产物。移除上游发布用的
Dockerfile.release、Dockerfile.release.old_cpu与docker-buildx.sh,并禁用已失效的 MinIO hotfix 上传目标。 - 打包体系迁移至 nFPM:从 MinIO 的
pkger迁移到标准 nFPM。产物结构与安装路径保持完全一致(/usr/local/bin/mcli、包名mcli、版本方案YYYYMMDDHHMMSS.0.0),但供应商信息改为 PGSTY,许可证改用 SPDX 标识AGPL-3.0-or-later,DebianSection由空值改为utils。 - RPM 包首次提供 GPG 签名:RPM 由维护者主密钥在本地离线签名(密钥指纹
9592A7BC7A682E7333376E09E7935D8DB9BD8B20),签名前校验全部包元数据,签名后复验并重新生成校验和。DEB 与 APK 不做包级签名,其信任锚位于软件仓库层。 - 构建溯源加固:此前所有已发布二进制都被 Go 工具链标记为「来自被修改的工作树」(
vcs.modified=true),导致产物无法与其 Git 标签对应。本次修复该问题,并在发布与测试流水线中加入强制校验,确保每个二进制都能追溯到确切的提交。
安全修复
- SUBNET 调试日志凭据脱敏:启用
--debug时,SUBNET 相关的 HTTP 请求会打印完整报文。此前api-key/api_key查询参数、认证头以及响应体均以明文进入日志,而 SUBNET 的认证与注册端点会在响应中返回 API Key、License 与 Token。本次修复对两种参数拼写、重复参数值统一脱敏,屏蔽敏感响应头,并将 SUBNET 响应体整体排除在调试转储之外。该泄漏继承自上游,存在于包括上游mc在内的所有历史版本中:如果你曾对外分享过 SUBNET 相关命令(mcli license .../mcli support ...)的--debug输出,请将其中的 API Key 与 License 视为已泄露并及时轮换。 - 调试脱敏与调用方状态隔离:调试追踪改为转储请求与响应的副本,确保脱敏动作不会污染调用方持有的对象;覆盖零长度、定长与未知长度三种响应体形态,且不影响调用方正常读取响应内容。
依赖更新
本周期的依赖工作属于安全维护而非例行升级:除 term / mod / sync / tools 四项例行刷新外,以下每一项升级都至少关闭一个 Go 漏洞数据库中已发布的安全公告;govulncheck 对本次发布的代码报告零个可达的已知漏洞。minio/mc、minio-go、madmin-go、minio/pkg 四个包本身从未有过任何安全公告。
- Go 构建基线由
1.26.2升级至1.26.5(截至发布时 1.26 线最新版),纳入 1.26.3–1.26.5 各批安全修复,包括 GO-2026-4970(os包符号链接根逃逸)与 GO-2026-5856(crypto/tlsECH 隐私泄漏)—— 对一个通过 TLS 下载对象并写入本地文件的 S3 客户端而言最直接相关的两项。 github.com/klauspost/compress由v1.18.5升级至v1.18.7(关闭 GO-2026-5841)。github.com/prometheus/prometheus由v0.310.0升级至v0.311.3(关闭 GO-2026-5264、GO-2026-5381、GO-2026-5710)。google.golang.org/grpc由v1.79.3升级至v1.82.1(关闭 GO-2026-6061),同步刷新genproto系列。golang.org/x/*系列整体刷新:cryptov0.49.0→v0.53.0(GO-2026-5005…5033 共 14 项公告)、netv0.52.0→v0.56.0(GO-2026-5025…5030 及 GO-2026-5942)、sysv0.42.0→v0.46.0(GO-2026-5024)、textv0.35.0→v0.39.0(GO-2026-5970),term、mod、sync、tools同步升级。- 移除
aead.dev/minisign与github.com/minio/selfupdate,并同步更新第三方致谢清单。
工程与交付
- 集成测试依赖钉死:CI 不再从上游可变地址下载 MinIO 服务端,改用带 SHA-256 校验的
pgsty/minio版本化发布归档,Go 版本钉在1.26.5。 - 发布流水线校验:新增打包验证工作流,逐字节比对三种包格式内的二进制与构建产物是否一致,并校验包名、校验和、架构字段与全部元数据。RPM 元数据的期望值以签名脚本为唯一事实源,避免配置漂移导致发布中途签名失败。
- CI 供应链加固:全部 GitHub Actions 钉到 commit SHA 并接入 dependabot,工作流权限收敛为只读,移除指向上游组织项目板的失效工作流。
- 文档更新:README 中英文版本明确本分支的分发渠道与自更新策略,移除会导致误装上游
mc的安装指引。
已知问题
mcli watch(桶事件监听)在对接任何已发布的 pgsty/minio 服务端版本时都无法收到事件。根因是服务端侧一处继承自上游的静默流式 flush 回归,与客户端无关,上一个 mcli 版本受影响的程度完全相同;修复已于 2026-07-29 合入服务端 master,但尚未随公开服务端版本交付。详见 SILO 20260618 发布说明 与 PR #34。
另外,本分支继承了上游未修复的历史缺陷;上游仓库已归档,这些问题今后只可能在本分支修复。其中最严重的是 minio/mc#5139:mirror --remove --watch 在源端删除对象的非当前版本时,可能误删目标端的现存对象。在版本化桶上组合使用 --remove --watch 时请务必谨慎。
关联提交
- 9603ee3:fix: redact SUBNET secrets in HTTP debug logs
- f6ae2b0:fix: disable self-update in Pigsty builds
- c05a6e4:build: update Go deps and toolchain to 1.26.5
- 1f105aa:build: use local fork artifacts for containers
- 1182da5:ci: pin fork integration test dependencies
- 9ee207f:docs: clarify Pigsty fork distribution channels
- 0686cd8:fix: isolate SUBNET debug redaction
- ad10a2a:build: complete local Docker context isolation
- 5f54221:docs: update mc README and cn version
- 02c0305:build: migrate release packaging to nFPM
- 4c4dcc4:build: harden release provenance and package metadata