Skip to content

Commit 3f6c0e6

Browse files
committed
fix: Prioritize explicit deny in bucket policy statements
1 parent 3e7654e commit 3f6c0e6

File tree

3 files changed

+90
-3
lines changed

3 files changed

+90
-3
lines changed

auth/bucket_policy.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -47,19 +47,19 @@ func (bp *BucketPolicy) Validate(bucket string, iam IAMService) error {
4747
return nil
4848
}
4949

50-
func (bp *BucketPolicy) isAllowed(principal string, action Action, resource string) bool {
50+
func (bp *BucketPolicy) isAllowed(principal string, action Action, resource string) (isAllowed bool) {
5151
for _, statement := range bp.Statement {
5252
if statement.findMatch(principal, action, resource) {
5353
switch statement.Effect {
5454
case BucketPolicyAccessTypeAllow:
55-
return true
55+
isAllowed = true
5656
case BucketPolicyAccessTypeDeny:
5757
return false
5858
}
5959
}
6060
}
6161

62-
return false
62+
return
6363
}
6464

6565
type BucketPolicyItem struct {

tests/integration/group-tests.go

+2
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ func TestPutBucketPolicy(s *S3Conf) {
471471
PutBucketPolicy_incorrect_bucket_name(s)
472472
PutBucketPolicy_object_action_on_bucket_resource(s)
473473
PutBucketPolicy_bucket_action_on_object_resource(s)
474+
PutBucketPolicy_explicit_deny(s)
474475
PutBucketPolicy_success(s)
475476
}
476477

@@ -1042,6 +1043,7 @@ func GetIntTests() IntTests {
10421043
"PutBucketPolicy_duplicate_resource": PutBucketPolicy_duplicate_resource,
10431044
"PutBucketPolicy_incorrect_bucket_name": PutBucketPolicy_incorrect_bucket_name,
10441045
"PutBucketPolicy_object_action_on_bucket_resource": PutBucketPolicy_object_action_on_bucket_resource,
1046+
"PutBucketPolicy_explicit_deny": PutBucketPolicy_explicit_deny,
10451047
"PutBucketPolicy_bucket_action_on_object_resource": PutBucketPolicy_bucket_action_on_object_resource,
10461048
"PutBucketPolicy_success": PutBucketPolicy_success,
10471049
"GetBucketPolicy_non_existing_bucket": GetBucketPolicy_non_existing_bucket,

tests/integration/tests.go

+85
Original file line numberDiff line numberDiff line change
@@ -11196,6 +11196,91 @@ func PutBucketPolicy_bucket_action_on_object_resource(s *S3Conf) error {
1119611196
})
1119711197
}
1119811198

11199+
func PutBucketPolicy_explicit_deny(s *S3Conf) error {
11200+
testName := "PutBucketPolicy_object_action_on_bucket_resource"
11201+
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {
11202+
user2 := user{"grt2", "grt2secret", "user"}
11203+
err := createUsers(s, []user{
11204+
{"grt1", "grt1secret", "user"},
11205+
user2,
11206+
})
11207+
if err != nil {
11208+
return err
11209+
}
11210+
11211+
resource := fmt.Sprintf("arn:aws:s3:::%v", bucket)
11212+
resourceWildCard := fmt.Sprintf("%v/*", resource)
11213+
resourcePrefix := fmt.Sprintf("%v/someprefix/*", resource)
11214+
11215+
policy := fmt.Sprintf(`
11216+
{
11217+
"Statement": [
11218+
{
11219+
"Action": [
11220+
"s3:*"
11221+
],
11222+
"Effect": "Allow",
11223+
"Principal": [
11224+
"grt1"
11225+
],
11226+
"Resource": [
11227+
"%v",
11228+
"%v"
11229+
]
11230+
},
11231+
{
11232+
"Action": [
11233+
"s3:*"
11234+
],
11235+
"Effect": "Allow",
11236+
"Principal": [
11237+
"grt2"
11238+
],
11239+
"Resource": [
11240+
"%v",
11241+
"%v"
11242+
]
11243+
},
11244+
{
11245+
"Action": [
11246+
"s3:*"
11247+
],
11248+
"Effect": "Deny",
11249+
"Principal": [
11250+
"grt2"
11251+
],
11252+
"Resource": "%v"
11253+
}
11254+
]
11255+
}
11256+
`, resourcePrefix, resource, resourceWildCard, resource, resourcePrefix)
11257+
11258+
ctx, cancel := context.WithTimeout(context.Background(), shortTimeout)
11259+
_, err = s3client.PutBucketPolicy(ctx, &s3.PutBucketPolicyInput{
11260+
Bucket: &bucket,
11261+
Policy: &policy,
11262+
})
11263+
cancel()
11264+
if err != nil {
11265+
return err
11266+
}
11267+
11268+
userClient := getUserS3Client(user2, s)
11269+
11270+
ctx, cancel = context.WithTimeout(context.Background(), shortTimeout)
11271+
_, err = userClient.PutObject(ctx, &s3.PutObjectInput{
11272+
Bucket: &bucket,
11273+
Key: getPtr("someprefix/hello"),
11274+
})
11275+
cancel()
11276+
if err := checkApiErr(err, s3err.GetAPIError(s3err.ErrAccessDenied)); err != nil {
11277+
return err
11278+
}
11279+
11280+
return nil
11281+
})
11282+
}
11283+
1119911284
func PutBucketPolicy_success(s *S3Conf) error {
1120011285
testName := "PutBucketPolicy_success"
1120111286
return actionHandler(s, testName, func(s3client *s3.Client, bucket string) error {

0 commit comments

Comments
 (0)