supasec 1.0.3 → 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 +82 -26
- 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-17-09-24.html → supasec-audityour-app-2026-01-28-19-42-22.html} +51 -16
- package/reports/supasec-audityour-app-2026-01-28-19-49-18.html +1122 -0
- package/COMPLETION_REPORT.md +0 -324
- package/FIXES_SUMMARY.md +0 -224
- package/IMPLEMENTATION_NOTES.md +0 -305
- package/QUICK_REFERENCE.md +0 -185
- package/REPORTING.md +0 -217
- package/STATUS.md +0 -269
- package/reports/supasec---------app-2026-01-28-16-58-47.html +0 -804
- package/reports/supasec---------app-2026-01-28-17-06-43.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-07-23.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-00.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-20.html +0 -722
- package/reports/supasec---------app-2026-01-28-17-08-41.html +0 -722
- package/reports/supasec-au---your-app-2026-01-28-17-14-57.html +0 -715
- package/reports/supasec-au---your-app-2026-01-28-17-19-03.html +0 -715
- package/reports/supasec-ex-mple-com-2026-01-28-17-14-52.json +0 -229
- package/reports/supasec-ex-mple-com-2026-01-28-17-15-39.html +0 -715
- package/reports/supasec-ex-mple-com-2026-01-28-17-17-22.html +0 -715
- package/reports/supasec-example-com-2026-01-28-17-15-06.html +0 -715
- package/reports/supasec-my--------------name-com-2026-01-28-17-15-02.html +0 -715
- package/reports/supasec-st-ging-com-2026-01-28-17-16-17.html +0 -715
|
@@ -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"}
|
package/package.json
CHANGED
|
@@ -522,17 +522,10 @@
|
|
|
522
522
|
<!-- Header -->
|
|
523
523
|
<div class="header">
|
|
524
524
|
<div class="logo">S</div>
|
|
525
|
-
<h1>supasec
|
|
525
|
+
<h1>supasec</h1>
|
|
526
526
|
</div>
|
|
527
527
|
|
|
528
|
-
|
|
529
|
-
<div class="info-banner">
|
|
530
|
-
<div class="icon">ℹ️</div>
|
|
531
|
-
<div>
|
|
532
|
-
<h2>Demo Security Report</h2>
|
|
533
|
-
<p>This is a sample report showing what Supasec findings look like. Ready to scan your own project?</p>
|
|
534
|
-
</div>
|
|
535
|
-
</div>
|
|
528
|
+
|
|
536
529
|
|
|
537
530
|
<!-- Success Card -->
|
|
538
531
|
<div class="success-card">
|
|
@@ -540,7 +533,7 @@
|
|
|
540
533
|
<div class="success-icon">✓</div>
|
|
541
534
|
<div>
|
|
542
535
|
<div class="success-title">Scan completed successfully in 0 seconds</div>
|
|
543
|
-
<p style="font-size: 14px; color: #3b82f6; margin-top: 4px;">We found <a href="#findings">
|
|
536
|
+
<p style="font-size: 14px; color: #3b82f6; margin-top: 4px;">We found <a href="#findings">3 issues to review</a></p>
|
|
544
537
|
</div>
|
|
545
538
|
</div>
|
|
546
539
|
|
|
@@ -555,11 +548,11 @@
|
|
|
555
548
|
</div>
|
|
556
549
|
<div class="info-group">
|
|
557
550
|
<h4>Duration</h4>
|
|
558
|
-
<p>0.
|
|
551
|
+
<p>0.07 seconds</p>
|
|
559
552
|
</div>
|
|
560
553
|
<div class="info-group">
|
|
561
554
|
<h4>Scan Date</h4>
|
|
562
|
-
<p>
|
|
555
|
+
<p>29/1/2026, 1:12:22 am</p>
|
|
563
556
|
</div>
|
|
564
557
|
</div>
|
|
565
558
|
</div>
|
|
@@ -572,7 +565,7 @@
|
|
|
572
565
|
</div>
|
|
573
566
|
<div class="stat-card">
|
|
574
567
|
<div class="stat-label">High</div>
|
|
575
|
-
<div class="stat-value" style="color: #d97706;">
|
|
568
|
+
<div class="stat-value" style="color: #d97706;">2</div>
|
|
576
569
|
</div>
|
|
577
570
|
<div class="stat-card">
|
|
578
571
|
<div class="stat-label">Medium</div>
|
|
@@ -637,6 +630,40 @@
|
|
|
637
630
|
</div></div>
|
|
638
631
|
</div>
|
|
639
632
|
</div>
|
|
633
|
+
<div class="accordion-card">
|
|
634
|
+
<div class="accordion-header">
|
|
635
|
+
<div style="flex: 1;">
|
|
636
|
+
<div class="accordion-title">
|
|
637
|
+
<h3>HTTPS Analysis Failed</h3>
|
|
638
|
+
<span class="badge badge-risk">⊘ Confirmed Risk</span>
|
|
639
|
+
</div>
|
|
640
|
+
<p>Failed to analyze HTTPS configuration: Invalid URL</p>
|
|
641
|
+
</div>
|
|
642
|
+
<span class="accordion-icon">▼</span>
|
|
643
|
+
</div>
|
|
644
|
+
<div class="accordion-content">
|
|
645
|
+
|
|
646
|
+
<div class="content-section">
|
|
647
|
+
<h4>What we found</h4>
|
|
648
|
+
<p>Failed to analyze HTTPS configuration: Invalid URL</p>
|
|
649
|
+
</div>
|
|
650
|
+
<div class="content-section">
|
|
651
|
+
<h4>Impact</h4>
|
|
652
|
+
<p>Failed to analyze HTTPS configuration: Invalid URL</p>
|
|
653
|
+
</div>
|
|
654
|
+
<div class="content-section">
|
|
655
|
+
<h4>Our recommendation</h4>
|
|
656
|
+
<ul></ul></div>
|
|
657
|
+
<div class="tech-details-section" style="margin-top: 16px; padding: 16px; background: #f8fafc; border-radius: 8px; border: 1px solid #e2e8f0;">
|
|
658
|
+
<h4 style="font-size: 13px; font-weight: 600; color: #1e293b; margin-bottom: 12px; text-transform: uppercase; letter-spacing: 0.5px;">Technical Details</h4>
|
|
659
|
+
<div style="margin-bottom: 12px;">
|
|
660
|
+
<span style="font-size: 12px; color: #64748b; display: block; margin-bottom: 4px;">Key Type:</span>
|
|
661
|
+
<span style="font-size: 13px; color: #334155; font-weight: 500;">analysis</span>
|
|
662
|
+
</div>
|
|
663
|
+
<div style="margin-bottom: 12px;">
|
|
664
|
+
<span style="font-size: 12px; color: #64748b; display: block; margin-bottom: 4px;">Location:</span><div style="font-family: 'Monaco', 'Consolas', monospace; font-size: 13px; color: #334155;">audityour.app</div></div></div>
|
|
665
|
+
</div>
|
|
666
|
+
</div>
|
|
640
667
|
<div class="accordion-card">
|
|
641
668
|
<div class="accordion-header">
|
|
642
669
|
<div style="flex: 1;">
|
|
@@ -644,7 +671,7 @@
|
|
|
644
671
|
<h3>Supabase Anon Key Exposed</h3>
|
|
645
672
|
<span class="badge badge-concern">⚠ Potential Concern</span>
|
|
646
673
|
</div>
|
|
647
|
-
<p>Found supabase anon key in javascript content.
|
|
674
|
+
<p>Found supabase anon key in javascript content. Anonymous key with public access - limited by RLS pol...</p>
|
|
648
675
|
</div>
|
|
649
676
|
<span class="accordion-icon">▼</span>
|
|
650
677
|
</div>
|
|
@@ -652,7 +679,15 @@
|
|
|
652
679
|
|
|
653
680
|
<div class="content-section">
|
|
654
681
|
<h4>What we found</h4>
|
|
655
|
-
<p>Found supabase anon key in javascript content.
|
|
682
|
+
<p>Found supabase anon key in javascript content. Anonymous key with public access - limited by RLS policies
|
|
683
|
+
|
|
684
|
+
Permission Level: Anonymous Key - Public access with RLS restrictions
|
|
685
|
+
|
|
686
|
+
Potential Risks:
|
|
687
|
+
• Access limited by RLS policies
|
|
688
|
+
• Can sign up new users
|
|
689
|
+
• Can access public data
|
|
690
|
+
• Low risk if RLS properly configured</p>
|
|
656
691
|
</div>
|
|
657
692
|
<div class="content-section">
|
|
658
693
|
<h4>Impact</h4>
|
|
@@ -703,7 +738,7 @@
|
|
|
703
738
|
<div class="footer">
|
|
704
739
|
<p>Supasec is an independent service and is not affiliated, associated, authorized, endorsed by, or in any way officially connected with Supabase Inc.</p>
|
|
705
740
|
<p>"Supabase" and related marks are trademarks of Supabase Inc. Any mention is for descriptive purposes only and does not imply any partnership.</p>
|
|
706
|
-
<p style="margin-top: 16px; color: #64748b;">Generated by Supasec • Report ID: scan_2026-01-
|
|
741
|
+
<p style="margin-top: 16px; color: #64748b;">Generated by Supasec • Report ID: scan_2026-01-28T19-42-22</p>
|
|
707
742
|
</div>
|
|
708
743
|
</div>
|
|
709
744
|
|