<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Bucket Policy on SILO</title>
    <link>https://silo.pgsty.com/zh/tags/bucket-policy/</link>
    <description>Recent content in Bucket Policy on SILO</description>
    <generator>Hugo</generator>
    <language>zh-CN</language>
    
    
    
      <lastBuildDate>Sat, 24 Oct 2026 18:19:49 +0800</lastBuildDate>
    
    
      <atom:link href="https://silo.pgsty.com/zh/tags/bucket-policy/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>SN-2026-003：s3:versionid 条件求值缺陷与请求条件隔离加固</title>
        <link>https://silo.pgsty.com/zh/blog/security/s3-versionid-conditions/</link>
        <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://silo.pgsty.com/zh/blog/security/s3-versionid-conditions/</guid>
        <description>&lt;p&gt;&lt;strong&gt;&lt;code&gt;SN-2026-003&lt;/code&gt;&lt;/strong&gt; 与 &lt;strong&gt;&lt;code&gt;SN-2026-005&lt;/code&gt;&lt;/strong&gt; 涵盖了随 &lt;a href=&#34;https://github.com/pgsty/silo/releases/tag/RELEASE.2026-08-04T00-00-00Z&#34;&gt;Server 20260804&lt;/a&gt;（提交 &lt;code&gt;80c2c9d03&lt;/code&gt;、&lt;code&gt;2f55347f7&lt;/code&gt;、&lt;code&gt;eee05a17c&lt;/code&gt; 以及 &lt;a href=&#34;https://github.com/pgsty/silo-pkg/releases/tag/v3.12.0&#34;&gt;silo-pkg &lt;code&gt;v3.12.0&lt;/code&gt;&lt;/a&gt; 提交 &lt;code&gt;2b087a1&lt;/code&gt;；&lt;a href=&#34;https://github.com/pgsty/silo/issues/40&#34;&gt;&lt;code&gt;pgsty/silo#40&lt;/code&gt;&lt;/a&gt;、&lt;a href=&#34;https://github.com/pgsty/silo/issues/53&#34;&gt;&lt;code&gt;pgsty/silo#53&lt;/code&gt;&lt;/a&gt;）发布的一组 S3 IAM 策略求值加固：&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;SN-2026-003&lt;/code&gt;（&lt;code&gt;80c2c9d03&lt;/code&gt;）&lt;/strong&gt;：当请求未携带 &lt;code&gt;versionId&lt;/code&gt; 时，&lt;code&gt;getConditionValues&lt;/code&gt; 依然无条件写入了 &lt;code&gt;args.ConditionValues[&amp;quot;versionid&amp;quot;] = []string{&amp;quot;&amp;quot;}&lt;/code&gt;，导致针对 &lt;code&gt;s3:versionid&lt;/code&gt; 的 IAM &lt;code&gt;Null&lt;/code&gt; 条件恒判定为“键已存在”；而如果只修改 &lt;code&gt;getConditionValues&lt;/code&gt;，又会导致批量删除 &lt;code&gt;DeleteObjects&lt;/code&gt; 请求体中的 XML &lt;code&gt;&amp;lt;VersionId&amp;gt;&lt;/code&gt; 绕过版本条件策略，必须配合 &lt;code&gt;authorizeRequestWithTags&lt;/code&gt; 中的逐条重绑定一并修复。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;条件来源隔离（&lt;code&gt;2f55347f7&lt;/code&gt;）&lt;/strong&gt;：严格隔离 URL 查询参数、HTTP 请求头、服务端内部派生键以及 &lt;code&gt;s3:ExistingObjectTag/&amp;lt;key&amp;gt;&lt;/code&gt; 与 &lt;code&gt;s3:RequestObjectTag/&amp;lt;key&amp;gt;&lt;/code&gt;，防止不可信查询串或请求头伪造内部条件键。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;SN-2026-005&lt;/code&gt;（&lt;code&gt;2b087a1&lt;/code&gt; / &lt;code&gt;eee05a17c&lt;/code&gt;）&lt;/strong&gt;：新增 &lt;code&gt;ParseConfigStrict&lt;/code&gt;，在策略写入路径上拒绝退化的裸 ARN 前缀（&lt;code&gt;&amp;quot;arn:aws:s3:::&amp;quot;&lt;/code&gt; 与 &lt;code&gt;&amp;quot;*arn:aws:s3:::&amp;quot;&lt;/code&gt;）。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;summary&#34;&gt;结论先行&#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;无条件写入空字符串切片导致 &lt;code&gt;Null&lt;/code&gt; 判空反转&lt;/strong&gt;：在 &lt;code&gt;silo-pkg&lt;/code&gt; 中，&lt;code&gt;nullFunc.evaluate&lt;/code&gt; 通过检查键不存在或 &lt;code&gt;len(rvalues) == 0&lt;/code&gt; 来判定条件键为空（&lt;code&gt;Null&lt;/code&gt;）。由于 &lt;code&gt;getConditionValues&lt;/code&gt; 无条件执行 &lt;code&gt;args.ConditionValues[&amp;quot;versionid&amp;quot;] = []string{vid}&lt;/code&gt;（当 &lt;code&gt;vid == &amp;quot;&amp;quot;&lt;/code&gt; 时生成长度为 1 的 &lt;code&gt;[]string{&amp;quot;&amp;quot;}&lt;/code&gt;），&lt;code&gt;len(rvalues)&lt;/code&gt; 永远为 &lt;code&gt;1&lt;/code&gt;——导致 &lt;code&gt;Null: {&amp;quot;s3:versionid&amp;quot;: &amp;quot;true&amp;quot;}&lt;/code&gt; 永远为 &lt;code&gt;false&lt;/code&gt;，而 &lt;code&gt;Null: {&amp;quot;s3:versionid&amp;quot;: &amp;quot;false&amp;quot;}&lt;/code&gt; 永远为 &lt;code&gt;true&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;仅修改 &lt;code&gt;getConditionValues&lt;/code&gt; 会在 &lt;code&gt;DeleteObjects&lt;/code&gt; 上打开绕过口子&lt;/strong&gt;：在批量删除 &lt;code&gt;DeleteObjects&lt;/code&gt;（&lt;code&gt;POST /?delete&lt;/code&gt;）中，待删除的 &lt;code&gt;&amp;lt;VersionId&amp;gt;&lt;/code&gt; 位于 XML 请求体的每个 &lt;code&gt;&amp;lt;Object&amp;gt;&lt;/code&gt; 条目内，而非 URL 查询参数中。如果仅仅在 URL 没有 &lt;code&gt;versionId&lt;/code&gt; 时省略 &lt;code&gt;&amp;quot;versionid&amp;quot;&lt;/code&gt;，那么在 &lt;code&gt;DeleteObjects&lt;/code&gt; 逐条鉴权时，用于禁止删除指定版本的策略（如 &lt;code&gt;Condition: {&amp;quot;Null&amp;quot;: {&amp;quot;s3:versionid&amp;quot;: &amp;quot;false&amp;quot;}}&lt;/code&gt;）将因看不到 XML 中的 &lt;code&gt;&amp;lt;VersionId&amp;gt;&lt;/code&gt; 而彻底失效！因此必须在 &lt;code&gt;authorizeRequestWithTags&lt;/code&gt; 中根据 &lt;code&gt;ReqInfo.VersionID&lt;/code&gt; 动态重绑定 &lt;code&gt;ConditionValues[&amp;quot;versionid&amp;quot;]&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;空白字符归一化消除 &lt;code&gt;Deny&lt;/code&gt; 绕过&lt;/strong&gt;：业务 Handler 在读取 &lt;code&gt;versionId&lt;/code&gt; 时调用了 &lt;code&gt;strings.TrimSpace(r.URL.Query().Get(&amp;quot;versionId&amp;quot;))&lt;/code&gt;，而 &lt;code&gt;getConditionValues&lt;/code&gt; 却未做 &lt;code&gt;TrimSpace&lt;/code&gt;。攻击者只需传入 &lt;code&gt;?versionId=V%20&lt;/code&gt;（带尾随空格），即可在策略求值阶段绕过 &lt;code&gt;Deny StringEquals {&amp;quot;s3:versionid&amp;quot;: &amp;quot;V&amp;quot;}&lt;/code&gt;，随后在 Handler 阶段被去除空格并成功操作受保护的版本 &lt;code&gt;V&lt;/code&gt;。&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;the-defect&#34;&gt;为什么 &lt;code&gt;s3:versionid&lt;/code&gt; 上的 &lt;code&gt;Null&lt;/code&gt; 条件完全反了&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;在 &lt;code&gt;silo-pkg/bucket/policy/condition/nullfunc.go&lt;/code&gt; 中，IAM &lt;code&gt;Null&lt;/code&gt; 条件算子按如下逻辑检查请求上下文中是否缺失某个条件键：&lt;/p&gt;</description>
      </item>
    <item>
        <title>SN-2026-004：对象级策略授权越界命中桶级变更操作</title>
        <link>https://silo.pgsty.com/zh/blog/security/object-grant-bucket-reach/</link>
        <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://silo.pgsty.com/zh/blog/security/object-grant-bucket-reach/</guid>
        <description>&lt;p&gt;&lt;strong&gt;&lt;code&gt;SN-2026-004&lt;/code&gt;&lt;/strong&gt; 修复了 &lt;a href=&#34;https://github.com/pgsty/silo-pkg/releases/tag/v3.11.0&#34;&gt;silo-pkg &lt;code&gt;v3.11.0&lt;/code&gt;&lt;/a&gt;（提交 &lt;code&gt;3c24ad1&lt;/code&gt;、&lt;code&gt;1f97549&lt;/code&gt;、&lt;code&gt;d8b1fa7&lt;/code&gt;）与 &lt;a href=&#34;https://github.com/pgsty/silo/releases/tag/RELEASE.2026-08-04T00-00-00Z&#34;&gt;Server 20260804&lt;/a&gt;（&lt;code&gt;97b7d2804&lt;/code&gt;；上游参考 &lt;a href=&#34;https://github.com/minio/minio/issues/20449&#34;&gt;&lt;code&gt;minio/minio#20449&lt;/code&gt;&lt;/a&gt;）中的一处 IAM 资源匹配缺陷：在评估桶级 S3 请求（&lt;code&gt;args.ObjectName == &amp;quot;&amp;quot;&lt;/code&gt;）时，&lt;code&gt;Statement.IsAllowed&lt;/code&gt; 会固定在桶名末尾拼接 &lt;code&gt;&#39;/&#39;&lt;/code&gt; 生成 &lt;code&gt;&amp;quot;bucket/&amp;quot;&lt;/code&gt; 作为待匹配资源字符串，导致原本仅面向桶内对象的通配授权（如 &lt;code&gt;Allow s3:* on arn:aws:s3:::bucket/*&lt;/code&gt;）能够越界放行 &lt;code&gt;s3:PutBucketPolicy&lt;/code&gt;、&lt;code&gt;s3:DeleteBucket&lt;/code&gt; 等高危桶级变更操作。&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
