supasec 1.0.4 → 1.0.5
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/Feature-List.md +233 -0
- package/README.md +53 -12
- package/dist/cli.js +2 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/index.d.ts +1 -0
- package/dist/commands/index.d.ts.map +1 -1
- package/dist/commands/index.js +1 -0
- package/dist/commands/index.js.map +1 -1
- package/dist/commands/scan.d.ts.map +1 -1
- package/dist/commands/scan.js +74 -18
- package/dist/commands/scan.js.map +1 -1
- package/dist/commands/snapshot.d.ts +32 -0
- package/dist/commands/snapshot.d.ts.map +1 -0
- package/dist/commands/snapshot.js +282 -0
- package/dist/commands/snapshot.js.map +1 -0
- package/dist/reporters/html.d.ts +3 -2
- package/dist/reporters/html.d.ts.map +1 -1
- package/dist/reporters/html.js +844 -538
- package/dist/reporters/html.js.map +1 -1
- package/dist/reporters/terminal.d.ts +38 -2
- package/dist/reporters/terminal.d.ts.map +1 -1
- package/dist/reporters/terminal.js +292 -131
- package/dist/reporters/terminal.js.map +1 -1
- package/dist/scanners/auth/analyzer.d.ts +40 -0
- package/dist/scanners/auth/analyzer.d.ts.map +1 -0
- package/dist/scanners/auth/analyzer.js +673 -0
- package/dist/scanners/auth/analyzer.js.map +1 -0
- package/dist/scanners/auth/index.d.ts +6 -0
- package/dist/scanners/auth/index.d.ts.map +1 -0
- package/dist/scanners/auth/index.js +22 -0
- package/dist/scanners/auth/index.js.map +1 -0
- package/dist/scanners/edge/analyzer.d.ts +35 -0
- package/dist/scanners/edge/analyzer.d.ts.map +1 -0
- package/dist/scanners/edge/analyzer.js +614 -0
- package/dist/scanners/edge/analyzer.js.map +1 -0
- package/dist/scanners/edge/index.d.ts +6 -0
- package/dist/scanners/edge/index.d.ts.map +1 -0
- package/dist/scanners/edge/index.js +22 -0
- package/dist/scanners/edge/index.js.map +1 -0
- package/dist/scanners/functions/analyzer.d.ts +41 -0
- package/dist/scanners/functions/analyzer.d.ts.map +1 -0
- package/dist/scanners/functions/analyzer.js +378 -0
- package/dist/scanners/functions/analyzer.js.map +1 -0
- package/dist/scanners/functions/index.d.ts +6 -0
- package/dist/scanners/functions/index.d.ts.map +1 -0
- package/dist/scanners/functions/index.js +22 -0
- package/dist/scanners/functions/index.js.map +1 -0
- package/dist/scanners/git/index.d.ts +6 -0
- package/dist/scanners/git/index.d.ts.map +1 -0
- package/dist/scanners/git/index.js +22 -0
- package/dist/scanners/git/index.js.map +1 -0
- package/dist/scanners/git/scanner.d.ts +22 -0
- package/dist/scanners/git/scanner.d.ts.map +1 -0
- package/dist/scanners/git/scanner.js +531 -0
- package/dist/scanners/git/scanner.js.map +1 -0
- package/dist/scanners/https/analyzer.d.ts +42 -0
- package/dist/scanners/https/analyzer.d.ts.map +1 -0
- package/dist/scanners/https/analyzer.js +470 -0
- package/dist/scanners/https/analyzer.js.map +1 -0
- package/dist/scanners/https/index.d.ts +8 -0
- package/dist/scanners/https/index.d.ts.map +1 -0
- package/dist/scanners/https/index.js +17 -0
- package/dist/scanners/https/index.js.map +1 -0
- package/dist/scanners/index.d.ts +6 -0
- package/dist/scanners/index.d.ts.map +1 -1
- package/dist/scanners/index.js +6 -0
- package/dist/scanners/index.js.map +1 -1
- package/dist/scanners/rls/fuzzer.d.ts +40 -0
- package/dist/scanners/rls/fuzzer.d.ts.map +1 -0
- package/dist/scanners/rls/fuzzer.js +360 -0
- package/dist/scanners/rls/fuzzer.js.map +1 -0
- package/dist/scanners/rls/index.d.ts +1 -0
- package/dist/scanners/rls/index.d.ts.map +1 -1
- package/dist/scanners/rls/index.js +1 -0
- package/dist/scanners/rls/index.js.map +1 -1
- package/dist/scanners/secrets/detector.d.ts.map +1 -1
- package/dist/scanners/secrets/detector.js +44 -12
- package/dist/scanners/secrets/detector.js.map +1 -1
- package/dist/scanners/secrets/index.d.ts +1 -0
- package/dist/scanners/secrets/index.d.ts.map +1 -1
- package/dist/scanners/secrets/index.js +4 -0
- package/dist/scanners/secrets/index.js.map +1 -1
- package/dist/scanners/secrets/patterns.d.ts +25 -0
- package/dist/scanners/secrets/patterns.d.ts.map +1 -1
- package/dist/scanners/secrets/patterns.js +138 -27
- package/dist/scanners/secrets/patterns.js.map +1 -1
- package/dist/scanners/storage/analyzer.d.ts +49 -0
- package/dist/scanners/storage/analyzer.d.ts.map +1 -0
- package/dist/scanners/storage/analyzer.js +438 -0
- package/dist/scanners/storage/analyzer.js.map +1 -0
- package/dist/scanners/storage/index.d.ts +6 -0
- package/dist/scanners/storage/index.d.ts.map +1 -0
- package/dist/scanners/storage/index.js +22 -0
- package/dist/scanners/storage/index.js.map +1 -0
- package/package.json +1 -1
- package/reports/supasec-audityour-app-2026-01-28-19-42-22.html +757 -0
- package/reports/supasec-audityour-app-2026-01-28-19-49-18.html +1122 -0
|
@@ -0,0 +1,438 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storage Bucket Analyzer
|
|
4
|
+
* Scans for storage bucket security issues and misconfigurations
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.analyzeStorage = analyzeStorage;
|
|
8
|
+
exports.getMockStorageBuckets = getMockStorageBuckets;
|
|
9
|
+
exports.getMockStorageObjects = getMockStorageObjects;
|
|
10
|
+
const finding_js_1 = require("../../models/finding.js");
|
|
11
|
+
/**
|
|
12
|
+
* Analyze storage buckets for security issues
|
|
13
|
+
*/
|
|
14
|
+
async function analyzeStorage(options) {
|
|
15
|
+
const findings = [];
|
|
16
|
+
let findingCounter = 1;
|
|
17
|
+
let publicCount = 0;
|
|
18
|
+
let misconfiguredCount = 0;
|
|
19
|
+
for (const bucket of options.buckets) {
|
|
20
|
+
// Check if bucket is public
|
|
21
|
+
if (bucket.public) {
|
|
22
|
+
publicCount++;
|
|
23
|
+
findings.push(createPublicBucketFinding(bucket, findingCounter++));
|
|
24
|
+
}
|
|
25
|
+
// Check for missing file size limits
|
|
26
|
+
if (!bucket.fileSizeLimit || bucket.fileSizeLimit > 50 * 1024 * 1024) {
|
|
27
|
+
findings.push(createNoSizeLimitFinding(bucket, findingCounter++));
|
|
28
|
+
misconfiguredCount++;
|
|
29
|
+
}
|
|
30
|
+
// Check for unrestricted mime types
|
|
31
|
+
if (!bucket.allowedMimeTypes || bucket.allowedMimeTypes.length === 0) {
|
|
32
|
+
findings.push(createUnrestrictedMimeTypesFinding(bucket, findingCounter++));
|
|
33
|
+
misconfiguredCount++;
|
|
34
|
+
}
|
|
35
|
+
// Check for dangerous mime types allowed
|
|
36
|
+
if (bucket.allowedMimeTypes) {
|
|
37
|
+
const dangerousMimeTypes = [
|
|
38
|
+
'application/x-httpd-php',
|
|
39
|
+
'application/x-httpd-cgi',
|
|
40
|
+
'application/x-javascript',
|
|
41
|
+
'text/html',
|
|
42
|
+
'application/xhtml+xml',
|
|
43
|
+
'application/x-executable'
|
|
44
|
+
];
|
|
45
|
+
const hasDangerousTypes = bucket.allowedMimeTypes.some(type => dangerousMimeTypes.includes(type.toLowerCase()));
|
|
46
|
+
if (hasDangerousTypes) {
|
|
47
|
+
findings.push(createDangerousMimeTypesFinding(bucket, findingCounter++));
|
|
48
|
+
misconfiguredCount++;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Analyze objects if provided
|
|
53
|
+
if (options.objects) {
|
|
54
|
+
for (const object of options.objects) {
|
|
55
|
+
// Check for sensitive file patterns
|
|
56
|
+
const sensitivePatterns = [
|
|
57
|
+
/\.env$/i,
|
|
58
|
+
/\.env\./i,
|
|
59
|
+
/config\.json$/i,
|
|
60
|
+
/secrets?\./i,
|
|
61
|
+
/password/i,
|
|
62
|
+
/key\./i,
|
|
63
|
+
/\.pem$/i,
|
|
64
|
+
/\.key$/i,
|
|
65
|
+
/\.p12$/i,
|
|
66
|
+
/\.pfx$/i,
|
|
67
|
+
/id_rsa/i,
|
|
68
|
+
/\.htpasswd/i,
|
|
69
|
+
/credentials/i
|
|
70
|
+
];
|
|
71
|
+
const isSensitive = sensitivePatterns.some(pattern => pattern.test(object.name));
|
|
72
|
+
if (isSensitive && object.isPublic) {
|
|
73
|
+
findings.push(createSensitiveFileExposedFinding(object, findingCounter++));
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
findings,
|
|
79
|
+
bucketsScanned: options.buckets.length,
|
|
80
|
+
objectsScanned: options.objects?.length || 0,
|
|
81
|
+
publicBuckets: publicCount,
|
|
82
|
+
misconfiguredBuckets: misconfiguredCount
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Create finding for public bucket
|
|
87
|
+
*/
|
|
88
|
+
function createPublicBucketFinding(bucket, counter) {
|
|
89
|
+
return {
|
|
90
|
+
finding_id: (0, finding_js_1.generateFindingId)('storage', counter),
|
|
91
|
+
timestamp: new Date().toISOString(),
|
|
92
|
+
severity: 'HIGH',
|
|
93
|
+
category: 'storage',
|
|
94
|
+
subcategory: 'public_bucket',
|
|
95
|
+
title: `Storage bucket '${bucket.name}' is publicly accessible`,
|
|
96
|
+
description: `The storage bucket '${bucket.name}' is configured as public. All files in this bucket can be accessed by anyone without authentication.`,
|
|
97
|
+
location: {
|
|
98
|
+
table: `storage.buckets:${bucket.id}`
|
|
99
|
+
},
|
|
100
|
+
evidence: {
|
|
101
|
+
bucket_id: bucket.id,
|
|
102
|
+
bucket_name: bucket.name,
|
|
103
|
+
is_public: bucket.public,
|
|
104
|
+
owner: bucket.owner
|
|
105
|
+
},
|
|
106
|
+
impact: {
|
|
107
|
+
severity_score: 7.5,
|
|
108
|
+
description: 'Any file uploaded to this bucket is publicly accessible - potential data leak',
|
|
109
|
+
affected_resources: [`storage.buckets:${bucket.id}`],
|
|
110
|
+
compliance_violations: ['GDPR-Article-32', 'SOC2-CC6.1']
|
|
111
|
+
},
|
|
112
|
+
remediation: {
|
|
113
|
+
summary: `Make storage bucket '${bucket.name}' private`,
|
|
114
|
+
priority: 'HIGH',
|
|
115
|
+
effort: 'LOW',
|
|
116
|
+
steps: [
|
|
117
|
+
{
|
|
118
|
+
order: 1,
|
|
119
|
+
action: 'Update bucket to private',
|
|
120
|
+
sql: `-- Make bucket private
|
|
121
|
+
UPDATE storage.buckets
|
|
122
|
+
SET public = false
|
|
123
|
+
WHERE id = '${bucket.id}';`
|
|
124
|
+
},
|
|
125
|
+
{
|
|
126
|
+
order: 2,
|
|
127
|
+
action: 'Create RLS policies for bucket access',
|
|
128
|
+
sql: `-- Allow authenticated users to read their own files
|
|
129
|
+
CREATE POLICY "Users can read own files"
|
|
130
|
+
ON storage.objects FOR SELECT
|
|
131
|
+
USING (auth.uid()::text = (storage.foldername(name))[1]);
|
|
132
|
+
|
|
133
|
+
-- Allow authenticated users to upload files
|
|
134
|
+
CREATE POLICY "Users can upload files"
|
|
135
|
+
ON storage.objects FOR INSERT
|
|
136
|
+
WITH CHECK (auth.role() = 'authenticated');`
|
|
137
|
+
}
|
|
138
|
+
],
|
|
139
|
+
auto_fixable: true
|
|
140
|
+
},
|
|
141
|
+
references: [
|
|
142
|
+
{
|
|
143
|
+
title: 'Supabase Storage Security',
|
|
144
|
+
url: 'https://supabase.com/docs/guides/storage/security/access-control'
|
|
145
|
+
}
|
|
146
|
+
],
|
|
147
|
+
false_positive_likelihood: 'LOW',
|
|
148
|
+
confidence: 0.95
|
|
149
|
+
};
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Create finding for missing file size limit
|
|
153
|
+
*/
|
|
154
|
+
function createNoSizeLimitFinding(bucket, counter) {
|
|
155
|
+
const currentLimit = bucket.fileSizeLimit ? `${(bucket.fileSizeLimit / 1024 / 1024).toFixed(0)}MB` : 'No limit';
|
|
156
|
+
return {
|
|
157
|
+
finding_id: (0, finding_js_1.generateFindingId)('storage', counter),
|
|
158
|
+
timestamp: new Date().toISOString(),
|
|
159
|
+
severity: 'MEDIUM',
|
|
160
|
+
category: 'storage',
|
|
161
|
+
subcategory: 'no_size_limit',
|
|
162
|
+
title: `Storage bucket '${bucket.name}' has no file size limit`,
|
|
163
|
+
description: `The storage bucket '${bucket.name}' does not have a file size limit configured (current: ${currentLimit}). This could allow denial of service through large file uploads.`,
|
|
164
|
+
location: {
|
|
165
|
+
table: `storage.buckets:${bucket.id}`
|
|
166
|
+
},
|
|
167
|
+
evidence: {
|
|
168
|
+
bucket_id: bucket.id,
|
|
169
|
+
bucket_name: bucket.name,
|
|
170
|
+
file_size_limit: bucket.fileSizeLimit,
|
|
171
|
+
current_limit_formatted: currentLimit
|
|
172
|
+
},
|
|
173
|
+
impact: {
|
|
174
|
+
severity_score: 5.0,
|
|
175
|
+
description: 'Potential DoS through large file uploads - storage abuse and costs',
|
|
176
|
+
affected_resources: [`storage.buckets:${bucket.id}`]
|
|
177
|
+
},
|
|
178
|
+
remediation: {
|
|
179
|
+
summary: `Set file size limit for bucket '${bucket.name}'`,
|
|
180
|
+
priority: 'MEDIUM',
|
|
181
|
+
effort: 'LOW',
|
|
182
|
+
steps: [
|
|
183
|
+
{
|
|
184
|
+
order: 1,
|
|
185
|
+
action: 'Set appropriate file size limit (e.g., 5MB)',
|
|
186
|
+
sql: `-- Set file size limit to 5MB
|
|
187
|
+
UPDATE storage.buckets
|
|
188
|
+
SET file_size_limit = 5242880
|
|
189
|
+
WHERE id = '${bucket.id}';`
|
|
190
|
+
}
|
|
191
|
+
],
|
|
192
|
+
auto_fixable: true
|
|
193
|
+
},
|
|
194
|
+
references: [
|
|
195
|
+
{
|
|
196
|
+
title: 'Supabase Storage Limits',
|
|
197
|
+
url: 'https://supabase.com/docs/guides/storage/uploads/file-limits'
|
|
198
|
+
}
|
|
199
|
+
],
|
|
200
|
+
false_positive_likelihood: 'MEDIUM',
|
|
201
|
+
confidence: 0.8
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Create finding for unrestricted mime types
|
|
206
|
+
*/
|
|
207
|
+
function createUnrestrictedMimeTypesFinding(bucket, counter) {
|
|
208
|
+
return {
|
|
209
|
+
finding_id: (0, finding_js_1.generateFindingId)('storage', counter),
|
|
210
|
+
timestamp: new Date().toISOString(),
|
|
211
|
+
severity: 'MEDIUM',
|
|
212
|
+
category: 'storage',
|
|
213
|
+
subcategory: 'unrestricted_mime_types',
|
|
214
|
+
title: `Storage bucket '${bucket.name}' allows all file types`,
|
|
215
|
+
description: `The storage bucket '${bucket.name}' does not restrict allowed MIME types. This could allow upload of executable or dangerous files.`,
|
|
216
|
+
location: {
|
|
217
|
+
table: `storage.buckets:${bucket.id}`
|
|
218
|
+
},
|
|
219
|
+
evidence: {
|
|
220
|
+
bucket_id: bucket.id,
|
|
221
|
+
bucket_name: bucket.name,
|
|
222
|
+
allowed_mime_types: bucket.allowedMimeTypes || 'All types allowed'
|
|
223
|
+
},
|
|
224
|
+
impact: {
|
|
225
|
+
severity_score: 5.5,
|
|
226
|
+
description: 'Potential for malicious file uploads - malware distribution risk',
|
|
227
|
+
affected_resources: [`storage.buckets:${bucket.id}`],
|
|
228
|
+
compliance_violations: ['OWASP-A05-2021']
|
|
229
|
+
},
|
|
230
|
+
remediation: {
|
|
231
|
+
summary: `Restrict allowed MIME types for bucket '${bucket.name}'`,
|
|
232
|
+
priority: 'MEDIUM',
|
|
233
|
+
effort: 'LOW',
|
|
234
|
+
steps: [
|
|
235
|
+
{
|
|
236
|
+
order: 1,
|
|
237
|
+
action: 'Set allowed MIME types',
|
|
238
|
+
sql: `-- Restrict to images and documents only
|
|
239
|
+
UPDATE storage.buckets
|
|
240
|
+
SET allowed_mime_types = ARRAY[
|
|
241
|
+
'image/jpeg',
|
|
242
|
+
'image/png',
|
|
243
|
+
'image/gif',
|
|
244
|
+
'application/pdf',
|
|
245
|
+
'text/plain'
|
|
246
|
+
]
|
|
247
|
+
WHERE id = '${bucket.id}';`
|
|
248
|
+
}
|
|
249
|
+
],
|
|
250
|
+
auto_fixable: true
|
|
251
|
+
},
|
|
252
|
+
references: [
|
|
253
|
+
{
|
|
254
|
+
title: 'MIME Type Security',
|
|
255
|
+
url: 'https://owasp.org/www-community/vulnerabilities/Unrestricted_File_Upload'
|
|
256
|
+
}
|
|
257
|
+
],
|
|
258
|
+
false_positive_likelihood: 'MEDIUM',
|
|
259
|
+
confidence: 0.75
|
|
260
|
+
};
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Create finding for dangerous mime types
|
|
264
|
+
*/
|
|
265
|
+
function createDangerousMimeTypesFinding(bucket, counter) {
|
|
266
|
+
return {
|
|
267
|
+
finding_id: (0, finding_js_1.generateFindingId)('storage', counter),
|
|
268
|
+
timestamp: new Date().toISOString(),
|
|
269
|
+
severity: 'HIGH',
|
|
270
|
+
category: 'storage',
|
|
271
|
+
subcategory: 'dangerous_mime_types',
|
|
272
|
+
title: `Storage bucket '${bucket.name}' allows dangerous file types`,
|
|
273
|
+
description: `The storage bucket '${bucket.name}' allows potentially dangerous MIME types (HTML, PHP, executables). This could enable XSS attacks or code execution.`,
|
|
274
|
+
location: {
|
|
275
|
+
table: `storage.buckets:${bucket.id}`
|
|
276
|
+
},
|
|
277
|
+
evidence: {
|
|
278
|
+
bucket_id: bucket.id,
|
|
279
|
+
bucket_name: bucket.name,
|
|
280
|
+
allowed_mime_types: bucket.allowedMimeTypes
|
|
281
|
+
},
|
|
282
|
+
impact: {
|
|
283
|
+
severity_score: 8.0,
|
|
284
|
+
description: 'XSS and code execution risk - malicious files can be served to users',
|
|
285
|
+
affected_resources: [`storage.buckets:${bucket.id}`],
|
|
286
|
+
compliance_violations: ['OWASP-A03-2021', 'XSS-CWE-79']
|
|
287
|
+
},
|
|
288
|
+
remediation: {
|
|
289
|
+
summary: `Remove dangerous MIME types from bucket '${bucket.name}'`,
|
|
290
|
+
priority: 'HIGH',
|
|
291
|
+
effort: 'LOW',
|
|
292
|
+
steps: [
|
|
293
|
+
{
|
|
294
|
+
order: 1,
|
|
295
|
+
action: 'Review and restrict MIME types',
|
|
296
|
+
sql: `-- Remove dangerous types, keep safe ones
|
|
297
|
+
UPDATE storage.buckets
|
|
298
|
+
SET allowed_mime_types = ARRAY[
|
|
299
|
+
'image/jpeg',
|
|
300
|
+
'image/png',
|
|
301
|
+
'image/gif',
|
|
302
|
+
'image/webp',
|
|
303
|
+
'application/pdf'
|
|
304
|
+
]
|
|
305
|
+
WHERE id = '${bucket.id}';`
|
|
306
|
+
}
|
|
307
|
+
],
|
|
308
|
+
auto_fixable: true
|
|
309
|
+
},
|
|
310
|
+
references: [
|
|
311
|
+
{
|
|
312
|
+
title: 'OWASP XSS Prevention',
|
|
313
|
+
url: 'https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html'
|
|
314
|
+
}
|
|
315
|
+
],
|
|
316
|
+
false_positive_likelihood: 'LOW',
|
|
317
|
+
confidence: 0.9
|
|
318
|
+
};
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Create finding for sensitive file exposed
|
|
322
|
+
*/
|
|
323
|
+
function createSensitiveFileExposedFinding(object, counter) {
|
|
324
|
+
return {
|
|
325
|
+
finding_id: (0, finding_js_1.generateFindingId)('storage', counter),
|
|
326
|
+
timestamp: new Date().toISOString(),
|
|
327
|
+
severity: 'CRITICAL',
|
|
328
|
+
category: 'storage',
|
|
329
|
+
subcategory: 'sensitive_file_exposed',
|
|
330
|
+
title: `Sensitive file '${object.name}' is publicly accessible`,
|
|
331
|
+
description: `The file '${object.name}' appears to contain sensitive information (credentials, keys, or configuration) and is publicly accessible.`,
|
|
332
|
+
location: {
|
|
333
|
+
table: `storage.objects:${object.bucketId}/${object.name}`
|
|
334
|
+
},
|
|
335
|
+
evidence: {
|
|
336
|
+
object_id: object.id,
|
|
337
|
+
bucket_id: object.bucketId,
|
|
338
|
+
file_name: object.name,
|
|
339
|
+
mime_type: object.mimeType,
|
|
340
|
+
size_bytes: object.size,
|
|
341
|
+
is_public: object.isPublic
|
|
342
|
+
},
|
|
343
|
+
impact: {
|
|
344
|
+
severity_score: 9.5,
|
|
345
|
+
description: 'Credentials or sensitive configuration exposed - immediate security breach',
|
|
346
|
+
affected_resources: [`storage.objects:${object.bucketId}/${object.name}`],
|
|
347
|
+
compliance_violations: ['GDPR-Article-32', 'PCI-DSS-3.2']
|
|
348
|
+
},
|
|
349
|
+
remediation: {
|
|
350
|
+
summary: `Remove or secure sensitive file '${object.name}'`,
|
|
351
|
+
priority: 'IMMEDIATE',
|
|
352
|
+
effort: 'LOW',
|
|
353
|
+
steps: [
|
|
354
|
+
{
|
|
355
|
+
order: 1,
|
|
356
|
+
action: 'Delete the exposed file immediately',
|
|
357
|
+
sql: `-- Delete exposed file
|
|
358
|
+
DELETE FROM storage.objects
|
|
359
|
+
WHERE id = '${object.id}';`
|
|
360
|
+
},
|
|
361
|
+
{
|
|
362
|
+
order: 2,
|
|
363
|
+
action: 'Rotate any exposed credentials',
|
|
364
|
+
code: '# Change passwords, API keys, and secrets that were exposed'
|
|
365
|
+
},
|
|
366
|
+
{
|
|
367
|
+
order: 3,
|
|
368
|
+
action: 'Make bucket private and add RLS policies',
|
|
369
|
+
sql: `-- Secure the bucket
|
|
370
|
+
UPDATE storage.buckets
|
|
371
|
+
SET public = false
|
|
372
|
+
WHERE id = '${object.bucketId}';`
|
|
373
|
+
}
|
|
374
|
+
],
|
|
375
|
+
auto_fixable: false
|
|
376
|
+
},
|
|
377
|
+
references: [
|
|
378
|
+
{
|
|
379
|
+
title: 'OWASP Sensitive Data Exposure',
|
|
380
|
+
url: 'https://owasp.org/Top10/A02_2021-Cryptographic_Failures/'
|
|
381
|
+
}
|
|
382
|
+
],
|
|
383
|
+
false_positive_likelihood: 'LOW',
|
|
384
|
+
confidence: 0.9
|
|
385
|
+
};
|
|
386
|
+
}
|
|
387
|
+
/**
|
|
388
|
+
* Mock storage buckets for testing
|
|
389
|
+
*/
|
|
390
|
+
function getMockStorageBuckets() {
|
|
391
|
+
return [
|
|
392
|
+
{
|
|
393
|
+
id: 'avatars',
|
|
394
|
+
name: 'avatars',
|
|
395
|
+
public: true,
|
|
396
|
+
fileSizeLimit: 1024 * 1024, // 1MB
|
|
397
|
+
allowedMimeTypes: ['image/jpeg', 'image/png', 'image/gif']
|
|
398
|
+
},
|
|
399
|
+
{
|
|
400
|
+
id: 'documents',
|
|
401
|
+
name: 'documents',
|
|
402
|
+
public: false,
|
|
403
|
+
fileSizeLimit: 10 * 1024 * 1024, // 10MB
|
|
404
|
+
allowedMimeTypes: ['application/pdf', 'text/plain']
|
|
405
|
+
},
|
|
406
|
+
{
|
|
407
|
+
id: 'uploads',
|
|
408
|
+
name: 'uploads',
|
|
409
|
+
public: true,
|
|
410
|
+
// No size limit
|
|
411
|
+
// No mime type restrictions
|
|
412
|
+
}
|
|
413
|
+
];
|
|
414
|
+
}
|
|
415
|
+
/**
|
|
416
|
+
* Mock storage objects for testing
|
|
417
|
+
*/
|
|
418
|
+
function getMockStorageObjects() {
|
|
419
|
+
return [
|
|
420
|
+
{
|
|
421
|
+
id: 'obj-1',
|
|
422
|
+
bucketId: 'avatars',
|
|
423
|
+
name: 'user123/profile.jpg',
|
|
424
|
+
size: 102400,
|
|
425
|
+
mimeType: 'image/jpeg',
|
|
426
|
+
isPublic: true
|
|
427
|
+
},
|
|
428
|
+
{
|
|
429
|
+
id: 'obj-2',
|
|
430
|
+
bucketId: 'uploads',
|
|
431
|
+
name: 'backup/.env',
|
|
432
|
+
size: 2048,
|
|
433
|
+
mimeType: 'text/plain',
|
|
434
|
+
isPublic: true
|
|
435
|
+
}
|
|
436
|
+
];
|
|
437
|
+
}
|
|
438
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/scanners/storage/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/storage/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Storage Scanner Module
|
|
4
|
+
* Export all storage analysis functionality
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
18
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
19
|
+
};
|
|
20
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
21
|
+
__exportStar(require("./analyzer.js"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/storage/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gDAA8B"}
|