github.com/khulnasoft-lab/defsec@v1.0.5-0.20230827010352-5e9f46893d95/rules/cloud/policies/aws/sam/no_function_policy_wildcards.go (about)

     1  package sam
     2  
     3  import (
     4  	"strings"
     5  
     6  	"github.com/khulnasoft-lab/defsec/pkg/providers/aws/iam"
     7  	"github.com/khulnasoft-lab/defsec/pkg/severity"
     8  
     9  	"github.com/khulnasoft-lab/defsec/pkg/state"
    10  
    11  	"github.com/khulnasoft-lab/defsec/pkg/scan"
    12  
    13  	"github.com/khulnasoft-lab/defsec/internal/rules"
    14  
    15  	"github.com/khulnasoft-lab/defsec/pkg/providers"
    16  
    17  	"github.com/liamg/iamgo"
    18  )
    19  
    20  var CheckNoFunctionPolicyWildcards = rules.Register(
    21  	scan.Rule{
    22  		AVDID:       "AVD-AWS-0114",
    23  		Provider:    providers.AWSProvider,
    24  		Service:     "sam",
    25  		ShortCode:   "no-function-policy-wildcards",
    26  		Summary:     "Function policies should avoid use of wildcards and instead apply the principle of least privilege",
    27  		Impact:      "Overly permissive policies may grant access to sensitive resources",
    28  		Resolution:  "Specify the exact permissions required, and to which resources they should apply instead of using wildcards.",
    29  		Explanation: `You should use the principle of least privilege when defining your IAM policies. This means you should specify each exact permission required without using wildcards, as this could cause the granting of access to certain undesired actions, resources and principals.`,
    30  		Links: []string{
    31  			"https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-policies",
    32  		},
    33  		CloudFormation: &scan.EngineMetadata{
    34  			GoodExamples:        cloudFormationNoFunctionPolicyWildcardsGoodExamples,
    35  			BadExamples:         cloudFormationNoFunctionPolicyWildcardsBadExamples,
    36  			Links:               cloudFormationNoFunctionPolicyWildcardsLinks,
    37  			RemediationMarkdown: cloudFormationNoFunctionPolicyWildcardsRemediationMarkdown,
    38  		},
    39  		Severity: severity.High,
    40  	},
    41  	func(s *state.State) (results scan.Results) {
    42  
    43  		for _, function := range s.AWS.SAM.Functions {
    44  			if function.Metadata.IsUnmanaged() {
    45  				continue
    46  			}
    47  
    48  			for _, document := range function.Policies {
    49  				policy := document.Document.Parsed
    50  				statements, _ := policy.Statements()
    51  				for _, statement := range statements {
    52  					results = checkStatement(document.Document, statement, results)
    53  				}
    54  			}
    55  		}
    56  		return
    57  	},
    58  )
    59  
    60  func checkStatement(document iam.Document, statement iamgo.Statement, results scan.Results) scan.Results {
    61  	effect, _ := statement.Effect()
    62  	if effect != iamgo.EffectAllow {
    63  		return results
    64  	}
    65  	actions, r := statement.Actions()
    66  	for _, action := range actions {
    67  		if strings.Contains(action, "*") {
    68  			results.Add(
    69  				"Policy document uses a wildcard action.",
    70  				document.MetadataFromIamGo(statement.Range(), r),
    71  			)
    72  		} else {
    73  			results.AddPassed(document)
    74  		}
    75  	}
    76  	resources, r := statement.Resources()
    77  	for _, resource := range resources {
    78  		if strings.Contains(resource, "*") {
    79  			if ok, _ := iam.IsWildcardAllowed(actions...); !ok {
    80  				if strings.HasSuffix(resource, "/*") && strings.HasPrefix(resource, "arn:aws:s3") {
    81  					continue
    82  				}
    83  				results.Add(
    84  					"Policy document uses a wildcard resource for sensitive action(s).",
    85  					document.MetadataFromIamGo(statement.Range(), r),
    86  				)
    87  			} else {
    88  				results.AddPassed(document)
    89  			}
    90  		} else {
    91  			results.AddPassed(document)
    92  		}
    93  	}
    94  	principals, _ := statement.Principals()
    95  	if all, r := principals.All(); all {
    96  		results.Add(
    97  			"Policy document uses a wildcard principal.",
    98  			document.MetadataFromIamGo(statement.Range(), r),
    99  		)
   100  	}
   101  	aws, r := principals.AWS()
   102  	for _, principal := range aws {
   103  		if strings.Contains(principal, "*") {
   104  			results.Add(
   105  				"Policy document uses a wildcard principal.",
   106  				document.MetadataFromIamGo(statement.Range(), r),
   107  			)
   108  		} else {
   109  			results.AddPassed(document)
   110  		}
   111  	}
   112  	return results
   113  }