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.
Files changed (117) hide show
  1. package/Feature-List.md +233 -0
  2. package/README.md +53 -12
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/index.d.ts +1 -0
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +1 -0
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/scan.d.ts.map +1 -1
  10. package/dist/commands/scan.js +82 -26
  11. package/dist/commands/scan.js.map +1 -1
  12. package/dist/commands/snapshot.d.ts +32 -0
  13. package/dist/commands/snapshot.d.ts.map +1 -0
  14. package/dist/commands/snapshot.js +282 -0
  15. package/dist/commands/snapshot.js.map +1 -0
  16. package/dist/reporters/html.d.ts +3 -2
  17. package/dist/reporters/html.d.ts.map +1 -1
  18. package/dist/reporters/html.js +844 -538
  19. package/dist/reporters/html.js.map +1 -1
  20. package/dist/reporters/terminal.d.ts +38 -2
  21. package/dist/reporters/terminal.d.ts.map +1 -1
  22. package/dist/reporters/terminal.js +292 -131
  23. package/dist/reporters/terminal.js.map +1 -1
  24. package/dist/scanners/auth/analyzer.d.ts +40 -0
  25. package/dist/scanners/auth/analyzer.d.ts.map +1 -0
  26. package/dist/scanners/auth/analyzer.js +673 -0
  27. package/dist/scanners/auth/analyzer.js.map +1 -0
  28. package/dist/scanners/auth/index.d.ts +6 -0
  29. package/dist/scanners/auth/index.d.ts.map +1 -0
  30. package/dist/scanners/auth/index.js +22 -0
  31. package/dist/scanners/auth/index.js.map +1 -0
  32. package/dist/scanners/edge/analyzer.d.ts +35 -0
  33. package/dist/scanners/edge/analyzer.d.ts.map +1 -0
  34. package/dist/scanners/edge/analyzer.js +614 -0
  35. package/dist/scanners/edge/analyzer.js.map +1 -0
  36. package/dist/scanners/edge/index.d.ts +6 -0
  37. package/dist/scanners/edge/index.d.ts.map +1 -0
  38. package/dist/scanners/edge/index.js +22 -0
  39. package/dist/scanners/edge/index.js.map +1 -0
  40. package/dist/scanners/functions/analyzer.d.ts +41 -0
  41. package/dist/scanners/functions/analyzer.d.ts.map +1 -0
  42. package/dist/scanners/functions/analyzer.js +378 -0
  43. package/dist/scanners/functions/analyzer.js.map +1 -0
  44. package/dist/scanners/functions/index.d.ts +6 -0
  45. package/dist/scanners/functions/index.d.ts.map +1 -0
  46. package/dist/scanners/functions/index.js +22 -0
  47. package/dist/scanners/functions/index.js.map +1 -0
  48. package/dist/scanners/git/index.d.ts +6 -0
  49. package/dist/scanners/git/index.d.ts.map +1 -0
  50. package/dist/scanners/git/index.js +22 -0
  51. package/dist/scanners/git/index.js.map +1 -0
  52. package/dist/scanners/git/scanner.d.ts +22 -0
  53. package/dist/scanners/git/scanner.d.ts.map +1 -0
  54. package/dist/scanners/git/scanner.js +531 -0
  55. package/dist/scanners/git/scanner.js.map +1 -0
  56. package/dist/scanners/https/analyzer.d.ts +42 -0
  57. package/dist/scanners/https/analyzer.d.ts.map +1 -0
  58. package/dist/scanners/https/analyzer.js +470 -0
  59. package/dist/scanners/https/analyzer.js.map +1 -0
  60. package/dist/scanners/https/index.d.ts +8 -0
  61. package/dist/scanners/https/index.d.ts.map +1 -0
  62. package/dist/scanners/https/index.js +17 -0
  63. package/dist/scanners/https/index.js.map +1 -0
  64. package/dist/scanners/index.d.ts +6 -0
  65. package/dist/scanners/index.d.ts.map +1 -1
  66. package/dist/scanners/index.js +6 -0
  67. package/dist/scanners/index.js.map +1 -1
  68. package/dist/scanners/rls/fuzzer.d.ts +40 -0
  69. package/dist/scanners/rls/fuzzer.d.ts.map +1 -0
  70. package/dist/scanners/rls/fuzzer.js +360 -0
  71. package/dist/scanners/rls/fuzzer.js.map +1 -0
  72. package/dist/scanners/rls/index.d.ts +1 -0
  73. package/dist/scanners/rls/index.d.ts.map +1 -1
  74. package/dist/scanners/rls/index.js +1 -0
  75. package/dist/scanners/rls/index.js.map +1 -1
  76. package/dist/scanners/secrets/detector.d.ts.map +1 -1
  77. package/dist/scanners/secrets/detector.js +44 -12
  78. package/dist/scanners/secrets/detector.js.map +1 -1
  79. package/dist/scanners/secrets/index.d.ts +1 -0
  80. package/dist/scanners/secrets/index.d.ts.map +1 -1
  81. package/dist/scanners/secrets/index.js +4 -0
  82. package/dist/scanners/secrets/index.js.map +1 -1
  83. package/dist/scanners/secrets/patterns.d.ts +25 -0
  84. package/dist/scanners/secrets/patterns.d.ts.map +1 -1
  85. package/dist/scanners/secrets/patterns.js +138 -27
  86. package/dist/scanners/secrets/patterns.js.map +1 -1
  87. package/dist/scanners/storage/analyzer.d.ts +49 -0
  88. package/dist/scanners/storage/analyzer.d.ts.map +1 -0
  89. package/dist/scanners/storage/analyzer.js +438 -0
  90. package/dist/scanners/storage/analyzer.js.map +1 -0
  91. package/dist/scanners/storage/index.d.ts +6 -0
  92. package/dist/scanners/storage/index.d.ts.map +1 -0
  93. package/dist/scanners/storage/index.js +22 -0
  94. package/dist/scanners/storage/index.js.map +1 -0
  95. package/package.json +1 -1
  96. package/reports/{supasec-audityour-app-2026-01-28-17-09-24.html → supasec-audityour-app-2026-01-28-19-42-22.html} +51 -16
  97. package/reports/supasec-audityour-app-2026-01-28-19-49-18.html +1122 -0
  98. package/COMPLETION_REPORT.md +0 -324
  99. package/FIXES_SUMMARY.md +0 -224
  100. package/IMPLEMENTATION_NOTES.md +0 -305
  101. package/QUICK_REFERENCE.md +0 -185
  102. package/REPORTING.md +0 -217
  103. package/STATUS.md +0 -269
  104. package/reports/supasec---------app-2026-01-28-16-58-47.html +0 -804
  105. package/reports/supasec---------app-2026-01-28-17-06-43.html +0 -722
  106. package/reports/supasec---------app-2026-01-28-17-07-23.html +0 -722
  107. package/reports/supasec---------app-2026-01-28-17-08-00.html +0 -722
  108. package/reports/supasec---------app-2026-01-28-17-08-20.html +0 -722
  109. package/reports/supasec---------app-2026-01-28-17-08-41.html +0 -722
  110. package/reports/supasec-au---your-app-2026-01-28-17-14-57.html +0 -715
  111. package/reports/supasec-au---your-app-2026-01-28-17-19-03.html +0 -715
  112. package/reports/supasec-ex-mple-com-2026-01-28-17-14-52.json +0 -229
  113. package/reports/supasec-ex-mple-com-2026-01-28-17-15-39.html +0 -715
  114. package/reports/supasec-ex-mple-com-2026-01-28-17-17-22.html +0 -715
  115. package/reports/supasec-example-com-2026-01-28-17-15-06.html +0 -715
  116. package/reports/supasec-my--------------name-com-2026-01-28-17-15-02.html +0 -715
  117. 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,6 @@
1
+ /**
2
+ * Storage Scanner Module
3
+ * Export all storage analysis functionality
4
+ */
5
+ export * from './analyzer.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "supasec",
3
- "version": "1.0.3",
3
+ "version": "1.0.5",
4
4
  "description": "A free, open-source CLI tool for comprehensive Supabase security auditing",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -522,17 +522,10 @@
522
522
  <!-- Header -->
523
523
  <div class="header">
524
524
  <div class="logo">S</div>
525
- <h1>supasec.io</h1>
525
+ <h1>supasec</h1>
526
526
  </div>
527
527
 
528
- <!-- Info Banner -->
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">2 issues to review</a></p>
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.04 seconds</p>
551
+ <p>0.07 seconds</p>
559
552
  </div>
560
553
  <div class="info-group">
561
554
  <h4>Scan Date</h4>
562
- <p>28/1/2026, 10:39:24 pm</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;">1</div>
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. Potential Supabase anon key - verify if properly scop...</p>
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. Potential Supabase anon key - verify if properly scoped</p>
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-28T17-09-24</p>
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