Skip to content

Commit 33800a2

Browse files
tas50claude
andauthored
🐛 Fix nil pointer dereferences in EC2, Elasticsearch, Config, Inspector (#6924)
- EC2: guard device.Ebs, instance.Monitoring, instance.State against nil - Elasticsearch: nil-check EncryptionAtRestOptions and NodeToNodeEncryptionOptions (matching OpenSearch pattern) - Config: nil-check RecordingGroup before accessing fields - Inspector: nil-check ScanStatus and AmiId before dereferencing Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent 0cdb80c commit 33800a2

File tree

4 files changed

+44
-12
lines changed

4 files changed

+44
-12
lines changed

providers/aws/resources/aws_config.go

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,22 @@ func (a *mqlAwsConfig) getRecorders(conn *connection.AwsConnection) []*jobpool.J
7373
recording = val.recording
7474
lastStatus = val.lastStatus
7575
}
76-
resourceTypesInterface := make([]any, len(r.RecordingGroup.ResourceTypes))
77-
for i, resourceType := range r.RecordingGroup.ResourceTypes {
78-
resourceTypesInterface[i] = string(resourceType)
76+
var resourceTypesInterface []any
77+
var allSupported, includeGlobalResourceTypes bool
78+
if r.RecordingGroup != nil {
79+
resourceTypesInterface = make([]any, len(r.RecordingGroup.ResourceTypes))
80+
for i, resourceType := range r.RecordingGroup.ResourceTypes {
81+
resourceTypesInterface[i] = string(resourceType)
82+
}
83+
allSupported = r.RecordingGroup.AllSupported
84+
includeGlobalResourceTypes = r.RecordingGroup.IncludeGlobalResourceTypes
7985
}
8086
mqlRecorder, err := CreateResource(a.MqlRuntime, "aws.config.recorder",
8187
map[string]*llx.RawData{
8288
"name": llx.StringDataPtr(r.Name),
8389
"roleArn": llx.StringDataPtr(r.RoleARN),
84-
"allSupported": llx.BoolData(r.RecordingGroup.AllSupported),
85-
"includeGlobalResourceTypes": llx.BoolData(r.RecordingGroup.IncludeGlobalResourceTypes),
90+
"allSupported": llx.BoolData(allSupported),
91+
"includeGlobalResourceTypes": llx.BoolData(includeGlobalResourceTypes),
8692
"resourceTypes": llx.ArrayData(resourceTypesInterface, types.String),
8793
"recording": llx.BoolData(recording),
8894
"region": llx.StringData(region),

providers/aws/resources/aws_ec2.go

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1084,6 +1084,9 @@ func (a *mqlAwsEc2) gatherInstanceInfo(instances []ec2types.Instance, regionVal
10841084
for _, instance := range instances {
10851085
mqlDevices := []any{}
10861086
for _, device := range instance.BlockDeviceMappings {
1087+
if device.Ebs == nil {
1088+
continue
1089+
}
10871090
mqlInstanceDevice, err := CreateResource(a.MqlRuntime, ResourceAwsEc2InstanceDevice,
10881091
map[string]*llx.RawData{
10891092
"deleteOnTermination": llx.BoolData(convert.ToValue(device.Ebs.DeleteOnTermination)),
@@ -1112,11 +1115,19 @@ func (a *mqlAwsEc2) gatherInstanceInfo(instances []ec2types.Instance, regionVal
11121115
stateTransitionTime = llx.NeverPastTime
11131116
}
11141117
}
1118+
var detailedMonitoring string
1119+
if instance.Monitoring != nil {
1120+
detailedMonitoring = string(instance.Monitoring.State)
1121+
}
1122+
var stateName string
1123+
if instance.State != nil {
1124+
stateName = string(instance.State.Name)
1125+
}
11151126
instanceArn := fmt.Sprintf(ec2InstanceArnPattern, regionVal, conn.AccountId(), convert.ToValue(instance.InstanceId))
11161127
args := map[string]*llx.RawData{
11171128
"architecture": llx.StringData(string(instance.Architecture)),
11181129
"arn": llx.StringData(instanceArn),
1119-
"detailedMonitoring": llx.StringData(string(instance.Monitoring.State)),
1130+
"detailedMonitoring": llx.StringData(detailedMonitoring),
11201131
"deviceMappings": llx.ArrayData(mqlDevices, types.Type(ResourceAwsEc2InstanceDevice)),
11211132
"ebsOptimized": llx.BoolDataPtr(instance.EbsOptimized),
11221133
"enaSupported": llx.BoolDataPtr(instance.EnaSupport),
@@ -1134,7 +1145,7 @@ func (a *mqlAwsEc2) gatherInstanceInfo(instances []ec2types.Instance, regionVal
11341145
"region": llx.StringData(regionVal),
11351146
"rootDeviceName": llx.StringDataPtr(instance.RootDeviceName),
11361147
"rootDeviceType": llx.StringData(string(instance.RootDeviceType)),
1137-
"state": llx.StringData(string(instance.State.Name)),
1148+
"state": llx.StringData(stateName),
11381149
"stateReason": llx.MapData(stateReason, types.Any),
11391150
// "iamInstanceProfile": llx.MapData(iamInstanceProfile, types.Any),
11401151
"stateTransitionReason": llx.StringDataPtr(instance.StateTransitionReason),

providers/aws/resources/aws_es.go

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,8 +139,16 @@ func initAwsEsDomain(runtime *plugin.Runtime, args map[string]*llx.RawData) (map
139139
if err != nil {
140140
return nil, nil, err
141141
}
142-
args["encryptionAtRestEnabled"] = llx.BoolData(convert.ToValue(domainDetails.DomainStatus.EncryptionAtRestOptions.Enabled))
143-
args["nodeToNodeEncryptionEnabled"] = llx.BoolData(convert.ToValue(domainDetails.DomainStatus.NodeToNodeEncryptionOptions.Enabled))
142+
var encryptionAtRestEnabled bool
143+
if domainDetails.DomainStatus.EncryptionAtRestOptions != nil {
144+
encryptionAtRestEnabled = convert.ToValue(domainDetails.DomainStatus.EncryptionAtRestOptions.Enabled)
145+
}
146+
args["encryptionAtRestEnabled"] = llx.BoolData(encryptionAtRestEnabled)
147+
var nodeToNodeEncryptionEnabled bool
148+
if domainDetails.DomainStatus.NodeToNodeEncryptionOptions != nil {
149+
nodeToNodeEncryptionEnabled = convert.ToValue(domainDetails.DomainStatus.NodeToNodeEncryptionOptions.Enabled)
150+
}
151+
args["nodeToNodeEncryptionEnabled"] = llx.BoolData(nodeToNodeEncryptionEnabled)
144152
args["endpoint"] = llx.StringDataPtr(domainDetails.DomainStatus.Endpoint)
145153
args["arn"] = llx.StringDataPtr(domainDetails.DomainStatus.ARN)
146154
args["elasticsearchVersion"] = llx.StringDataPtr(domainDetails.DomainStatus.ElasticsearchVersion)

providers/aws/resources/aws_inspector.go

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,19 @@ func (a *mqlAwsInspector) getCoverage(conn *connection.AwsConnection) []*jobpool
7373
if coverage.AccountId == nil || coverage.ResourceId == nil {
7474
continue
7575
}
76+
var statusReason, statusCode string
77+
if coverage.ScanStatus != nil {
78+
statusReason = string(coverage.ScanStatus.Reason)
79+
statusCode = string(coverage.ScanStatus.StatusCode)
80+
}
7681
mqlCoverage, err := CreateResource(a.MqlRuntime, "aws.inspector.coverage",
7782
map[string]*llx.RawData{
7883
"accountId": llx.StringDataPtr(coverage.AccountId),
7984
"resourceId": llx.StringDataPtr(coverage.ResourceId),
8085
"resourceType": llx.StringData(string(coverage.ResourceType)),
8186
"lastScannedAt": llx.TimeDataPtr(coverage.LastScannedAt),
82-
"statusReason": llx.StringData(string(coverage.ScanStatus.Reason)),
83-
"statusCode": llx.StringData(string(coverage.ScanStatus.StatusCode)),
87+
"statusReason": llx.StringData(statusReason),
88+
"statusCode": llx.StringData(statusCode),
8489
"scanType": llx.StringData(string(coverage.ScanType)),
8590
"region": llx.StringData(region),
8691
},
@@ -131,7 +136,9 @@ func (a *mqlAwsInspectorCoverage) ec2Instance() (*mqlAwsInspectorCoverageInstanc
131136
}
132137
mqlEc2Instance, err := CreateResource(a.MqlRuntime, "aws.inspector.coverage.instance", args)
133138
if err == nil {
134-
mqlEc2Instance.(*mqlAwsInspectorCoverageInstance).cacheAmiId = *a.cacheCoverage.ResourceMetadata.Ec2.AmiId
139+
if a.cacheCoverage.ResourceMetadata.Ec2.AmiId != nil {
140+
mqlEc2Instance.(*mqlAwsInspectorCoverageInstance).cacheAmiId = *a.cacheCoverage.ResourceMetadata.Ec2.AmiId
141+
}
135142
return mqlEc2Instance.(*mqlAwsInspectorCoverageInstance), err
136143
}
137144
}

0 commit comments

Comments
 (0)