codeslick-cli 1.3.0 → 1.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +50 -11
- package/dist/packages/cli/src/scanner/local-scanner.d.ts +2 -2
- package/dist/packages/cli/src/scanner/local-scanner.d.ts.map +1 -1
- package/dist/packages/cli/src/scanner/local-scanner.js +10 -1
- package/dist/packages/cli/src/scanner/local-scanner.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js +1 -1
- package/dist/src/lib/analyzers/secrets/patterns/credentials.js.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts +4 -0
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.d.ts.map +1 -1
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js +48 -4
- package/dist/src/lib/analyzers/secrets/secrets-analyzer.js.map +1 -1
- package/dist/src/lib/analyzers/terraform/aws-checks.d.ts +71 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.js +538 -0
- package/dist/src/lib/analyzers/terraform/aws-checks.js.map +1 -0
- package/dist/src/lib/analyzers/terraform/parser.d.ts +14 -0
- package/dist/src/lib/analyzers/terraform/parser.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/parser.js +237 -0
- package/dist/src/lib/analyzers/terraform/parser.js.map +1 -0
- package/dist/src/lib/analyzers/terraform/types.d.ts +70 -0
- package/dist/src/lib/analyzers/terraform/types.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform/types.js +9 -0
- package/dist/src/lib/analyzers/terraform/types.js.map +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts +49 -0
- package/dist/src/lib/analyzers/terraform-analyzer.d.ts.map +1 -0
- package/dist/src/lib/analyzers/terraform-analyzer.js +140 -0
- package/dist/src/lib/analyzers/terraform-analyzer.js.map +1 -0
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.d.ts.map +1 -1
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js +23 -8
- package/dist/src/lib/analyzers/typescript/security-checks/type-security.js.map +1 -1
- package/dist/src/lib/security/epss-service.d.ts.map +1 -1
- package/dist/src/lib/security/epss-service.js +64 -50
- package/dist/src/lib/security/epss-service.js.map +1 -1
- package/dist/src/lib/security/severity-scoring.d.ts.map +1 -1
- package/dist/src/lib/security/severity-scoring.js +116 -0
- package/dist/src/lib/security/severity-scoring.js.map +1 -1
- package/dist/src/lib/types/index.d.ts +1 -1
- package/dist/src/lib/types/index.d.ts.map +1 -1
- package/package.json +10 -7
- package/src/scanner/local-scanner.ts +13 -2
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Terraform AWS Security Checks
|
|
4
|
+
*
|
|
5
|
+
* WR3 Day 1-2: AWS S3 and IAM security misconfigurations
|
|
6
|
+
*
|
|
7
|
+
* Current: 10 checks (S3: 5, IAM: 5)
|
|
8
|
+
* Future: Will expand to EC2, RDS, Lambda (25 total AWS checks)
|
|
9
|
+
*/
|
|
10
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
11
|
+
exports.checkS3PublicACL = checkS3PublicACL;
|
|
12
|
+
exports.checkS3Encryption = checkS3Encryption;
|
|
13
|
+
exports.checkS3Versioning = checkS3Versioning;
|
|
14
|
+
exports.checkS3Logging = checkS3Logging;
|
|
15
|
+
exports.checkS3PublicAccessBlock = checkS3PublicAccessBlock;
|
|
16
|
+
exports.checkIAMWildcardActions = checkIAMWildcardActions;
|
|
17
|
+
exports.checkIAMWildcardResources = checkIAMWildcardResources;
|
|
18
|
+
exports.checkIAMAdminPolicy = checkIAMAdminPolicy;
|
|
19
|
+
exports.checkIAMPrivilegeEscalation = checkIAMPrivilegeEscalation;
|
|
20
|
+
exports.checkIAMAssumeRolePolicy = checkIAMAssumeRolePolicy;
|
|
21
|
+
const parser_1 = require("./parser");
|
|
22
|
+
// ==========================================
|
|
23
|
+
// AWS S3 Security Checks (5 checks)
|
|
24
|
+
// ==========================================
|
|
25
|
+
/**
|
|
26
|
+
* Check 1: S3 Bucket with Public ACL (CRITICAL)
|
|
27
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
28
|
+
* CWE: CWE-732 (Incorrect Permission Assignment)
|
|
29
|
+
*/
|
|
30
|
+
function checkS3PublicACL(resource) {
|
|
31
|
+
if (resource.resourceType !== 'aws_s3_bucket')
|
|
32
|
+
return null;
|
|
33
|
+
const acl = (0, parser_1.getAttribute)(resource, 'acl');
|
|
34
|
+
const publicACLs = ['public-read', 'public-read-write', 'authenticated-read'];
|
|
35
|
+
if (publicACLs.includes(acl)) {
|
|
36
|
+
return {
|
|
37
|
+
severity: 'critical',
|
|
38
|
+
message: `S3 bucket "${resource.resourceName}" has public ACL: "${acl}"`,
|
|
39
|
+
line: resource.startLine,
|
|
40
|
+
suggestion: 'Remove public ACL and use bucket policies with specific principals instead',
|
|
41
|
+
category: 'Broken Access Control',
|
|
42
|
+
cvssScore: 9.1,
|
|
43
|
+
exploitLikelihood: 'high',
|
|
44
|
+
impact: 'data-breach',
|
|
45
|
+
owasp: 'A01:2021',
|
|
46
|
+
cwe: 'CWE-732',
|
|
47
|
+
pciDss: '6.5.8',
|
|
48
|
+
attackVector: {
|
|
49
|
+
description: 'Public S3 bucket allows unrestricted internet access to stored data',
|
|
50
|
+
exploitExample: 'aws s3 ls s3://bucket-name --no-sign-request',
|
|
51
|
+
realWorldImpact: [
|
|
52
|
+
'Unauthorized data access and theft',
|
|
53
|
+
'Compliance violations (GDPR, HIPAA)',
|
|
54
|
+
'Ransomware attacks on public buckets',
|
|
55
|
+
],
|
|
56
|
+
},
|
|
57
|
+
remediation: {
|
|
58
|
+
before: `resource "aws_s3_bucket" "${resource.resourceName}" {\n acl = "${acl}"\n}`,
|
|
59
|
+
after: `resource "aws_s3_bucket" "${resource.resourceName}" {\n # Private bucket (default)\n}`,
|
|
60
|
+
explanation: 'Remove public ACL and control access via bucket policies or IAM roles',
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Check 2: S3 Bucket Without Encryption (HIGH)
|
|
68
|
+
* OWASP: A02:2021 - Cryptographic Failures
|
|
69
|
+
* CWE: CWE-311 (Missing Encryption of Sensitive Data)
|
|
70
|
+
*/
|
|
71
|
+
function checkS3Encryption(resource) {
|
|
72
|
+
if (resource.resourceType !== 'aws_s3_bucket')
|
|
73
|
+
return null;
|
|
74
|
+
const hasEncryption = (0, parser_1.hasAttribute)(resource, 'server_side_encryption_configuration');
|
|
75
|
+
if (!hasEncryption) {
|
|
76
|
+
return {
|
|
77
|
+
severity: 'high',
|
|
78
|
+
message: `S3 bucket "${resource.resourceName}" does not have server-side encryption enabled`,
|
|
79
|
+
line: resource.startLine,
|
|
80
|
+
suggestion: 'Enable AES256 or aws:kms encryption for data at rest',
|
|
81
|
+
category: 'Cryptographic Failures',
|
|
82
|
+
cvssScore: 7.5,
|
|
83
|
+
exploitLikelihood: 'medium',
|
|
84
|
+
impact: 'data-breach',
|
|
85
|
+
owasp: 'A02:2021',
|
|
86
|
+
cwe: 'CWE-311',
|
|
87
|
+
pciDss: '3.4',
|
|
88
|
+
attackVector: {
|
|
89
|
+
description: 'Unencrypted data at rest vulnerable to unauthorized access if bucket is compromised',
|
|
90
|
+
exploitExample: 'Data readable in plaintext if AWS credentials are leaked',
|
|
91
|
+
realWorldImpact: [
|
|
92
|
+
'Data exposure in case of misconfigured permissions',
|
|
93
|
+
'Compliance violations for sensitive data storage',
|
|
94
|
+
'Increased risk from insider threats',
|
|
95
|
+
],
|
|
96
|
+
},
|
|
97
|
+
remediation: {
|
|
98
|
+
before: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n}`,
|
|
99
|
+
after: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n\n server_side_encryption_configuration {\n rule {\n apply_server_side_encryption_by_default {\n sse_algorithm = "AES256"\n }\n }\n }\n}`,
|
|
100
|
+
explanation: 'Add server-side encryption with AES256 or AWS KMS',
|
|
101
|
+
},
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Check 3: S3 Bucket Versioning Disabled (MEDIUM)
|
|
108
|
+
* OWASP: A09:2021 - Security Logging and Monitoring Failures
|
|
109
|
+
* CWE: CWE-778 (Insufficient Logging)
|
|
110
|
+
*/
|
|
111
|
+
function checkS3Versioning(resource) {
|
|
112
|
+
if (resource.resourceType !== 'aws_s3_bucket')
|
|
113
|
+
return null;
|
|
114
|
+
const versioning = (0, parser_1.getAttribute)(resource, 'versioning.enabled');
|
|
115
|
+
if (versioning !== true) {
|
|
116
|
+
return {
|
|
117
|
+
severity: 'medium',
|
|
118
|
+
message: `S3 bucket "${resource.resourceName}" does not have versioning enabled`,
|
|
119
|
+
line: resource.startLine,
|
|
120
|
+
suggestion: 'Enable versioning to protect against accidental deletion and ransomware',
|
|
121
|
+
category: 'Security Logging',
|
|
122
|
+
cvssScore: 5.3,
|
|
123
|
+
exploitLikelihood: 'medium',
|
|
124
|
+
impact: 'data-corruption',
|
|
125
|
+
owasp: 'A09:2021',
|
|
126
|
+
cwe: 'CWE-778',
|
|
127
|
+
attackVector: {
|
|
128
|
+
description: 'Without versioning, deleted or overwritten objects cannot be recovered',
|
|
129
|
+
exploitExample: 'Ransomware can overwrite files without recovery option',
|
|
130
|
+
realWorldImpact: [
|
|
131
|
+
'Permanent data loss from accidental deletion',
|
|
132
|
+
'No recovery from ransomware attacks',
|
|
133
|
+
'Compliance issues for data retention requirements',
|
|
134
|
+
],
|
|
135
|
+
},
|
|
136
|
+
remediation: {
|
|
137
|
+
before: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n}`,
|
|
138
|
+
after: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n\n versioning {\n enabled = true\n }\n}`,
|
|
139
|
+
explanation: 'Enable versioning to keep multiple versions of objects for recovery',
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
return null;
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Check 4: S3 Bucket Logging Disabled (MEDIUM)
|
|
147
|
+
* OWASP: A09:2021 - Security Logging and Monitoring Failures
|
|
148
|
+
* CWE: CWE-778 (Insufficient Logging)
|
|
149
|
+
*/
|
|
150
|
+
function checkS3Logging(resource) {
|
|
151
|
+
if (resource.resourceType !== 'aws_s3_bucket')
|
|
152
|
+
return null;
|
|
153
|
+
const hasLogging = (0, parser_1.hasAttribute)(resource, 'logging.target_bucket');
|
|
154
|
+
if (!hasLogging) {
|
|
155
|
+
return {
|
|
156
|
+
severity: 'medium',
|
|
157
|
+
message: `S3 bucket "${resource.resourceName}" does not have access logging enabled`,
|
|
158
|
+
line: resource.startLine,
|
|
159
|
+
suggestion: 'Enable access logging to track bucket access and detect unauthorized activity',
|
|
160
|
+
category: 'Security Logging',
|
|
161
|
+
cvssScore: 4.3,
|
|
162
|
+
exploitLikelihood: 'low',
|
|
163
|
+
impact: 'audit-failure',
|
|
164
|
+
owasp: 'A09:2021',
|
|
165
|
+
cwe: 'CWE-778',
|
|
166
|
+
pciDss: '10.1',
|
|
167
|
+
attackVector: {
|
|
168
|
+
description: 'No audit trail for bucket access makes it impossible to detect data theft',
|
|
169
|
+
exploitExample: 'Attackers can access data without leaving forensic evidence',
|
|
170
|
+
realWorldImpact: [
|
|
171
|
+
'Cannot detect unauthorized access',
|
|
172
|
+
'Compliance failures (SOC 2, PCI-DSS)',
|
|
173
|
+
'No evidence for incident response',
|
|
174
|
+
],
|
|
175
|
+
},
|
|
176
|
+
remediation: {
|
|
177
|
+
before: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n}`,
|
|
178
|
+
after: `resource "aws_s3_bucket" "${resource.resourceName}" {\n bucket = "my-bucket"\n\n logging {\n target_bucket = "my-logs-bucket"\n target_prefix = "s3-access-logs/"\n }\n}`,
|
|
179
|
+
explanation: 'Enable access logging to another bucket for security monitoring',
|
|
180
|
+
},
|
|
181
|
+
};
|
|
182
|
+
}
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Check 5: S3 Bucket Public Access Block Missing (CRITICAL)
|
|
187
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
188
|
+
* CWE: CWE-732 (Incorrect Permission Assignment)
|
|
189
|
+
*/
|
|
190
|
+
function checkS3PublicAccessBlock(resource) {
|
|
191
|
+
if (resource.resourceType !== 'aws_s3_bucket_public_access_block')
|
|
192
|
+
return null;
|
|
193
|
+
const blockPublicAcls = (0, parser_1.getAttribute)(resource, 'block_public_acls');
|
|
194
|
+
const blockPublicPolicy = (0, parser_1.getAttribute)(resource, 'block_public_policy');
|
|
195
|
+
const ignorePublicAcls = (0, parser_1.getAttribute)(resource, 'ignore_public_acls');
|
|
196
|
+
const restrictPublicBuckets = (0, parser_1.getAttribute)(resource, 'restrict_public_buckets');
|
|
197
|
+
// All four settings should be true for maximum security
|
|
198
|
+
if (blockPublicAcls !== true ||
|
|
199
|
+
blockPublicPolicy !== true ||
|
|
200
|
+
ignorePublicAcls !== true ||
|
|
201
|
+
restrictPublicBuckets !== true) {
|
|
202
|
+
return {
|
|
203
|
+
severity: 'critical',
|
|
204
|
+
message: `S3 public access block "${resource.resourceName}" is not fully configured`,
|
|
205
|
+
line: resource.startLine,
|
|
206
|
+
suggestion: 'Enable all four public access block settings (block_public_acls, block_public_policy, ignore_public_acls, restrict_public_buckets)',
|
|
207
|
+
category: 'Broken Access Control',
|
|
208
|
+
cvssScore: 8.6,
|
|
209
|
+
exploitLikelihood: 'high',
|
|
210
|
+
impact: 'data-breach',
|
|
211
|
+
owasp: 'A01:2021',
|
|
212
|
+
cwe: 'CWE-732',
|
|
213
|
+
pciDss: '6.5.8',
|
|
214
|
+
attackVector: {
|
|
215
|
+
description: 'Incomplete public access block allows accidental bucket exposure',
|
|
216
|
+
exploitExample: 'Bucket can be made public via ACLs or policies despite partial blocks',
|
|
217
|
+
realWorldImpact: [
|
|
218
|
+
'Accidental public bucket exposure',
|
|
219
|
+
'Bypassing security controls via multiple access methods',
|
|
220
|
+
'Data leaks from misconfigured policies',
|
|
221
|
+
],
|
|
222
|
+
},
|
|
223
|
+
remediation: {
|
|
224
|
+
before: `resource "aws_s3_bucket_public_access_block" "${resource.resourceName}" {\n bucket = aws_s3_bucket.example.id\n}`,
|
|
225
|
+
after: `resource "aws_s3_bucket_public_access_block" "${resource.resourceName}" {\n bucket = aws_s3_bucket.example.id\n\n block_public_acls = true\n block_public_policy = true\n ignore_public_acls = true\n restrict_public_buckets = true\n}`,
|
|
226
|
+
explanation: 'Enable all four settings to prevent public access via any method',
|
|
227
|
+
},
|
|
228
|
+
};
|
|
229
|
+
}
|
|
230
|
+
return null;
|
|
231
|
+
}
|
|
232
|
+
// ==========================================
|
|
233
|
+
// AWS IAM Security Checks (5 checks)
|
|
234
|
+
// ==========================================
|
|
235
|
+
/**
|
|
236
|
+
* Check 6: IAM Policy with Wildcard Actions (CRITICAL)
|
|
237
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
238
|
+
* CWE: CWE-269 (Improper Privilege Management)
|
|
239
|
+
*/
|
|
240
|
+
function checkIAMWildcardActions(resource) {
|
|
241
|
+
if (resource.resourceType !== 'aws_iam_policy' && resource.resourceType !== 'aws_iam_role_policy') {
|
|
242
|
+
return null;
|
|
243
|
+
}
|
|
244
|
+
const policy = (0, parser_1.getAttribute)(resource, 'policy');
|
|
245
|
+
if (!policy)
|
|
246
|
+
return null;
|
|
247
|
+
// Parse policy JSON (might be string or object)
|
|
248
|
+
let policyObj;
|
|
249
|
+
if (typeof policy === 'string') {
|
|
250
|
+
try {
|
|
251
|
+
policyObj = JSON.parse(policy);
|
|
252
|
+
}
|
|
253
|
+
catch {
|
|
254
|
+
return null; // Can't parse, skip check
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else {
|
|
258
|
+
policyObj = policy;
|
|
259
|
+
}
|
|
260
|
+
// Check for wildcard actions in statements
|
|
261
|
+
const statements = policyObj?.Statement || [];
|
|
262
|
+
for (const statement of statements) {
|
|
263
|
+
if (statement.Effect === 'Allow') {
|
|
264
|
+
const actions = Array.isArray(statement.Action) ? statement.Action : [statement.Action];
|
|
265
|
+
if (actions.includes('*')) {
|
|
266
|
+
return {
|
|
267
|
+
severity: 'critical',
|
|
268
|
+
message: `IAM policy "${resource.resourceName}" allows wildcard actions (Action: "*")`,
|
|
269
|
+
line: resource.startLine,
|
|
270
|
+
suggestion: 'Specify explicit actions instead of "*" to follow principle of least privilege',
|
|
271
|
+
category: 'Broken Access Control',
|
|
272
|
+
cvssScore: 9.8,
|
|
273
|
+
exploitLikelihood: 'high',
|
|
274
|
+
impact: 'privilege-escalation',
|
|
275
|
+
owasp: 'A01:2021',
|
|
276
|
+
cwe: 'CWE-269',
|
|
277
|
+
pciDss: '7.1',
|
|
278
|
+
attackVector: {
|
|
279
|
+
description: 'Wildcard actions grant excessive permissions, enabling privilege escalation',
|
|
280
|
+
exploitExample: 'Compromised credentials can perform ANY action in AWS account',
|
|
281
|
+
realWorldImpact: [
|
|
282
|
+
'Full account takeover possible',
|
|
283
|
+
'Data exfiltration from all services',
|
|
284
|
+
'Ability to create backdoors and persist access',
|
|
285
|
+
],
|
|
286
|
+
},
|
|
287
|
+
remediation: {
|
|
288
|
+
before: `"Action": "*"`,
|
|
289
|
+
after: `"Action": ["s3:GetObject", "s3:PutObject"]`,
|
|
290
|
+
explanation: 'Replace wildcard with specific actions needed for the use case',
|
|
291
|
+
},
|
|
292
|
+
};
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
return null;
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Check 7: IAM Policy with Wildcard Resources (HIGH)
|
|
300
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
301
|
+
* CWE: CWE-269 (Improper Privilege Management)
|
|
302
|
+
*/
|
|
303
|
+
function checkIAMWildcardResources(resource) {
|
|
304
|
+
if (resource.resourceType !== 'aws_iam_policy' && resource.resourceType !== 'aws_iam_role_policy') {
|
|
305
|
+
return null;
|
|
306
|
+
}
|
|
307
|
+
const policy = (0, parser_1.getAttribute)(resource, 'policy');
|
|
308
|
+
if (!policy)
|
|
309
|
+
return null;
|
|
310
|
+
let policyObj;
|
|
311
|
+
if (typeof policy === 'string') {
|
|
312
|
+
try {
|
|
313
|
+
policyObj = JSON.parse(policy);
|
|
314
|
+
}
|
|
315
|
+
catch {
|
|
316
|
+
return null;
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
else {
|
|
320
|
+
policyObj = policy;
|
|
321
|
+
}
|
|
322
|
+
const statements = policyObj?.Statement || [];
|
|
323
|
+
for (const statement of statements) {
|
|
324
|
+
if (statement.Effect === 'Allow') {
|
|
325
|
+
const resources = Array.isArray(statement.Resource) ? statement.Resource : [statement.Resource];
|
|
326
|
+
if (resources.includes('*')) {
|
|
327
|
+
return {
|
|
328
|
+
severity: 'high',
|
|
329
|
+
message: `IAM policy "${resource.resourceName}" allows wildcard resources (Resource: "*")`,
|
|
330
|
+
line: resource.startLine,
|
|
331
|
+
suggestion: 'Specify explicit resource ARNs instead of "*" to limit access scope',
|
|
332
|
+
category: 'Broken Access Control',
|
|
333
|
+
cvssScore: 8.1,
|
|
334
|
+
exploitLikelihood: 'high',
|
|
335
|
+
impact: 'privilege-escalation',
|
|
336
|
+
owasp: 'A01:2021',
|
|
337
|
+
cwe: 'CWE-269',
|
|
338
|
+
pciDss: '7.1',
|
|
339
|
+
attackVector: {
|
|
340
|
+
description: 'Wildcard resources allow actions on ALL resources of a type',
|
|
341
|
+
exploitExample: 'S3:DeleteBucket with Resource:* can delete ALL buckets',
|
|
342
|
+
realWorldImpact: [
|
|
343
|
+
'Overly permissive access across entire AWS account',
|
|
344
|
+
'Lateral movement to unintended resources',
|
|
345
|
+
'Data deletion or modification across all resources',
|
|
346
|
+
],
|
|
347
|
+
},
|
|
348
|
+
remediation: {
|
|
349
|
+
before: `"Resource": "*"`,
|
|
350
|
+
after: `"Resource": "arn:aws:s3:::my-specific-bucket/*"`,
|
|
351
|
+
explanation: 'Replace wildcard with specific resource ARNs',
|
|
352
|
+
},
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Check 8: IAM Policy with Admin Permissions (HIGH)
|
|
361
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
362
|
+
* CWE: CWE-269 (Improper Privilege Management)
|
|
363
|
+
*/
|
|
364
|
+
function checkIAMAdminPolicy(resource) {
|
|
365
|
+
if (resource.resourceType !== 'aws_iam_role_policy_attachment' && resource.resourceType !== 'aws_iam_user_policy_attachment') {
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
const policyArn = (0, parser_1.getAttribute)(resource, 'policy_arn');
|
|
369
|
+
if (policyArn && policyArn.includes('AdministratorAccess')) {
|
|
370
|
+
return {
|
|
371
|
+
severity: 'high',
|
|
372
|
+
message: `IAM attachment "${resource.resourceName}" uses AdministratorAccess managed policy`,
|
|
373
|
+
line: resource.startLine,
|
|
374
|
+
suggestion: 'Avoid AdministratorAccess. Create custom policies with minimum required permissions',
|
|
375
|
+
category: 'Broken Access Control',
|
|
376
|
+
cvssScore: 7.7,
|
|
377
|
+
exploitLikelihood: 'high',
|
|
378
|
+
impact: 'privilege-escalation',
|
|
379
|
+
owasp: 'A01:2021',
|
|
380
|
+
cwe: 'CWE-269',
|
|
381
|
+
pciDss: '7.1',
|
|
382
|
+
attackVector: {
|
|
383
|
+
description: 'AdministratorAccess grants full control over AWS account',
|
|
384
|
+
exploitExample: 'Compromised admin credentials = complete account takeover',
|
|
385
|
+
realWorldImpact: [
|
|
386
|
+
'Full AWS account compromise',
|
|
387
|
+
'Ability to disable logging and monitoring',
|
|
388
|
+
'Creation of persistent backdoors',
|
|
389
|
+
],
|
|
390
|
+
},
|
|
391
|
+
remediation: {
|
|
392
|
+
before: `policy_arn = "arn:aws:iam::aws:policy/AdministratorAccess"`,
|
|
393
|
+
after: `policy_arn = aws_iam_policy.custom_policy.arn`,
|
|
394
|
+
explanation: 'Create custom policy with only required permissions instead of admin access',
|
|
395
|
+
},
|
|
396
|
+
};
|
|
397
|
+
}
|
|
398
|
+
return null;
|
|
399
|
+
}
|
|
400
|
+
/**
|
|
401
|
+
* Check 9: IAM Policy Allows Privilege Escalation (CRITICAL)
|
|
402
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
403
|
+
* CWE: CWE-269 (Improper Privilege Management)
|
|
404
|
+
*/
|
|
405
|
+
function checkIAMPrivilegeEscalation(resource) {
|
|
406
|
+
if (resource.resourceType !== 'aws_iam_policy' && resource.resourceType !== 'aws_iam_role_policy') {
|
|
407
|
+
return null;
|
|
408
|
+
}
|
|
409
|
+
const policy = (0, parser_1.getAttribute)(resource, 'policy');
|
|
410
|
+
if (!policy)
|
|
411
|
+
return null;
|
|
412
|
+
let policyObj;
|
|
413
|
+
if (typeof policy === 'string') {
|
|
414
|
+
try {
|
|
415
|
+
policyObj = JSON.parse(policy);
|
|
416
|
+
}
|
|
417
|
+
catch {
|
|
418
|
+
return null;
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else {
|
|
422
|
+
policyObj = policy;
|
|
423
|
+
}
|
|
424
|
+
// Check for dangerous permission combinations that enable privilege escalation
|
|
425
|
+
const dangerousActions = [
|
|
426
|
+
'iam:CreatePolicyVersion',
|
|
427
|
+
'iam:SetDefaultPolicyVersion',
|
|
428
|
+
'iam:PassRole',
|
|
429
|
+
'iam:CreateAccessKey',
|
|
430
|
+
'iam:CreateLoginProfile',
|
|
431
|
+
'iam:UpdateAssumeRolePolicy',
|
|
432
|
+
'iam:AttachUserPolicy',
|
|
433
|
+
'iam:AttachGroupPolicy',
|
|
434
|
+
'iam:AttachRolePolicy',
|
|
435
|
+
'iam:PutUserPolicy',
|
|
436
|
+
'iam:PutGroupPolicy',
|
|
437
|
+
'iam:PutRolePolicy',
|
|
438
|
+
];
|
|
439
|
+
const statements = policyObj?.Statement || [];
|
|
440
|
+
for (const statement of statements) {
|
|
441
|
+
if (statement.Effect === 'Allow') {
|
|
442
|
+
const actions = Array.isArray(statement.Action) ? statement.Action : [statement.Action];
|
|
443
|
+
const foundDangerous = actions.filter((action) => dangerousActions.some(dangerous => action === dangerous || action === 'iam:*' || action === '*'));
|
|
444
|
+
if (foundDangerous.length > 0) {
|
|
445
|
+
return {
|
|
446
|
+
severity: 'critical',
|
|
447
|
+
message: `IAM policy "${resource.resourceName}" allows privilege escalation actions: ${foundDangerous.join(', ')}`,
|
|
448
|
+
line: resource.startLine,
|
|
449
|
+
suggestion: 'Remove or restrict IAM modification permissions to prevent privilege escalation',
|
|
450
|
+
category: 'Broken Access Control',
|
|
451
|
+
cvssScore: 9.1,
|
|
452
|
+
exploitLikelihood: 'high',
|
|
453
|
+
impact: 'privilege-escalation',
|
|
454
|
+
owasp: 'A01:2021',
|
|
455
|
+
cwe: 'CWE-269',
|
|
456
|
+
pciDss: '7.1',
|
|
457
|
+
attackVector: {
|
|
458
|
+
description: 'Policy allows users to grant themselves additional permissions',
|
|
459
|
+
exploitExample: 'User can attach AdministratorAccess policy to themselves via iam:AttachUserPolicy',
|
|
460
|
+
realWorldImpact: [
|
|
461
|
+
'Users can escalate to admin privileges',
|
|
462
|
+
'Bypass of access controls and audit trails',
|
|
463
|
+
'Permanent backdoor creation',
|
|
464
|
+
],
|
|
465
|
+
},
|
|
466
|
+
remediation: {
|
|
467
|
+
before: `"Action": ["${foundDangerous[0]}", ...]`,
|
|
468
|
+
after: `"Action": ["s3:GetObject", "s3:PutObject"]`,
|
|
469
|
+
explanation: 'Remove IAM modification permissions unless absolutely necessary and properly restricted',
|
|
470
|
+
},
|
|
471
|
+
};
|
|
472
|
+
}
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
return null;
|
|
476
|
+
}
|
|
477
|
+
/**
|
|
478
|
+
* Check 10: IAM Role with Overly Permissive Assume Role Policy (MEDIUM)
|
|
479
|
+
* OWASP: A01:2021 - Broken Access Control
|
|
480
|
+
* CWE: CWE-732 (Incorrect Permission Assignment)
|
|
481
|
+
*/
|
|
482
|
+
function checkIAMAssumeRolePolicy(resource) {
|
|
483
|
+
if (resource.resourceType !== 'aws_iam_role')
|
|
484
|
+
return null;
|
|
485
|
+
const assumeRolePolicy = (0, parser_1.getAttribute)(resource, 'assume_role_policy');
|
|
486
|
+
if (!assumeRolePolicy)
|
|
487
|
+
return null;
|
|
488
|
+
let policyObj;
|
|
489
|
+
if (typeof assumeRolePolicy === 'string') {
|
|
490
|
+
try {
|
|
491
|
+
policyObj = JSON.parse(assumeRolePolicy);
|
|
492
|
+
}
|
|
493
|
+
catch {
|
|
494
|
+
return null;
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
else {
|
|
498
|
+
policyObj = assumeRolePolicy;
|
|
499
|
+
}
|
|
500
|
+
const statements = policyObj?.Statement || [];
|
|
501
|
+
for (const statement of statements) {
|
|
502
|
+
if (statement.Effect === 'Allow') {
|
|
503
|
+
const principal = statement.Principal;
|
|
504
|
+
// Check for wildcard principals
|
|
505
|
+
if (principal === '*' || principal?.AWS === '*' || principal?.Service === '*') {
|
|
506
|
+
return {
|
|
507
|
+
severity: 'medium',
|
|
508
|
+
message: `IAM role "${resource.resourceName}" has overly permissive assume role policy (Principal: "*")`,
|
|
509
|
+
line: resource.startLine,
|
|
510
|
+
suggestion: 'Specify explicit principals (AWS account IDs, service names) instead of wildcards',
|
|
511
|
+
category: 'Broken Access Control',
|
|
512
|
+
cvssScore: 6.5,
|
|
513
|
+
exploitLikelihood: 'medium',
|
|
514
|
+
impact: 'privilege-escalation',
|
|
515
|
+
owasp: 'A01:2021',
|
|
516
|
+
cwe: 'CWE-732',
|
|
517
|
+
pciDss: '7.1',
|
|
518
|
+
attackVector: {
|
|
519
|
+
description: 'Wildcard principal allows any AWS entity to assume this role',
|
|
520
|
+
exploitExample: 'Any AWS account can assume the role if they know the role ARN',
|
|
521
|
+
realWorldImpact: [
|
|
522
|
+
'Unauthorized access from external AWS accounts',
|
|
523
|
+
'Cross-account privilege escalation',
|
|
524
|
+
'Potential data exfiltration',
|
|
525
|
+
],
|
|
526
|
+
},
|
|
527
|
+
remediation: {
|
|
528
|
+
before: `"Principal": "*"`,
|
|
529
|
+
after: `"Principal": {\n "AWS": "arn:aws:iam::123456789012:root"\n}`,
|
|
530
|
+
explanation: 'Specify explicit AWS account ARNs or service names instead of wildcards',
|
|
531
|
+
},
|
|
532
|
+
};
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
return null;
|
|
537
|
+
}
|
|
538
|
+
//# sourceMappingURL=aws-checks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"aws-checks.js","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/terraform/aws-checks.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAeH,4CAqCC;AAOD,8CAoCC;AAOD,8CAmCC;AAOD,wCAoCC;AAOD,4DA6CC;AAWD,0DA0DC;AAOD,8DAwDC;AAOD,kDAqCC;AAOD,kEA4EC;AAOD,4DAwDC;AAtiBD,qCAAsD;AAEtD,6CAA6C;AAC7C,oCAAoC;AACpC,6CAA6C;AAE7C;;;;GAIG;AACH,SAAgB,gBAAgB,CAAC,QAA2B;IAC1D,IAAI,QAAQ,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,GAAG,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC1C,MAAM,UAAU,GAAG,CAAC,aAAa,EAAE,mBAAmB,EAAE,oBAAoB,CAAC,CAAC;IAE9E,IAAI,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,cAAc,QAAQ,CAAC,YAAY,sBAAsB,GAAG,GAAG;YACxE,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,4EAA4E;YACxF,QAAQ,EAAE,uBAAuB;YACjC,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,MAAM;YACzB,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,OAAO;YACf,YAAY,EAAE;gBACZ,WAAW,EAAE,qEAAqE;gBAClF,cAAc,EAAE,8CAA8C;gBAC9D,eAAe,EAAE;oBACf,oCAAoC;oBACpC,qCAAqC;oBACrC,sCAAsC;iBACvC;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,6BAA6B,QAAQ,CAAC,YAAY,iBAAiB,GAAG,MAAM;gBACpF,KAAK,EAAE,6BAA6B,QAAQ,CAAC,YAAY,sCAAsC;gBAC/F,WAAW,EAAE,uEAAuE;aACrF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,QAA2B;IAC3D,IAAI,QAAQ,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,aAAa,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,sCAAsC,CAAC,CAAC;IAErF,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,cAAc,QAAQ,CAAC,YAAY,gDAAgD;YAC5F,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,sDAAsD;YAClE,QAAQ,EAAE,wBAAwB;YAClC,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,QAAQ;YAC3B,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,KAAK;YACb,YAAY,EAAE;gBACZ,WAAW,EAAE,qFAAqF;gBAClG,cAAc,EAAE,0DAA0D;gBAC1E,eAAe,EAAE;oBACf,oDAAoD;oBACpD,kDAAkD;oBAClD,qCAAqC;iBACtC;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,6BAA6B,QAAQ,CAAC,YAAY,gCAAgC;gBAC1F,KAAK,EAAE,6BAA6B,QAAQ,CAAC,YAAY,gMAAgM;gBACzP,WAAW,EAAE,mDAAmD;aACjE;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,iBAAiB,CAAC,QAA2B;IAC3D,IAAI,QAAQ,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,UAAU,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAEhE,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QACxB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,cAAc,QAAQ,CAAC,YAAY,oCAAoC;YAChF,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,yEAAyE;YACrF,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,QAAQ;YAC3B,MAAM,EAAE,iBAAiB;YACzB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,YAAY,EAAE;gBACZ,WAAW,EAAE,wEAAwE;gBACrF,cAAc,EAAE,wDAAwD;gBACxE,eAAe,EAAE;oBACf,8CAA8C;oBAC9C,qCAAqC;oBACrC,mDAAmD;iBACpD;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,6BAA6B,QAAQ,CAAC,YAAY,gCAAgC;gBAC1F,KAAK,EAAE,6BAA6B,QAAQ,CAAC,YAAY,2EAA2E;gBACpI,WAAW,EAAE,qEAAqE;aACnF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,cAAc,CAAC,QAA2B;IACxD,IAAI,QAAQ,CAAC,YAAY,KAAK,eAAe;QAAE,OAAO,IAAI,CAAC;IAE3D,MAAM,UAAU,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,uBAAuB,CAAC,CAAC;IAEnE,IAAI,CAAC,UAAU,EAAE,CAAC;QAChB,OAAO;YACL,QAAQ,EAAE,QAAQ;YAClB,OAAO,EAAE,cAAc,QAAQ,CAAC,YAAY,wCAAwC;YACpF,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,+EAA+E;YAC3F,QAAQ,EAAE,kBAAkB;YAC5B,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,KAAK;YACxB,MAAM,EAAE,eAAe;YACvB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,MAAM;YACd,YAAY,EAAE;gBACZ,WAAW,EAAE,2EAA2E;gBACxF,cAAc,EAAE,6DAA6D;gBAC7E,eAAe,EAAE;oBACf,mCAAmC;oBACnC,sCAAsC;oBACtC,mCAAmC;iBACpC;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,6BAA6B,QAAQ,CAAC,YAAY,gCAAgC;gBAC1F,KAAK,EAAE,6BAA6B,QAAQ,CAAC,YAAY,iIAAiI;gBAC1L,WAAW,EAAE,iEAAiE;aAC/E;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,QAA2B;IAClE,IAAI,QAAQ,CAAC,YAAY,KAAK,mCAAmC;QAAE,OAAO,IAAI,CAAC;IAE/E,MAAM,eAAe,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACpE,MAAM,iBAAiB,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,qBAAqB,CAAC,CAAC;IACxE,MAAM,gBAAgB,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACtE,MAAM,qBAAqB,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,yBAAyB,CAAC,CAAC;IAEhF,wDAAwD;IACxD,IACE,eAAe,KAAK,IAAI;QACxB,iBAAiB,KAAK,IAAI;QAC1B,gBAAgB,KAAK,IAAI;QACzB,qBAAqB,KAAK,IAAI,EAC9B,CAAC;QACD,OAAO;YACL,QAAQ,EAAE,UAAU;YACpB,OAAO,EAAE,2BAA2B,QAAQ,CAAC,YAAY,2BAA2B;YACpF,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,oIAAoI;YAChJ,QAAQ,EAAE,uBAAuB;YACjC,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,MAAM;YACzB,MAAM,EAAE,aAAa;YACrB,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,OAAO;YACf,YAAY,EAAE;gBACZ,WAAW,EAAE,kEAAkE;gBAC/E,cAAc,EAAE,uEAAuE;gBACvF,eAAe,EAAE;oBACf,mCAAmC;oBACnC,yDAAyD;oBACzD,wCAAwC;iBACzC;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,iDAAiD,QAAQ,CAAC,YAAY,6CAA6C;gBAC3H,KAAK,EAAE,iDAAiD,QAAQ,CAAC,YAAY,uLAAuL;gBACpQ,WAAW,EAAE,kEAAkE;aAChF;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6CAA6C;AAC7C,qCAAqC;AACrC,6CAA6C;AAE7C;;;;GAIG;AACH,SAAgB,uBAAuB,CAAC,QAA2B;IACjE,IAAI,QAAQ,CAAC,YAAY,KAAK,gBAAgB,IAAI,QAAQ,CAAC,YAAY,KAAK,qBAAqB,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,gDAAgD;IAChD,IAAI,SAAc,CAAC;IACnB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC,CAAC,0BAA0B;QACzC,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,2CAA2C;IAC3C,MAAM,UAAU,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACxF,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC1B,OAAO;oBACL,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,eAAe,QAAQ,CAAC,YAAY,yCAAyC;oBACtF,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,UAAU,EAAE,gFAAgF;oBAC5F,QAAQ,EAAE,uBAAuB;oBACjC,SAAS,EAAE,GAAG;oBACd,iBAAiB,EAAE,MAAM;oBACzB,MAAM,EAAE,sBAAsB;oBAC9B,KAAK,EAAE,UAAU;oBACjB,GAAG,EAAE,SAAS;oBACd,MAAM,EAAE,KAAK;oBACb,YAAY,EAAE;wBACZ,WAAW,EAAE,6EAA6E;wBAC1F,cAAc,EAAE,+DAA+D;wBAC/E,eAAe,EAAE;4BACf,gCAAgC;4BAChC,qCAAqC;4BACrC,gDAAgD;yBACjD;qBACF;oBACD,WAAW,EAAE;wBACX,MAAM,EAAE,eAAe;wBACvB,KAAK,EAAE,4CAA4C;wBACnD,WAAW,EAAE,gEAAgE;qBAC9E;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,yBAAyB,CAAC,QAA2B;IACnE,IAAI,QAAQ,CAAC,YAAY,KAAK,gBAAgB,IAAI,QAAQ,CAAC,YAAY,KAAK,qBAAqB,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,SAAc,CAAC;IACnB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAChG,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC5B,OAAO;oBACL,QAAQ,EAAE,MAAM;oBAChB,OAAO,EAAE,eAAe,QAAQ,CAAC,YAAY,6CAA6C;oBAC1F,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,UAAU,EAAE,qEAAqE;oBACjF,QAAQ,EAAE,uBAAuB;oBACjC,SAAS,EAAE,GAAG;oBACd,iBAAiB,EAAE,MAAM;oBACzB,MAAM,EAAE,sBAAsB;oBAC9B,KAAK,EAAE,UAAU;oBACjB,GAAG,EAAE,SAAS;oBACd,MAAM,EAAE,KAAK;oBACb,YAAY,EAAE;wBACZ,WAAW,EAAE,6DAA6D;wBAC1E,cAAc,EAAE,wDAAwD;wBACxE,eAAe,EAAE;4BACf,oDAAoD;4BACpD,0CAA0C;4BAC1C,oDAAoD;yBACrD;qBACF;oBACD,WAAW,EAAE;wBACX,MAAM,EAAE,iBAAiB;wBACzB,KAAK,EAAE,iDAAiD;wBACxD,WAAW,EAAE,8CAA8C;qBAC5D;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,mBAAmB,CAAC,QAA2B;IAC7D,IAAI,QAAQ,CAAC,YAAY,KAAK,gCAAgC,IAAI,QAAQ,CAAC,YAAY,KAAK,gCAAgC,EAAE,CAAC;QAC7H,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;IACvD,IAAI,SAAS,IAAI,SAAS,CAAC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,CAAC;QAC3D,OAAO;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,mBAAmB,QAAQ,CAAC,YAAY,2CAA2C;YAC5F,IAAI,EAAE,QAAQ,CAAC,SAAS;YACxB,UAAU,EAAE,qFAAqF;YACjG,QAAQ,EAAE,uBAAuB;YACjC,SAAS,EAAE,GAAG;YACd,iBAAiB,EAAE,MAAM;YACzB,MAAM,EAAE,sBAAsB;YAC9B,KAAK,EAAE,UAAU;YACjB,GAAG,EAAE,SAAS;YACd,MAAM,EAAE,KAAK;YACb,YAAY,EAAE;gBACZ,WAAW,EAAE,0DAA0D;gBACvE,cAAc,EAAE,2DAA2D;gBAC3E,eAAe,EAAE;oBACf,6BAA6B;oBAC7B,2CAA2C;oBAC3C,kCAAkC;iBACnC;aACF;YACD,WAAW,EAAE;gBACX,MAAM,EAAE,4DAA4D;gBACpE,KAAK,EAAE,+CAA+C;gBACtD,WAAW,EAAE,6EAA6E;aAC3F;SACF,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,2BAA2B,CAAC,QAA2B;IACrE,IAAI,QAAQ,CAAC,YAAY,KAAK,gBAAgB,IAAI,QAAQ,CAAC,YAAY,KAAK,qBAAqB,EAAE,CAAC;QAClG,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,OAAO,IAAI,CAAC;IAEzB,IAAI,SAAc,CAAC;IACnB,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,MAAM,CAAC;IACrB,CAAC;IAED,+EAA+E;IAC/E,MAAM,gBAAgB,GAAG;QACvB,yBAAyB;QACzB,6BAA6B;QAC7B,cAAc;QACd,qBAAqB;QACrB,wBAAwB;QACxB,4BAA4B;QAC5B,sBAAsB;QACtB,uBAAuB;QACvB,sBAAsB;QACtB,mBAAmB;QACnB,oBAAoB;QACpB,mBAAmB;KACpB,CAAC;IAEF,MAAM,UAAU,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;YACxF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,MAAc,EAAE,EAAE,CACvD,gBAAgB,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,OAAO,IAAI,MAAM,KAAK,GAAG,CAAC,CACjG,CAAC;YAEF,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,OAAO;oBACL,QAAQ,EAAE,UAAU;oBACpB,OAAO,EAAE,eAAe,QAAQ,CAAC,YAAY,0CAA0C,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;oBAClH,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,UAAU,EAAE,iFAAiF;oBAC7F,QAAQ,EAAE,uBAAuB;oBACjC,SAAS,EAAE,GAAG;oBACd,iBAAiB,EAAE,MAAM;oBACzB,MAAM,EAAE,sBAAsB;oBAC9B,KAAK,EAAE,UAAU;oBACjB,GAAG,EAAE,SAAS;oBACd,MAAM,EAAE,KAAK;oBACb,YAAY,EAAE;wBACZ,WAAW,EAAE,gEAAgE;wBAC7E,cAAc,EAAE,mFAAmF;wBACnG,eAAe,EAAE;4BACf,wCAAwC;4BACxC,4CAA4C;4BAC5C,6BAA6B;yBAC9B;qBACF;oBACD,WAAW,EAAE;wBACX,MAAM,EAAE,eAAe,cAAc,CAAC,CAAC,CAAC,SAAS;wBACjD,KAAK,EAAE,4CAA4C;wBACnD,WAAW,EAAE,yFAAyF;qBACvG;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,QAA2B;IAClE,IAAI,QAAQ,CAAC,YAAY,KAAK,cAAc;QAAE,OAAO,IAAI,CAAC;IAE1D,MAAM,gBAAgB,GAAG,IAAA,qBAAY,EAAC,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACtE,IAAI,CAAC,gBAAgB;QAAE,OAAO,IAAI,CAAC;IAEnC,IAAI,SAAc,CAAC;IACnB,IAAI,OAAO,gBAAgB,KAAK,QAAQ,EAAE,CAAC;QACzC,IAAI,CAAC;YACH,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;SAAM,CAAC;QACN,SAAS,GAAG,gBAAgB,CAAC;IAC/B,CAAC;IAED,MAAM,UAAU,GAAG,SAAS,EAAE,SAAS,IAAI,EAAE,CAAC;IAC9C,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,SAAS,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;YACjC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YAEtC,gCAAgC;YAChC,IAAI,SAAS,KAAK,GAAG,IAAI,SAAS,EAAE,GAAG,KAAK,GAAG,IAAI,SAAS,EAAE,OAAO,KAAK,GAAG,EAAE,CAAC;gBAC9E,OAAO;oBACL,QAAQ,EAAE,QAAQ;oBAClB,OAAO,EAAE,aAAa,QAAQ,CAAC,YAAY,6DAA6D;oBACxG,IAAI,EAAE,QAAQ,CAAC,SAAS;oBACxB,UAAU,EAAE,mFAAmF;oBAC/F,QAAQ,EAAE,uBAAuB;oBACjC,SAAS,EAAE,GAAG;oBACd,iBAAiB,EAAE,QAAQ;oBAC3B,MAAM,EAAE,sBAAsB;oBAC9B,KAAK,EAAE,UAAU;oBACjB,GAAG,EAAE,SAAS;oBACd,MAAM,EAAE,KAAK;oBACb,YAAY,EAAE;wBACZ,WAAW,EAAE,8DAA8D;wBAC3E,cAAc,EAAE,+DAA+D;wBAC/E,eAAe,EAAE;4BACf,gDAAgD;4BAChD,oCAAoC;4BACpC,6BAA6B;yBAC9B;qBACF;oBACD,WAAW,EAAE;wBACX,MAAM,EAAE,kBAAkB;wBAC1B,KAAK,EAAE,8DAA8D;wBACrE,WAAW,EAAE,yEAAyE;qBACvF;iBACF,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terraform HCL Parser
|
|
3
|
+
*
|
|
4
|
+
* WR3: IaC Scanning - Simple regex-based HCL parser
|
|
5
|
+
* Extracts resource blocks, attributes, and nested blocks from Terraform files
|
|
6
|
+
*
|
|
7
|
+
* MVP Approach: Regex-based parsing (fast, good enough for security checks)
|
|
8
|
+
* Future: Can swap for full HCL library if needed (no API changes required)
|
|
9
|
+
*/
|
|
10
|
+
import { TerraformResource, ParsedTerraform } from './types';
|
|
11
|
+
export declare function parseTerraform(code: string): ParsedTerraform;
|
|
12
|
+
export declare function getAttribute(resource: TerraformResource, path: string): any;
|
|
13
|
+
export declare function hasAttribute(resource: TerraformResource, path: string): boolean;
|
|
14
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../../../../../../src/lib/analyzers/terraform/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAkB,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE7E,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CA6E5D;AA0KD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAU3E;AAGD,wBAAgB,YAAY,CAAC,QAAQ,EAAE,iBAAiB,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAE/E"}
|