跳转到主要内容

S3

30 篇
  • 多池删除:失败时保住最新副本

    发布于 设计

    DesignS3StoragePerformance

    多池删除:失败时保住最新副本

    2026 年 10 月 24 日决定:合并修正后的 PR #257(已随 Server 20261026 发布)。 提交 aafe4f8886 修复了 issue #256 报告的多池删除缺陷,并补齐请求开始之后的执行期故障保护。核心不变量是:先完成其他池的旧副本清理,再删除决定当前读取结果的权威副本。 Denis Babchuk 报告了该问题并提交了初始补丁。代码评审复现了故障,发现批量删除在通过在线盘数预检查后仍存在执行期故障窗口,随后补充分阶段执行、逐项响应身份保持、部分删除重试以及共享分 …

    2026 年 10 月 24 日决定:合并修正后的 PR #257(已随 Server 20261026 发布)。 提交 aafe4f8886 修复了 issue #256 报告的多池删除缺陷,并补齐请求开始之后的执行期故障保护。核心不变量是:先完成其他池的旧副本清理,再删除决定当前读取结果的权威副本。 Denis Babchuk 报告了该问题并提交了初始补丁。代码评审复现了故障,发现批量删除在通过在线盘数预检查后仍存在执行期故障窗口,随后补充分阶段执行、逐项响应身份保持、部分删除重试以及共享分 …

  • 多池覆盖亲和:为何最终没有采纳 #245

    发布于 设计

    DesignS3StoragePerformanceReview

    多池覆盖亲和:为何最终没有采纳 #245

    2026 年 10 月 24 日决定:不合并本次测试的多池覆盖亲和补丁(PR #245)。 该方案解决了跨池覆盖遗留旧副本的空间占用问题,但无论完整策略还是仅限普通无版本覆盖的收窄策略,都未能在性能测试中达到可接受的权衡。两个实验分支(codex/healthy-pool-affinity 与 codex/unversioned-pool-affinity)已保留归档,服务端 main 分支保持原状。 Denis Babchuk 提出的思路是:覆盖已有对象时,优先写回已存放该对象的池。代码评审发 …

    2026 年 10 月 24 日决定:不合并本次测试的多池覆盖亲和补丁(PR #245)。 该方案解决了跨池覆盖遗留旧副本的空间占用问题,但无论完整策略还是仅限普通无版本覆盖的收窄策略,都未能在性能测试中达到可接受的权衡。两个实验分支(codex/healthy-pool-affinity 与 codex/unversioned-pool-affinity)已保留归档,服务端 main 分支保持原状。 Denis Babchuk 提出的思路是:覆盖已有对象时,优先写回已存放该对象的池。代码评审发 …

  • FULL_OBJECT 校验和复制:在初始化上传时保留类型

    发布于 设计

    DesignReplicationS3Checksum

    FULL_OBJECT 校验和复制:在初始化上传时保留类型

    Issue #254 报告了一类复制故障:使用 FULL_OBJECT CRC32 或 CRC32C 校验和的分片上传对象在源端可正常上传和读取,但复制到目标端并在最后调用 CompleteMultipartUpload 时会因 400 BadDigest 失败。Denis Babchuk(@botdeniska)提交的 PR #255 补回了出站复制请求遗漏的校验和类型头。 该补丁于 2026 年 10 月 24 日以 6d890fc86 合入主干并随 Server 20261026 发布,共 …

    Issue #254 报告了一类复制故障:使用 FULL_OBJECT CRC32 或 CRC32C 校验和的分片上传对象在源端可正常上传和读取,但复制到目标端并在最后调用 CompleteMultipartUpload 时会因 400 BadDigest 失败。Denis Babchuk(@botdeniska)提交的 PR #255 补回了出站复制请求遗漏的校验和类型头。 该补丁于 2026 年 10 月 24 日以 6d890fc86 合入主干并随 Server 20261026 发布,共 …

  • IAM 策略重载:锁粒度、请求取消与超时预算隔离

    发布于 设计

    DesignIAMKMSS3Review

    IAM 策略重载:锁粒度、请求取消与超时预算隔离

    提交 1b5477f3d(pgsty/silo#251)解决了 KMS/KES 响应缓慢时的两类级联故障: 鉴权缓存锁争用:ListPolicies 与 ListPolicyDocs 在保留 IAM 写操作串行锁(writeMu)的前提下,将慢速的后端策略读取与解密移出内存鉴权缓存锁(store.lock()),避免管理员列举策略时阻塞普通用户的 S3 读写请求。 全链路取消传播与超时预算隔离:将调用方的请求 context.Context 贯通至 IAM 配置解密、SSE-S3 列表密钥解封以 …

    提交 1b5477f3d(pgsty/silo#251)解决了 KMS/KES 响应缓慢时的两类级联故障: 鉴权缓存锁争用:ListPolicies 与 ListPolicyDocs 在保留 IAM 写操作串行锁(writeMu)的前提下,将慢速的后端策略读取与解密移出内存鉴权缓存锁(store.lock()),避免管理员列举策略时阻塞普通用户的 S3 读写请求。 全链路取消传播与超时预算隔离:将调用方的请求 context.Context 贯通至 IAM 配置解密、SSE-S3 列表密钥解封以 …

  • LIST 漏项修复:仅对存疑对象补读确认并收敛锁等待开销

    发布于 设计

    DesignS3ListObjectsPerformanceReview

    LIST 漏项修复:仅对存疑对象补读确认并收敛锁等待开销

    随 SILO Server 20261018 发布的 PR #239(合并提交 fbcb51197,关闭 #218 并保留 mr javad seydi 在 #221 中的原始签署提交)以及 10 月 18 日的目录与公共前缀跟进修复(3dd53eb81 与 2080b3d03),解决了并发读写期间 ListObjects 与 ListObjectsV2 静默漏报对象的问题。本设计承接九月的 null 版本仲裁修复,并替代了早期“直接调用普通 GET 元数据路径”的恢复方案。 成功的目录列举可能 …

    随 SILO Server 20261018 发布的 PR #239(合并提交 fbcb51197,关闭 #218 并保留 mr javad seydi 在 #221 中的原始签署提交)以及 10 月 18 日的目录与公共前缀跟进修复(3dd53eb81 与 2080b3d03),解决了并发读写期间 ListObjects 与 ListObjectsV2 静默漏报对象的问题。本设计承接九月的 null 版本仲裁修复,并替代了早期“直接调用普通 GET 元数据路径”的恢复方案。 成功的目录列举可能 …

  • 对象锁保留期越权与版本覆写漏洞修复设计(SN-2026-015 / SN-2026-016)

    发布于 设计

    SiloSecurityObject LockWORMS3IAM

    对象锁保留期越权与版本覆写漏洞修复设计(SN-2026-015 / SN-2026-016)

    本文档完整记录针对外部报告与内部关联排查发现的两处对象锁(Object Lock / WORM)安全缺陷——**SN-2026-015(PutObjectRetention 绕过请求头越权与条件策略失灵)**与 SN-2026-016(版本寻址写入覆写绕过及写路径锁缺口)——的事实核验、Git 历史溯源、修复设计、关键路径影响评估与候选方案的权衡取舍。完整修复(#234、#235、#241)已随 Server 20261018 正式发布。 关联公开安全公告: SN-2026-015 / …

    本文档完整记录针对外部报告与内部关联排查发现的两处对象锁(Object Lock / WORM)安全缺陷——**SN-2026-015(PutObjectRetention 绕过请求头越权与条件策略失灵)**与 SN-2026-016(版本寻址写入覆写绕过及写路径锁缺口)——的事实核验、Git 历史溯源、修复设计、关键路径影响评估与候选方案的权衡取舍。完整修复(#234、#235、#241)已随 Server 20261018 正式发布。 关联公开安全公告: SN-2026-015 / …

  • SN-2026-015 与 SN-2026-016:S3 Object Lock 治理模式保留锁绕过与指定版本号原地覆盖漏洞分析

    发布于 安全编年史

    SecurityObject LockS3WORMComplianceGovernanceIAMSilo

    SN-2026-015 与 SN-2026-016:S3 Object Lock 治理模式保留锁绕过与指定版本号原地覆盖漏洞分析

    SN-2026-015 与 SN-2026-016 涵盖了在 SILO Server 20261018 中通过 PR #234(14042b5aa)与 PR #235(0d3ba5d4c)修复的两组 S3 Object Lock 合规保留与不可变性漏洞(配套修复设计方案)。虽然删除路径此前已按 CVE-2023-25812 正确校验 s3:BypassGovernanceRetention,但保留期修改路径(PutObjectRetention)与四条原地版本覆写路径仍存在绕过缺陷。 漏洞范围 …

    SN-2026-015 与 SN-2026-016 涵盖了在 SILO Server 20261018 中通过 PR #234(14042b5aa)与 PR #235(0d3ba5d4c)修复的两组 S3 Object Lock 合规保留与不可变性漏洞(配套修复设计方案)。虽然删除路径此前已按 CVE-2023-25812 正确校验 s3:BypassGovernanceRetention,但保留期修改路径(PutObjectRetention)与四条原地版本覆写路径仍存在绕过缺陷。 漏洞范围 …

  • 列举不能丢掉仍有仲裁的 null 版本

    发布于 设计

    设计S3ListObjects评审

    列举不能丢掉仍有仲裁的 null 版本

    本文记录 2026-09-16 调查的对象列举漏项问题:未开启版本控制的存储桶在并发覆盖写下返回 HTTP 200 的列表,却漏掉了同一端点仍能正常 GET 的对象键。下文说明已确认的合并缺陷机制、提交 8d06424b1(随 Server 20260916 发布)的针对性修复与验证数据,以及在 #218 中跟踪、随后在 Server 20261018 中由 PR #239 关闭的滚动重启漏项边界(详见 LIST 恢复设计)。 缺陷机制 对象列举会合并被询问各块磁盘返回的版本流。当各盘状态不一致 …

    本文记录 2026-09-16 调查的对象列举漏项问题:未开启版本控制的存储桶在并发覆盖写下返回 HTTP 200 的列表,却漏掉了同一端点仍能正常 GET 的对象键。下文说明已确认的合并缺陷机制、提交 8d06424b1(随 Server 20260916 发布)的针对性修复与验证数据,以及在 #218 中跟踪、随后在 Server 20261018 中由 PR #239 关闭的滚动重启漏项边界(详见 LIST 恢复设计)。 缺陷机制 对象列举会合并被询问各块磁盘返回的版本流。当各盘状态不一致 …

  • 请求头截止时间:绝对头部上限与滚动的正文空闲超时

    发布于 设计

    设计HTTPS3评审

    请求头截止时间:绝对头部上限与滚动的正文空闲超时

    本文记录 Server HTTP 读取截止时间的修复设计,该修复通过 PR #196 合入主干(提交 055030ea5),随 Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布。 排查源于慢速 HTTP DoS 扫描器报告(#183),并通过两组实验验证:一是直接 TCP 对照实验(请求头限制设为 100 ms、实际分批发送耗时 400 ms,标准 Go 服务拒绝该请求而旧版服务返回 204);二是单盘进程探针验证(通过命令行 …

    本文记录 Server HTTP 读取截止时间的修复设计,该修复通过 PR #196 合入主干(提交 055030ea5),随 Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布。 排查源于慢速 HTTP DoS 扫描器报告(#183),并通过两组实验验证:一是直接 TCP 对照实验(请求头限制设为 100 ms、实际分批发送耗时 400 ms,标准 Go 服务拒绝该请求而旧版服务返回 204);二是单盘进程探针验证(通过命令行 …

  • 副本元数据归一化:可信复制不得重新注入什么

    发布于 设计

    设计复制S3评审

    副本元数据归一化:可信复制不得重新注入什么

    随 SILO Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布的 PR #194(修复提交 4fcdf37ce,合并提交 9f3037e941,采纳并保留 Mikhail Khadarenka 在 PR #187 中的实现),修复了可信复制接收端在恢复副本内部元数据时重新调用宽松请求头提取器、导致仅用于传输的 aws-chunked Content-Encoding 标记与 GHSA 已脱敏的用户元数据重新回流至落盘对象中的回 …

    随 SILO Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布的 PR #194(修复提交 4fcdf37ce,合并提交 9f3037e941,采纳并保留 Mikhail Khadarenka 在 PR #187 中的实现),修复了可信复制接收端在恢复副本内部元数据时重新调用宽松请求头提取器、导致仅用于传输的 aws-chunked Content-Encoding 标记与 GHSA 已脱敏的用户元数据重新回流至落盘对象中的回 …

  • 复制标签排序:修订时间戳、墓碑与复活

    发布于 设计

    设计复制S3评审

    复制标签排序:修订时间戳、墓碑与复活

    随 SILO Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布的 PR #193(修复提交 03027727d)与 PR #196(修复提交 680eac66e),修复了对象标签在跨桶复制中保持顺序的两项缺陷:SSE-KMS 目的端复制静默丢弃标签修订时间戳(R4),以及空标签值(删除操作)缺失修订时间戳导致延迟到达的复制事件将已删除标签“复活”(R5)。 共同模型:标签值与其修订时间戳共同构成单一状态 对象标签在复制时通过请 …

    随 SILO Server 20260916(40220bd836cbd066ca424fa4dc5dbb90057fb55a)发布的 PR #193(修复提交 03027727d)与 PR #196(修复提交 680eac66e),修复了对象标签在跨桶复制中保持顺序的两项缺陷:SSE-KMS 目的端复制静默丢弃标签修订时间戳(R4),以及空标签值(删除操作)缺失修订时间戳导致延迟到达的复制事件将已删除标签“复活”(R5)。 共同模型:标签值与其修订时间戳共同构成单一状态 对象标签在复制时通过请 …

  • 联邦 CopyObject:保持目标对象契约

    发布于 设计

    设计S3运维

    联邦 CopyObject:保持目标对象契约

    Server 20260916 通过 PR #157、PR #159、PR #163、PR #177 与 PR #179 修复了旧版 etcd 存储桶联邦(bucket federation)的 CopyObject 转发路径。当代理节点将跨集群复制作为远端 PutObject 转发到目标集群时,代理节点流式读取并发送源对象的逻辑字节,由目标端执行加密与 Object Lock 规则,校验完整对象校验和,并原样返回目标端实际提交的写入元数据。 转发一次逻辑字节,由目标端执行加密 代理节点在本地按 …

    Server 20260916 通过 PR #157、PR #159、PR #163、PR #177 与 PR #179 修复了旧版 etcd 存储桶联邦(bucket federation)的 CopyObject 转发路径。当代理节点将跨集群复制作为远端 PutObject 转发到目标集群时,代理节点流式读取并发送源对象的逻辑字节,由目标端执行加密与 Object Lock 规则,校验完整对象校验和,并原样返回目标端实际提交的写入元数据。 转发一次逻辑字节,由目标端执行加密 代理节点在本地按 …

  • 多池对象一致性

    发布于 设计

    DesignS3Operations

    多池对象一致性

    随 SILO Server 20260916 发布的 PR #178 修复了多存储池修改顺序问题,PR #207 将当前逻辑对象选择扩展至条件 PUT(关闭 #133 与 #144),提交 fced86303 则修复了跨池再平衡(rebalance)与退役(decommission)迁移丢失对象标签的缺陷。随后的 SILO Server 20261018 进一步合入 60c7179dd(纳入 PR #248)与 1748f62c7,修复了跨池迁移期间旧数据覆盖新副本以及删除标记(Delete …

    随 SILO Server 20260916 发布的 PR #178 修复了多存储池修改顺序问题,PR #207 将当前逻辑对象选择扩展至条件 PUT(关闭 #133 与 #144),提交 fced86303 则修复了跨池再平衡(rebalance)与退役(decommission)迁移丢失对象标签的缺陷。随后的 SILO Server 20261018 进一步合入 60c7179dd(纳入 PR #248)与 1748f62c7,修复了跨池迁移期间旧数据覆盖新副本以及删除标记(Delete …

  • 持久化 IAM 撤销

    发布于 设计

    DesignS3Operations

    持久化 IAM 撤销

    SILO 保留已删除 IAM 记录的版本(Revision),使离线站点在重新连接后无法将已删除的旧身份或旧授权恢复为有效状态。该机制覆盖内置用户、服务账号、组、策略文档,以及用户、STS 父身份和组各自命名空间中的策略映射。内置用户被删除后,即使管理员有意重建同名用户,此前签发的旧服务账号、STS 临时凭证与组授权也不会因此复活。 持久化 IAM 撤销架构(PR #191、#192,提交 f99ed829b5eba549160725f035156c9e020b6a07)已随 Server …

    SILO 保留已删除 IAM 记录的版本(Revision),使离线站点在重新连接后无法将已删除的旧身份或旧授权恢复为有效状态。该机制覆盖内置用户、服务账号、组、策略文档,以及用户、STS 父身份和组各自命名空间中的策略映射。内置用户被删除后,即使管理员有意重建同名用户,此前签发的旧服务账号、STS 临时凭证与组授权也不会因此复活。 持久化 IAM 撤销架构(PR #191、#192,提交 f99ed829b5eba549160725f035156c9e020b6a07)已随 Server …

  • SSE-C 副本完整性

    发布于 设计

    DesignS3Operations

    SSE-C 副本完整性

    本文记录由 #122、#123、#124、#126 和 #134 共同构成的 SSE-C 副本完整性契约(随 Server 20260916 发布),与此前在 Server 20260903 中发布的零字节/属性读取认证及目标密钥 checksum 响应修复衔接。 密文与信任 普通 SSE-C 请求提供客户密钥,操作明文。经过授权的副本传输可以携带原始密文和保留原对象所需的密封对象密钥元数据。目标必须原样存储这些字节,再加密一次会产生不可读的双重加密对象。内部标记本身不是授权:仍需精确复制标记和 …

    本文记录由 #122、#123、#124、#126 和 #134 共同构成的 SSE-C 副本完整性契约(随 Server 20260916 发布),与此前在 Server 20260903 中发布的零字节/属性读取认证及目标密钥 checksum 响应修复衔接。 密文与信任 普通 SSE-C 请求提供客户密钥,操作明文。经过授权的副本传输可以携带原始密文和保留原对象所需的密封对象密钥元数据。目标必须原样存储这些字节,再加密一次会产生不可读的双重加密对象。内部标记本身不是授权:仍需精确复制标记和 …

  • Object Lock 复制排序

    发布于 设计

    DesignS3Operations

    Object Lock 复制排序

    Object Lock 复制时间戳排序的初始修复(f4c1286c9)已随 SILO Server 20260903 发布(收录于安全公告台账)。针对仅携带时间戳的删除(墓碑)、SSE-C 副本完整重传以及跨存储池 Object Lock 状态合并的后续修复(PR #129、PR #134 与 PR #178)已随 SILO Server 20260916 正式发布。 在重建目标元数据前捕获已存状态 此前,副本 COPY 在比较 Object Lock 保留期(Retention)与法务锁定 …

    Object Lock 复制时间戳排序的初始修复(f4c1286c9)已随 SILO Server 20260903 发布(收录于安全公告台账)。针对仅携带时间戳的删除(墓碑)、SSE-C 副本完整重传以及跨存储池 Object Lock 状态合并的后续修复(PR #129、PR #134 与 PR #178)已随 SILO Server 20260916 正式发布。 在重建目标元数据前捕获已存状态 此前,副本 COPY 在比较 Object Lock 保留期(Retention)与法务锁定 …

  • 桶配置复制:来源时间、删除与确定性收敛

    发布于 设计

    设计复制S3

    桶配置复制:来源时间、删除与确定性收敛

    #77 是已在 Server 20260916(PR #180,提交 48ec10312)中修复的站点复制正确性缺陷。修复前,接收站点将对端事件的来源时间改写为本地到达时间(UTCNow),导致后续真正较新的删除请求因早于本地到达时间而被当作旧事件拒绝;同时部分配置在删除后不再导出时间戳,断连期间遗漏的删除也无法通过自愈(heal)恢复。仅补一个 DELETE 分支无法同时解决这两类问题,确定性收敛必须同时具备来源时间保留、持久化删除墓碑(tombstone)、规范化内容比较键以及整桶元数据锁。 …

    #77 是已在 Server 20260916(PR #180,提交 48ec10312)中修复的站点复制正确性缺陷。修复前,接收站点将对端事件的来源时间改写为本地到达时间(UTCNow),导致后续真正较新的删除请求因早于本地到达时间而被当作旧事件拒绝;同时部分配置在删除后不再导出时间戳,断连期间遗漏的删除也无法通过自愈(heal)恢复。仅补一个 DELETE 分支无法同时解决这两类问题,确定性收敛必须同时具备来源时间保留、持久化删除墓碑(tombstone)、规范化内容比较键以及整桶元数据锁。 …

  • 复制可靠性:删除完成、MRF 可见性与 resync 取消

    发布于 设计

    设计复制S3评审

    复制可靠性:删除完成、MRF 可见性与 resync 取消

    本文记录随 Server 20260916 交付的三轮复制可靠性修复的问题分析、方案取舍与验收结论: 第一轮(PR #162,合并为 d1105bbb): 修复 #153、#152 与 #137,分别涉及请求入口的操作分类、后台恢复队列的可观测性以及任务取消生命周期。 第二轮(PR #196,提交 0c61128d2): 修复复制工作协程(worker)的删除出口、外层状态聚合与持久化 MRF 标记恢复路径(见第二轮小节)。 第三轮(提交 eb4f5e5b3、254b19ac0 与 …

    本文记录随 Server 20260916 交付的三轮复制可靠性修复的问题分析、方案取舍与验收结论: 第一轮(PR #162,合并为 d1105bbb): 修复 #153、#152 与 #137,分别涉及请求入口的操作分类、后台恢复队列的可观测性以及任务取消生命周期。 第二轮(PR #196,提交 0c61128d2): 修复复制工作协程(worker)的删除出口、外层状态聚合与持久化 MRF 标记恢复路径(见第二轮小节)。 第三轮(提交 eb4f5e5b3、254b19ac0 与 …

  • SILO 20260903 安全说明:SN-2026-006 至 010

    发布于 安全编年史

    安全S3SSE-CReplicationIAM

    SILO 20260903 安全说明:SN-2026-006 至 010

    本公告汇总随 SILO Server 20260903(RELEASE.2026-09-03T13-18-01Z)发布的五项服务端安全修复,涵盖客户端提供密钥加密(SSE-C)、客户端可控复制请求头、管理端账户/组状态变更鉴权以及显式对象版本删除。SN-2026-006 至 SN-2026-010 为 SILO 安全说明编号,对应从上游 minio/minio 代码基线继承并在发布前审计中修复的权限与密码学边界缺陷。 摘要 编号 触发前置条件 缺陷表现 20260903 修复后行为 …

    本公告汇总随 SILO Server 20260903(RELEASE.2026-09-03T13-18-01Z)发布的五项服务端安全修复,涵盖客户端提供密钥加密(SSE-C)、客户端可控复制请求头、管理端账户/组状态变更鉴权以及显式对象版本删除。SN-2026-006 至 SN-2026-010 为 SILO 安全说明编号,对应从上游 minio/minio 代码基线继承并在发布前审计中修复的权限与密码学边界缺陷。 摘要 编号 触发前置条件 缺陷表现 20260903 修复后行为 …

  • 显式版本删除现在要求 DeleteObjectVersion

    发布于 发布注记

    发布安全IAMS3兼容性

    显式版本删除现在要求 DeleteObjectVersion

    自 Server 20260903 起(pgsty/silo#104,对应 Issue #58),SILO 按照删除请求实际执行的操作类型选择所需权限: 请求 所需权限 未携带 versionId s3:DeleteObject 版本 UUID s3:DeleteObjectVersion 显式 versionId=null s3:DeleteObjectVersion DeleteObjects 对每个 XML 条目独立应用映射 此前所有情况均要求 s3:DeleteObject,而 …

    自 Server 20260903 起(pgsty/silo#104,对应 Issue #58),SILO 按照删除请求实际执行的操作类型选择所需权限: 请求 所需权限 未携带 versionId s3:DeleteObject 版本 UUID s3:DeleteObjectVersion 显式 versionId=null s3:DeleteObjectVersion DeleteObjects 对每个 XML 条目独立应用映射 此前所有情况均要求 s3:DeleteObject,而 …

  • 只读 Checksum 审计与可靠的 CLI 输出契约

    发布于 设计

    设计S3兼容性Checksummcli

    只读 Checksum 审计与可靠的 CLI 输出契约

    本文记录 MCLI 只读 checksum 校验工作流,以及发布复核阶段发现的 non-TTY 输出缺陷 pgsty/mc#5 的设计与实现。该命令经由 pgsty/mc 的 pull request #8 与 #13 合入主干,并随 mcli 20260903 正式发布(已内置于 Server 20260903 容器镜像)。 核心概览 历史版本的 CopyObject 实现可能在压缩或加密后的底层存储字节上计算附加校验和(additional checksum),而非在 S3 GET 返回给客 …

    本文记录 MCLI 只读 checksum 校验工作流,以及发布复核阶段发现的 non-TTY 输出缺陷 pgsty/mc#5 的设计与实现。该命令经由 pgsty/mc 的 pull request #8 与 #13 合入主干,并随 mcli 20260903 正式发布(已内置于 Server 20260903 容器镜像)。 核心概览 历史版本的 CopyObject 实现可能在压缩或加密后的底层存储字节上计算附加校验和(additional checksum),而非在 S3 GET 返回给客 …

  • 两把 SSE-C 密钥,一份 CopyObject 响应

    发布于 设计

    设计S3SSE-CChecksum兼容性

    两把 SSE-C 密钥,一份 CopyObject 响应

    本文记录提交 e73436c99(已随 Server 20260903 发布)中的 CopyObject SSE-C 校验和响应修复。该修复仅作用于目标对象成功提交后的 CopyObject XML 与 HTTP 响应生成阶段;已存储的对象字节、校验和元数据、加密格式、源对象解密、联邦复制与站点复制均保持不变。 概览 一次 SSE-C CopyObject 请求可以同时携带两套相互独立的客户端加密密钥: 角色 请求头 用途 源对象 …

    本文记录提交 e73436c99(已随 Server 20260903 发布)中的 CopyObject SSE-C 校验和响应修复。该修复仅作用于目标对象成功提交后的 CopyObject XML 与 HTTP 响应生成阶段;已存储的对象字节、校验和元数据、加密格式、源对象解密、联邦复制与站点复制均保持不变。 概览 一次 SSE-C CopyObject 请求可以同时携带两套相互独立的客户端加密密钥: 角色 请求头 用途 源对象 …

  • BadDigest、InvalidRequest 与 CompleteMultipartUpload 校验和契约

    发布于 设计

    设计S3兼容性校验和

    BadDigest、InvalidRequest 与 CompleteMultipartUpload 校验和契约

    #48 与 #50 的修复已随 Server 20260903 发布,流式校验和后续修复(PR #143)已随 Server 20260916 发布。本文取代八月早期提案中“暂时保留 CRC64NVME 静默规范化”的结论。 20261018:消息文字与提交失败 Server 20261018 包含 #225、#229 与 #238 的消息格式修复:Content-MD5 大小写对齐 S3 规范、PutObject 与 UploadPart 校验失败时显示已知算法名,以及移除 …

    #48 与 #50 的修复已随 Server 20260903 发布,流式校验和后续修复(PR #143)已随 Server 20260916 发布。本文取代八月早期提案中“暂时保留 CRC64NVME 静默规范化”的结论。 20261018:消息文字与提交失败 Server 20261018 包含 #225、#229 与 #238 的消息格式修复:Content-MD5 大小写对齐 S3 规范、PutObject 与 UploadPart 校验失败时显示已知算法名,以及移除 …

  • ListObjects 快捷路径不能把不存在的桶伪装成空桶

    发布于 设计

    设计S3兼容性ListObjects

    ListObjects 快捷路径不能把不存在的桶伪装成空桶

    随 SILO Server 20260903 发布的 PR #37(PR 提交 e9c5340be,合并提交 49c8aeac4,关闭 SILO #32),修复了 ListObjects、ListObjectsV2 与 ListObjectVersions 中三条提前返回(early-return)快捷路径在目标桶不存在时错误返回 HTTP 200 OK 空列表、而非 HTTP 404 NoSuchBucket 的 S3 兼容性回归。 太长不看(TL;DR) 对不存在的桶执行普通 …

    随 SILO Server 20260903 发布的 PR #37(PR 提交 e9c5340be,合并提交 49c8aeac4,关闭 SILO #32),修复了 ListObjects、ListObjectsV2 与 ListObjectVersions 中三条提前返回(early-return)快捷路径在目标桶不存在时错误返回 HTTP 200 OK 空列表、而非 HTTP 404 NoSuchBucket 的 S3 兼容性回归。 太长不看(TL;DR) 对不存在的桶执行普通 …

  • 条件 DELETE:一个条件对应一个逻辑对象

    发布于 设计

    设计S3兼容性DELETE

    条件 DELETE:一个条件对应一个逻辑对象

    单对象条件删除(DeleteObject 上的 If-Match)由 PR #145 引入,随后 PR #178 修复了多池串行化与跨池清理。这两项改动均已随 Server 20260916 发布。 八月围绕 PR #12 的早期方案曾设想更宽的范围——包括批量 DeleteObjects 拒绝保护、额外的 s3:GetObject 读取授权检查,以及“仅比较当前版本”规则——但实际合入的实现并未采纳这些扩展。本文记录 f99ed829b 中已交付的契约,并阐述为什么前置条件判断必须位于单池存储 …

    单对象条件删除(DeleteObject 上的 If-Match)由 PR #145 引入,随后 PR #178 修复了多池串行化与跨池清理。这两项改动均已随 Server 20260916 发布。 八月围绕 PR #12 的早期方案曾设想更宽的范围——包括批量 DeleteObjects 拒绝保护、额外的 s3:GetObject 读取授权检查,以及“仅比较当前版本”规则——但实际合入的实现并未采纳这些扩展。本文记录 f99ed829b 中已交付的契约,并阐述为什么前置条件判断必须位于单池存储 …

  • 为什么 CompleteMultipartUpload 必须返回 ChecksumType:PR #57 评审记录

    发布于 设计

    设计S3兼容性校验和

    为什么 CompleteMultipartUpload 必须返回 ChecksumType:PR #57 评审记录

    Shooks(@Dansyuqri)贡献的 PR #57 修复了 #47,并已随 Server 20260903 发布。当对象保存了附加 S3 校验和时,CompleteMultipartUpload 的 XML 响应现在会一并返回已存储的 ChecksumType 元素。 缺陷与范围 对 @cbornet 报告的 #31 的调查拆出了两个独立缺陷。CRC32 分片上传完成阶段的数据计算路径已由提交 c8590413f 与 3e14733f1 修复。但在分片上传成功完成后,虽然底层对象元数据保存 …

    Shooks(@Dansyuqri)贡献的 PR #57 修复了 #47,并已随 Server 20260903 发布。当对象保存了附加 S3 校验和时,CompleteMultipartUpload 的 XML 响应现在会一并返回已存储的 ChecksumType 元素。 缺陷与范围 对 @cbornet 报告的 #31 的调查拆出了两个独立缺陷。CRC32 分片上传完成阶段的数据计算路径已由提交 c8590413f 与 3e14733f1 修复。但在分片上传成功完成后,虽然底层对象元数据保存 …

  • 可选校验和,强制失败:修复 UploadPart 与 UploadPartCopy 兼容性

    发布于 设计

    设计S3兼容性Checksum

    可选校验和,强制失败:修复 UploadPart 与 UploadPartCopy 兼容性

    本文记录 SILO #46(合并提交 7fea6d5a5,随 Server 20260903 发布,后续延伸修复见 #63 与 #64)的设计与实现:如何围绕 S3 分片上传的可选校验和请求头,同时理顺分片合并(completion)语义、复制响应、压缩与加密数据流以及兼容性基线守卫。 太长不看(TL;DR) 分片上传(Multipart Upload,简称 MPU)会将大对象切分为多个分片(part)分别上传。AWS S3 允许客户端在上传每个分片时附带校验和(checksum),但将其定义为 …

    本文记录 SILO #46(合并提交 7fea6d5a5,随 Server 20260903 发布,后续延伸修复见 #63 与 #64)的设计与实现:如何围绕 S3 分片上传的可选校验和请求头,同时理顺分片合并(completion)语义、复制响应、压缩与加密数据流以及兼容性基线守卫。 太长不看(TL;DR) 分片上传(Multipart Upload,简称 MPU)会将大对象切分为多个分片(part)分别上传。AWS S3 允许客户端在上传每个分片时附带校验和(checksum),但将其定义为 …

  • SN-2026-004:对象级策略授权越界命中桶级变更操作

    发布于 安全编年史

    SecurityIAMBucket PolicyS3AuthorizationSilo

    SN-2026-004:对象级策略授权越界命中桶级变更操作

    SN-2026-004 修复了 silo-pkg v3.11.0(提交 3c24ad1、1f97549、d8b1fa7)与 Server 20260804(97b7d2804;上游参考 minio/minio#20449)中的一处 IAM 资源匹配缺陷:在评估桶级 S3 请求(args.ObjectName == "")时,Statement.IsAllowed 会固定在桶名末尾拼接 '/' 生成 "bucket/" 作为待匹配资源字符串,导致原本仅面向桶内对象的通配授权(如 Allow …

    SN-2026-004 修复了 silo-pkg v3.11.0(提交 3c24ad1、1f97549、d8b1fa7)与 Server 20260804(97b7d2804;上游参考 minio/minio#20449)中的一处 IAM 资源匹配缺陷:在评估桶级 S3 请求(args.ObjectName == "")时,Statement.IsAllowed 会固定在桶名末尾拼接 '/' 生成 "bucket/" 作为待匹配资源字符串,导致原本仅面向桶内对象的通配授权(如 Allow …

  • SN-2026-003:s3:versionid 条件求值缺陷与请求条件隔离加固

    发布于 安全编年史

    SecurityIAMS3VersioningBucket PolicySilo

    SN-2026-003:s3:versionid 条件求值缺陷与请求条件隔离加固

    SN-2026-003 与 SN-2026-005 涵盖了随 Server 20260804(提交 80c2c9d03、2f55347f7、eee05a17c 以及 silo-pkg v3.12.0 提交 2b087a1;pgsty/silo#40、pgsty/silo#53)发布的一组 S3 IAM 策略求值加固: SN-2026-003(80c2c9d03):当请求未携带 versionId 时,getConditionValues 依然无条件写入了 …

    SN-2026-003 与 SN-2026-005 涵盖了随 Server 20260804(提交 80c2c9d03、2f55347f7、eee05a17c 以及 silo-pkg v3.12.0 提交 2b087a1;pgsty/silo#40、pgsty/silo#53)发布的一组 S3 IAM 策略求值加固: SN-2026-003(80c2c9d03):当请求未携带 versionId 时,getConditionValues 依然无条件写入了 …

  • CompleteMultipartUpload 重复分片号漏洞分析与修复

    发布于 安全编年史

    S3Multipart UploadCorrectnessSilo

    CompleteMultipartUpload 重复分片号漏洞分析与修复

    在 S3 API 的 CompleteMultipartUpload 请求中,协议要求完成清单 XML 中的分片号(PartNumber)必须严格递增。直到 Server 20260725 为止,SILO 一直使用 sort.SliceIsSorted 配合严格小于号 < 来校验这一不变量——但这套写法实际上校验的是“非递减序”,会放行 [1, 1] 这类包含相邻重复分片号的列表,导致同一个底层分片在最终对象中被重复拼接。Server 20260804(pgsty/silo#49)将其替换为显式 …

    在 S3 API 的 CompleteMultipartUpload 请求中,协议要求完成清单 XML 中的分片号(PartNumber)必须严格递增。直到 Server 20260725 为止,SILO 一直使用 sort.SliceIsSorted 配合严格小于号 < 来校验这一不变量——但这套写法实际上校验的是“非递减序”,会放行 [1, 1] 这类包含相邻重复分片号的列表,导致同一个底层分片在最终对象中被重复拼接。Server 20260804(pgsty/silo#49)将其替换为显式 …