接力 MinIO:OtterIO 十月初维护记录
内容提要
OtterIO 发布 2026 年 10 月维护版,修复预签名上传漏洞(可被附加未签名 x-amz-copy-source 头改为服务端复制),并加强内部存储接口的路径、元数据与纠删码参数校验。新版强制凭据配置,升级需更新全部节点并备份元数据。
延伸解读
预签名上传漏洞的修复逻辑
文章披露的漏洞允许拿到预签名上传 URL 的人附加未签名的 x-amz-copy-source 头,把上传变成服务端复制,从而利用签名身份的读取权限复制源对象。修复后服务端会检查 x-amz-* 和 x-otterio-* 请求头,决定或修改 S3 操作的请求头必须被签名覆盖,否则返回 403。这意味着自行封装 S3 客户端的用户需要调整签名流程,先设置好操作请求头再签名,不能先签名再附加复制来源等头。
内部存储接口的输入校验加强
OtterIO 为分布式纠删码部署注册的内部 storage REST 接口,即使通过 JWT 认证,传来的路径和元数据仍需检查。新版先检查未经规范化的路径再进行拼接,检查范围包括 URL 参数和元数据请求体中的对象名与数据目录;重命名时来源和目标路径都要检查,批量操作先检查整个批次。删除目录时按路径段判断包含关系,避免 backup 和 backup-old 这类名称相近但非子目录的误判。这些检查针对路径字符串,不能替代操作系统对数据目录的保护。
升级注意事项与凭据强制配置
新版强制检查凭据配置,运行 server 和 gateway 前会验证用户名和密码是否完整,并拒绝默认密码。旧命令需要补上凭据才能继续使用。升级前应备份元数据,升级后验证已有对象的读取、修复和复制;新版会把不合法的历史元数据视为损坏数据并拒绝处理,不会自动改写或删除。分布式部署需要更新所有节点。隔离的本地演示仍可通过 OTTERIO_ALLOW_DEFAULT_CREDENTIALS=1 使用默认凭据,但不接受不完整配置。
发布流程与版本核对的改进
本次发布流程会核对待发布的源码提交,实际运行已推送的镜像,并把上传的附件重新下载比对。新增的 release-manifest.json 记录发布标签、源码提交和镜像 digest,可用于核对运行中的版本。但清单并不提供发布签名,也不证明可以逐字节复现同一次构建;GitHub、GHCR 和 Docker Hub 的更新分步完成,不能作为原子事务提交。某一步失败后,应先核对各平台已完成的状态,再恢复对应步骤。
Q&A
OtterIO 是什么?它和 MinIO 有什么关系?
OtterIO 是一个 S3 兼容对象存储服务,基于 MinIO 最后一个 Apache 2.0 release 附近的代码(起点约为 RELEASE.2021-04-22T15-44-28Z),继续以 Apache License 2.0 分发,并保留原始版权与来源说明。
OtterIO 2026 年 10 月版修复了哪个安全漏洞?
修复了预签名上传漏洞:接收方可能通过附加未签名的 x-amz-copy-source 请求头,把上传改成服务端复制。修复后服务端会检查 x-amz-* 和 x-otterio-* 请求头,决定或修改 S3 操作的请求头必须被签名覆盖,否则返回 HTTP 403 AccessDenied。
升级到 OtterIO 2026 年 10 月版需要注意什么?
升级前应备份元数据,升级后验证已有对象的读取、修复和复制。分布式部署需要更新所有节点。新版强制凭据配置,运行 server 和 gateway 前会检查用户名和密码是否完整配置,并拒绝使用默认密码,旧命令需补上凭据。
OtterIO 内部存储接口做了哪些安全加固?
新版先检查未经规范化的路径再进行拼接,检查范围包括 URL 参数和元数据请求体中的对象名和数据目录;重命名时检查来源和目标路径;批量操作先检查整个批次;删除目录时按路径段判断包含关系。同时增加纠删码参数、分片数组和对象长度校验,拒绝不支持的 bitrot 算法,并在解码前检查数组、映射的元素数量和嵌套深度,对内部缓冲读写和 FileInfo 请求体增加单次 64 MiB 限制。
如何用 Docker 启动 OtterIO 2026 年 10 月版?
先生成凭据,例如 export OTTERIO_ROOT_USER=otterio-admin 和 export OTTERIO_ROOT_PASSWORD="$(openssl rand -hex 32)",然后运行:docker run -d --name otterio -p 127.0.0.1:9000:9000 -p 127.0.0.1:9001:9001 -e OTTERIO_ROOT_USER -e OTTERIO_ROOT_PASSWORD -v "$PWD/data:/data" ghcr.io/soulteary/otterio:RELEASE.2026-10-04T22-12-15Z server --address ":9000" --console-address ":9001" /data。启动后 S3 接口为 http://127.0.0.1:9000,控制台为 http://127.0.0.1:9001。
OtterIO 2026 年 10 月版提供了哪些平台的二进制?
提供 Linux amd64、arm64、ppc64le,macOS amd64、arm64,以及 Windows amd64 六种系统与架构组合的二进制,附带校验文件和发布清单。
如何验证 OtterIO 从六月版迁移到十月版的数据一致性?
可以使用迁移实验工具:生成随机对象,记录源端大小和 SHA256,再从目标端下载校验,检查两端内容是否一致。测试确认所有对象同步并验证通过。