<?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>Authorization on SILO</title>
    <link>https://silo.pgsty.com/tags/authorization/</link>
    <description>Recent content in Authorization on SILO</description>
    <generator>Hugo</generator>
    <language>en</language>
    
    
    
      <lastBuildDate>Sat, 24 Oct 2026 18:19:49 +0800</lastBuildDate>
    
    
      <atom:link href="https://silo.pgsty.com/tags/authorization/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
        <title>SN-2026-004: Object-Scoped Policy Grants Reaching Bucket Mutations</title>
        <link>https://silo.pgsty.com/blog/security/object-grant-bucket-reach/</link>
        <pubDate>Tue, 04 Aug 2026 00:00:00 +0000</pubDate>
        
        <guid>https://silo.pgsty.com/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; fixes an IAM resource-matching flaw in &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;) and &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;; upstream reference &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;): when evaluating bucket-level S3 requests (&lt;code&gt;args.ObjectName == &amp;quot;&amp;quot;&lt;/code&gt;), &lt;code&gt;Statement.IsAllowed&lt;/code&gt; synthesized &lt;code&gt;&amp;quot;bucket/&amp;quot;&lt;/code&gt; as the target resource string, allowing object-scoped wildcard grants such as &lt;code&gt;Allow s3:* on arn:aws:s3:::bucket/*&lt;/code&gt; to authorize sensitive bucket-level mutations including &lt;code&gt;s3:PutBucketPolicy&lt;/code&gt; and &lt;code&gt;s3:DeleteBucket&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;summary&#34;&gt;Conclusions first&#xA;&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Root cause&lt;/strong&gt;: When &lt;code&gt;args.ObjectName&lt;/code&gt; was empty, &lt;code&gt;Statement.IsAllowed&lt;/code&gt; appended &lt;code&gt;&#39;/&#39;&lt;/code&gt; to the bucket name (&lt;code&gt;&amp;quot;bucket/&amp;quot;&lt;/code&gt;), which matched the glob &lt;code&gt;&amp;quot;arn:aws:s3:::bucket/*&amp;quot;&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Privilege escalation&lt;/strong&gt;: A tenant principal given &lt;code&gt;Allow s3:* on arn:aws:s3:::tenant/*&lt;/code&gt; (a common shorthand for &amp;ldquo;all object operations inside this bucket&amp;rdquo;) could call &lt;code&gt;PutBucketPolicy&lt;/code&gt; to grant &lt;code&gt;Principal: &amp;quot;*&amp;quot;&lt;/code&gt; on the bucket, or call &lt;code&gt;DeleteBucket&lt;/code&gt;, &lt;code&gt;PutReplicationConfiguration&lt;/code&gt;, &lt;code&gt;PutBucketLifecycle&lt;/code&gt;, &lt;code&gt;PutBucketVersioning&lt;/code&gt;, or &lt;code&gt;PutBucketObjectLockConfiguration&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Why a targeted fix was required&lt;/strong&gt;: Simply dropping the trailing &lt;code&gt;&#39;/&#39;&lt;/code&gt; for all empty-object checks broke 11 existing STS &lt;code&gt;ListBucket&lt;/code&gt; tests and weakened &lt;code&gt;Deny s3:* on arn:aws:s3:::bucket/*&lt;/code&gt; policies.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Targeted boundary&lt;/strong&gt;: For the 12 sensitive bucket-mutation actions on &lt;code&gt;Allow&lt;/code&gt; statements (&lt;code&gt;!legacyBucketResourceMatch &amp;amp;&amp;amp; statement.Effect == Allow &amp;amp;&amp;amp; isSensitiveBucketMutation(args.Action)&lt;/code&gt;), the resource pattern must match &lt;strong&gt;both&lt;/strong&gt; &lt;code&gt;&amp;quot;bucket&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;bucket/&amp;quot;&lt;/code&gt;. Setting &lt;code&gt;MINIO_API_LEGACY_BUCKET_RESOURCE_MATCH=on&lt;/code&gt; restores pre-&lt;code&gt;20260804&lt;/code&gt; matching if a deployment temporarily relies on legacy policies.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;the-defect&#34;&gt;Why &lt;code&gt;arn:aws:s3:::bucket/*&lt;/code&gt; Matched Bucket Requests&#xA;&lt;/h2&gt;&#xA;&lt;p&gt;In &lt;code&gt;silo-pkg/bucket/policy/statement.go&lt;/code&gt; (and &lt;code&gt;iam/policy/statement.go&lt;/code&gt;), &lt;code&gt;Statement.IsAllowed(args Args)&lt;/code&gt; constructed the resource string to test against &lt;code&gt;Statement.Resources&lt;/code&gt; as follows:&lt;/p&gt;</description>
      </item>
    
  </channel>
</rss>
