1
1
package ec2
2
2
3
3
import (
4
+ "golang.org/x/exp/maps"
5
+
4
6
"github.com/aquasecurity/trivy/pkg/iac/providers/aws/ec2"
5
7
"github.com/aquasecurity/trivy/pkg/iac/scanners/cloudformation/parser"
6
8
"github.com/aquasecurity/trivy/pkg/iac/types"
7
9
)
8
10
9
- func getSecurityGroups (ctx parser.FileContext ) (groups []ec2.SecurityGroup ) {
11
+ func getSecurityGroups (ctx parser.FileContext ) []ec2.SecurityGroup {
12
+ mGroups := make (map [string ]ec2.SecurityGroup )
13
+
10
14
for _ , r := range ctx .GetResourcesByType ("AWS::EC2::SecurityGroup" ) {
11
15
group := ec2.SecurityGroup {
12
16
Metadata : r .Metadata (),
@@ -17,52 +21,69 @@ func getSecurityGroups(ctx parser.FileContext) (groups []ec2.SecurityGroup) {
17
21
VPCID : r .GetStringProperty ("VpcId" ),
18
22
}
19
23
20
- groups = append (groups , group )
24
+ mGroups [r .ID ()] = group
25
+ }
26
+
27
+ for _ , r := range ctx .GetResourcesByType ("AWS::EC2::SecurityGroupIngress" ) {
28
+ groupID := r .GetProperty ("GroupId" ).AsString ()
29
+
30
+ if group , ok := mGroups [groupID ]; ok {
31
+ group .IngressRules = append (group .IngressRules , adaptRule (r ))
32
+ mGroups [groupID ] = group
33
+ }
21
34
}
22
- return groups
35
+
36
+ for _ , r := range ctx .GetResourcesByType ("AWS::EC2::SecurityGroupEgress" ) {
37
+ groupID := r .GetProperty ("GroupId" ).AsString ()
38
+
39
+ if group , ok := mGroups [groupID ]; ok {
40
+ group .EgressRules = append (group .EgressRules , adaptRule (r ))
41
+ mGroups [groupID ] = group
42
+ }
43
+ }
44
+
45
+ if len (mGroups ) > 0 {
46
+ return maps .Values (mGroups )
47
+ }
48
+ return nil
23
49
}
24
50
25
51
func getIngressRules (r * parser.Resource ) (sgRules []ec2.SecurityGroupRule ) {
26
52
if ingressProp := r .GetProperty ("SecurityGroupIngress" ); ingressProp .IsList () {
27
53
for _ , ingress := range ingressProp .AsList () {
28
- rule := ec2.SecurityGroupRule {
29
- Metadata : ingress .Metadata (),
30
- Description : ingress .GetStringProperty ("Description" ),
31
- CIDRs : nil ,
32
- }
33
- v4Cidr := ingress .GetProperty ("CidrIp" )
34
- if v4Cidr .IsString () && v4Cidr .AsStringValue ().IsNotEmpty () {
35
- rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v4Cidr .AsString (), v4Cidr .Metadata ()))
36
- }
37
- v6Cidr := ingress .GetProperty ("CidrIpv6" )
38
- if v6Cidr .IsString () && v6Cidr .AsStringValue ().IsNotEmpty () {
39
- rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v6Cidr .AsString (), v6Cidr .Metadata ()))
40
- }
41
-
42
- sgRules = append (sgRules , rule )
54
+ sgRules = append (sgRules , adaptRule (ingress ))
43
55
}
44
56
}
57
+
45
58
return sgRules
46
59
}
47
60
48
61
func getEgressRules (r * parser.Resource ) (sgRules []ec2.SecurityGroupRule ) {
49
62
if egressProp := r .GetProperty ("SecurityGroupEgress" ); egressProp .IsList () {
50
63
for _ , egress := range egressProp .AsList () {
51
- rule := ec2.SecurityGroupRule {
52
- Metadata : egress .Metadata (),
53
- Description : egress .GetStringProperty ("Description" ),
54
- }
55
- v4Cidr := egress .GetProperty ("CidrIp" )
56
- if v4Cidr .IsString () && v4Cidr .AsStringValue ().IsNotEmpty () {
57
- rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v4Cidr .AsString (), v4Cidr .Metadata ()))
58
- }
59
- v6Cidr := egress .GetProperty ("CidrIpv6" )
60
- if v6Cidr .IsString () && v6Cidr .AsStringValue ().IsNotEmpty () {
61
- rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v6Cidr .AsString (), v6Cidr .Metadata ()))
62
- }
63
-
64
- sgRules = append (sgRules , rule )
64
+ sgRules = append (sgRules , adaptRule (egress ))
65
65
}
66
66
}
67
67
return sgRules
68
68
}
69
+
70
+ func adaptRule (r interface {
71
+ GetProperty (string ) * parser.Property
72
+ Metadata () types.Metadata
73
+ GetStringProperty (string , ... string ) types.StringValue
74
+ }) ec2.SecurityGroupRule {
75
+ rule := ec2.SecurityGroupRule {
76
+ Metadata : r .Metadata (),
77
+ Description : r .GetStringProperty ("Description" ),
78
+ }
79
+ v4Cidr := r .GetProperty ("CidrIp" )
80
+ if v4Cidr .IsString () && v4Cidr .AsStringValue ().IsNotEmpty () {
81
+ rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v4Cidr .AsString (), v4Cidr .Metadata ()))
82
+ }
83
+ v6Cidr := r .GetProperty ("CidrIpv6" )
84
+ if v6Cidr .IsString () && v6Cidr .AsStringValue ().IsNotEmpty () {
85
+ rule .CIDRs = append (rule .CIDRs , types .StringExplicit (v6Cidr .AsString (), v6Cidr .Metadata ()))
86
+ }
87
+
88
+ return rule
89
+ }
0 commit comments