supasec 1.0.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/.env +1 -0
- package/LICENSE +21 -0
- package/README.md +276 -0
- package/dist/cli.d.ts +7 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +30 -0
- package/dist/cli.js.map +1 -0
- package/dist/commands/index.d.ts +6 -0
- package/dist/commands/index.d.ts.map +1 -0
- package/dist/commands/index.js +22 -0
- package/dist/commands/index.js.map +1 -0
- package/dist/commands/scan.d.ts +23 -0
- package/dist/commands/scan.d.ts.map +1 -0
- package/dist/commands/scan.js +235 -0
- package/dist/commands/scan.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +31 -0
- package/dist/index.js.map +1 -0
- package/dist/models/finding.d.ts +88 -0
- package/dist/models/finding.d.ts.map +1 -0
- package/dist/models/finding.js +80 -0
- package/dist/models/finding.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +23 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/scan-result.d.ts +103 -0
- package/dist/models/scan-result.d.ts.map +1 -0
- package/dist/models/scan-result.js +168 -0
- package/dist/models/scan-result.js.map +1 -0
- package/dist/reporters/index.d.ts +6 -0
- package/dist/reporters/index.d.ts.map +1 -0
- package/dist/reporters/index.js +22 -0
- package/dist/reporters/index.js.map +1 -0
- package/dist/reporters/terminal.d.ts +20 -0
- package/dist/reporters/terminal.d.ts.map +1 -0
- package/dist/reporters/terminal.js +346 -0
- package/dist/reporters/terminal.js.map +1 -0
- package/dist/scanners/index.d.ts +7 -0
- package/dist/scanners/index.d.ts.map +1 -0
- package/dist/scanners/index.js +23 -0
- package/dist/scanners/index.js.map +1 -0
- package/dist/scanners/rls/analyzer.d.ts +44 -0
- package/dist/scanners/rls/analyzer.d.ts.map +1 -0
- package/dist/scanners/rls/analyzer.js +519 -0
- package/dist/scanners/rls/analyzer.js.map +1 -0
- package/dist/scanners/rls/index.d.ts +6 -0
- package/dist/scanners/rls/index.d.ts.map +1 -0
- package/dist/scanners/rls/index.js +22 -0
- package/dist/scanners/rls/index.js.map +1 -0
- package/dist/scanners/secrets/detector.d.ts +32 -0
- package/dist/scanners/secrets/detector.d.ts.map +1 -0
- package/dist/scanners/secrets/detector.js +251 -0
- package/dist/scanners/secrets/detector.js.map +1 -0
- package/dist/scanners/secrets/index.d.ts +7 -0
- package/dist/scanners/secrets/index.d.ts.map +1 -0
- package/dist/scanners/secrets/index.js +23 -0
- package/dist/scanners/secrets/index.js.map +1 -0
- package/dist/scanners/secrets/patterns.d.ts +57 -0
- package/dist/scanners/secrets/patterns.d.ts.map +1 -0
- package/dist/scanners/secrets/patterns.js +285 -0
- package/dist/scanners/secrets/patterns.js.map +1 -0
- package/npm-publishing-guide.md +38 -0
- package/package.json +69 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SupaSec - Supabase Security Auditor
|
|
4
|
+
* Main exports for programmatic usage
|
|
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
|
+
exports.TOOL_NAME = exports.VERSION = void 0;
|
|
22
|
+
// Models
|
|
23
|
+
__exportStar(require("./models/index.js"), exports);
|
|
24
|
+
// Scanners
|
|
25
|
+
__exportStar(require("./scanners/index.js"), exports);
|
|
26
|
+
// Reporters
|
|
27
|
+
__exportStar(require("./reporters/index.js"), exports);
|
|
28
|
+
// Version
|
|
29
|
+
exports.VERSION = '1.0.0';
|
|
30
|
+
exports.TOOL_NAME = 'supasec';
|
|
31
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;AAEH,SAAS;AACT,oDAAkC;AAElC,WAAW;AACX,sDAAoC;AAEpC,YAAY;AACZ,uDAAqC;AAErC,UAAU;AACG,QAAA,OAAO,GAAG,OAAO,CAAC;AAClB,QAAA,SAAS,GAAG,SAAS,CAAC"}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Security Finding Model
|
|
3
|
+
* Represents a single security issue discovered during scanning
|
|
4
|
+
*/
|
|
5
|
+
export type Severity = 'CRITICAL' | 'HIGH' | 'MEDIUM' | 'LOW' | 'INFO';
|
|
6
|
+
export type Category = 'secrets' | 'rls' | 'pii' | 'storage' | 'auth' | 'api' | 'functions' | 'database' | 'transport';
|
|
7
|
+
export interface FindingLocation {
|
|
8
|
+
file?: string;
|
|
9
|
+
line?: number;
|
|
10
|
+
column?: number;
|
|
11
|
+
url?: string;
|
|
12
|
+
table?: string;
|
|
13
|
+
column_name?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface FindingEvidence {
|
|
16
|
+
code_snippet?: string;
|
|
17
|
+
matched_pattern?: string;
|
|
18
|
+
sample_data?: any;
|
|
19
|
+
request?: string;
|
|
20
|
+
response?: string;
|
|
21
|
+
[key: string]: any;
|
|
22
|
+
}
|
|
23
|
+
export interface FindingRemediation {
|
|
24
|
+
summary: string;
|
|
25
|
+
priority: 'IMMEDIATE' | 'HIGH' | 'MEDIUM' | 'LOW';
|
|
26
|
+
effort: 'LOW' | 'MEDIUM' | 'HIGH';
|
|
27
|
+
steps?: Array<{
|
|
28
|
+
order: number;
|
|
29
|
+
action: string;
|
|
30
|
+
command?: string;
|
|
31
|
+
code?: string;
|
|
32
|
+
sql?: string;
|
|
33
|
+
}>;
|
|
34
|
+
sql?: string;
|
|
35
|
+
auto_fixable: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface FindingImpact {
|
|
38
|
+
severity_score: number;
|
|
39
|
+
cvss_vector?: string;
|
|
40
|
+
description: string;
|
|
41
|
+
affected_resources: string[];
|
|
42
|
+
compliance_violations?: string[];
|
|
43
|
+
}
|
|
44
|
+
export interface FindingReference {
|
|
45
|
+
title: string;
|
|
46
|
+
url: string;
|
|
47
|
+
}
|
|
48
|
+
export interface Finding {
|
|
49
|
+
finding_id: string;
|
|
50
|
+
timestamp: string;
|
|
51
|
+
severity: Severity;
|
|
52
|
+
category: Category;
|
|
53
|
+
subcategory: string;
|
|
54
|
+
title: string;
|
|
55
|
+
description: string;
|
|
56
|
+
location?: FindingLocation;
|
|
57
|
+
evidence?: FindingEvidence;
|
|
58
|
+
impact: FindingImpact;
|
|
59
|
+
remediation: FindingRemediation;
|
|
60
|
+
references: FindingReference[];
|
|
61
|
+
false_positive_likelihood: 'VERY_LOW' | 'LOW' | 'MEDIUM' | 'HIGH';
|
|
62
|
+
confidence: number;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Generate a unique finding ID based on category and counter
|
|
66
|
+
*/
|
|
67
|
+
export declare function generateFindingId(category: Category, counter: number): string;
|
|
68
|
+
/**
|
|
69
|
+
* Get severity priority for sorting (higher = more severe)
|
|
70
|
+
*/
|
|
71
|
+
export declare function getSeverityPriority(severity: Severity): number;
|
|
72
|
+
/**
|
|
73
|
+
* Sort findings by severity (critical first)
|
|
74
|
+
*/
|
|
75
|
+
export declare function sortFindingsBySeverity(findings: Finding[]): Finding[];
|
|
76
|
+
/**
|
|
77
|
+
* Filter findings by severity
|
|
78
|
+
*/
|
|
79
|
+
export declare function filterFindingsBySeverity(findings: Finding[], minSeverity: Severity): Finding[];
|
|
80
|
+
/**
|
|
81
|
+
* Group findings by category
|
|
82
|
+
*/
|
|
83
|
+
export declare function groupFindingsByCategory(findings: Finding[]): Record<Category, Finding[]>;
|
|
84
|
+
/**
|
|
85
|
+
* Count findings by severity
|
|
86
|
+
*/
|
|
87
|
+
export declare function countFindingsBySeverity(findings: Finding[]): Record<Severity | 'total', number>;
|
|
88
|
+
//# sourceMappingURL=finding.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding.d.ts","sourceRoot":"","sources":["../../src/models/finding.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Security Finding Model
|
|
4
|
+
* Represents a single security issue discovered during scanning
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.generateFindingId = generateFindingId;
|
|
8
|
+
exports.getSeverityPriority = getSeverityPriority;
|
|
9
|
+
exports.sortFindingsBySeverity = sortFindingsBySeverity;
|
|
10
|
+
exports.filterFindingsBySeverity = filterFindingsBySeverity;
|
|
11
|
+
exports.groupFindingsByCategory = groupFindingsByCategory;
|
|
12
|
+
exports.countFindingsBySeverity = countFindingsBySeverity;
|
|
13
|
+
/**
|
|
14
|
+
* Generate a unique finding ID based on category and counter
|
|
15
|
+
*/
|
|
16
|
+
function generateFindingId(category, counter) {
|
|
17
|
+
const prefix = category.toUpperCase().substring(0, 3);
|
|
18
|
+
return `${prefix}-${String(counter).padStart(3, '0')}`;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Get severity priority for sorting (higher = more severe)
|
|
22
|
+
*/
|
|
23
|
+
function getSeverityPriority(severity) {
|
|
24
|
+
const priorities = {
|
|
25
|
+
'CRITICAL': 5,
|
|
26
|
+
'HIGH': 4,
|
|
27
|
+
'MEDIUM': 3,
|
|
28
|
+
'LOW': 2,
|
|
29
|
+
'INFO': 1
|
|
30
|
+
};
|
|
31
|
+
return priorities[severity];
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Sort findings by severity (critical first)
|
|
35
|
+
*/
|
|
36
|
+
function sortFindingsBySeverity(findings) {
|
|
37
|
+
return [...findings].sort((a, b) => {
|
|
38
|
+
const priorityDiff = getSeverityPriority(b.severity) - getSeverityPriority(a.severity);
|
|
39
|
+
if (priorityDiff !== 0)
|
|
40
|
+
return priorityDiff;
|
|
41
|
+
return a.finding_id.localeCompare(b.finding_id);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Filter findings by severity
|
|
46
|
+
*/
|
|
47
|
+
function filterFindingsBySeverity(findings, minSeverity) {
|
|
48
|
+
const minPriority = getSeverityPriority(minSeverity);
|
|
49
|
+
return findings.filter(f => getSeverityPriority(f.severity) >= minPriority);
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Group findings by category
|
|
53
|
+
*/
|
|
54
|
+
function groupFindingsByCategory(findings) {
|
|
55
|
+
return findings.reduce((acc, finding) => {
|
|
56
|
+
if (!acc[finding.category]) {
|
|
57
|
+
acc[finding.category] = [];
|
|
58
|
+
}
|
|
59
|
+
acc[finding.category].push(finding);
|
|
60
|
+
return acc;
|
|
61
|
+
}, {});
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Count findings by severity
|
|
65
|
+
*/
|
|
66
|
+
function countFindingsBySeverity(findings) {
|
|
67
|
+
const counts = {
|
|
68
|
+
'CRITICAL': 0,
|
|
69
|
+
'HIGH': 0,
|
|
70
|
+
'MEDIUM': 0,
|
|
71
|
+
'LOW': 0,
|
|
72
|
+
'INFO': 0,
|
|
73
|
+
'total': findings.length
|
|
74
|
+
};
|
|
75
|
+
for (const finding of findings) {
|
|
76
|
+
counts[finding.severity]++;
|
|
77
|
+
}
|
|
78
|
+
return counts;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=finding.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"finding.js","sourceRoot":"","sources":["../../src/models/finding.ts"],"names":[],"mappings":";AAAA;;;GAGG;;AAgFH,8CAGC;AAKD,kDASC;AAKD,wDAMC;AAKD,4DAGC;AAKD,0DAQC;AAKD,0DAeC;AAxED;;GAEG;AACH,SAAgB,iBAAiB,CAAC,QAAkB,EAAE,OAAe;IACnE,MAAM,MAAM,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtD,OAAO,GAAG,MAAM,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAgB,mBAAmB,CAAC,QAAkB;IACpD,MAAM,UAAU,GAA6B;QAC3C,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;KACV,CAAC;IACF,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC;AAC9B,CAAC;AAED;;GAEG;AACH,SAAgB,sBAAsB,CAAC,QAAmB;IACxD,OAAO,CAAC,GAAG,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACjC,MAAM,YAAY,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC;QACvF,IAAI,YAAY,KAAK,CAAC;YAAE,OAAO,YAAY,CAAC;QAC5C,OAAO,CAAC,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;GAEG;AACH,SAAgB,wBAAwB,CAAC,QAAmB,EAAE,WAAqB;IACjF,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,mBAAmB,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,WAAW,CAAC,CAAC;AAC9E,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAmB;IACzD,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE;QACtC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3B,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;QAC7B,CAAC;QACD,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACpC,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAAiC,CAAC,CAAC;AACxC,CAAC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,QAAmB;IACzD,MAAM,MAAM,GAAuC;QACjD,UAAU,EAAE,CAAC;QACb,MAAM,EAAE,CAAC;QACT,QAAQ,EAAE,CAAC;QACX,KAAK,EAAE,CAAC;QACR,MAAM,EAAE,CAAC;QACT,OAAO,EAAE,QAAQ,CAAC,MAAM;KACzB,CAAC;IAEF,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;IAC7B,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Models Index
|
|
4
|
+
* Export all model types and functions
|
|
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("./finding.js"), exports);
|
|
22
|
+
__exportStar(require("./scan-result.js"), exports);
|
|
23
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/models/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,+CAA6B;AAC7B,mDAAiC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Scan Result Model
|
|
3
|
+
* Represents the complete result of a security scan
|
|
4
|
+
*/
|
|
5
|
+
import { Finding, Category } from './finding.js';
|
|
6
|
+
export interface ScanMetadata {
|
|
7
|
+
tool: string;
|
|
8
|
+
version: string;
|
|
9
|
+
scan_id: string;
|
|
10
|
+
target_url: string;
|
|
11
|
+
supabase_project_ref?: string;
|
|
12
|
+
scan_date: string;
|
|
13
|
+
scan_duration_seconds: number;
|
|
14
|
+
scanner_mode: 'url' | 'project' | 'local';
|
|
15
|
+
}
|
|
16
|
+
export interface ProjectInfo {
|
|
17
|
+
tables_count: number;
|
|
18
|
+
rpcs_count: number;
|
|
19
|
+
storage_buckets: number;
|
|
20
|
+
auth_providers: string[];
|
|
21
|
+
edge_functions: number;
|
|
22
|
+
}
|
|
23
|
+
export interface ScanSummary {
|
|
24
|
+
total_issues: number;
|
|
25
|
+
critical: number;
|
|
26
|
+
high: number;
|
|
27
|
+
medium: number;
|
|
28
|
+
low: number;
|
|
29
|
+
info: number;
|
|
30
|
+
passed_checks: number;
|
|
31
|
+
overall_grade: string;
|
|
32
|
+
overall_score: number;
|
|
33
|
+
}
|
|
34
|
+
export interface CategoryScore {
|
|
35
|
+
score: number;
|
|
36
|
+
grade: string;
|
|
37
|
+
issues: number;
|
|
38
|
+
}
|
|
39
|
+
export interface GradingConfig {
|
|
40
|
+
overall_grade: string;
|
|
41
|
+
overall_score: number;
|
|
42
|
+
category_scores: Record<Category, CategoryScore>;
|
|
43
|
+
scoring_methodology: {
|
|
44
|
+
base_score: number;
|
|
45
|
+
critical_deduction: number;
|
|
46
|
+
high_deduction: number;
|
|
47
|
+
medium_deduction: number;
|
|
48
|
+
low_deduction: number;
|
|
49
|
+
};
|
|
50
|
+
grade_thresholds: {
|
|
51
|
+
A: number;
|
|
52
|
+
B: number;
|
|
53
|
+
C: number;
|
|
54
|
+
D: number;
|
|
55
|
+
F: number;
|
|
56
|
+
};
|
|
57
|
+
improvement_priority: string[];
|
|
58
|
+
}
|
|
59
|
+
export interface PassedCheck {
|
|
60
|
+
check_id: string;
|
|
61
|
+
category: Category;
|
|
62
|
+
title: string;
|
|
63
|
+
description: string;
|
|
64
|
+
}
|
|
65
|
+
export interface Recommendations {
|
|
66
|
+
immediate_actions: string[];
|
|
67
|
+
security_best_practices: string[];
|
|
68
|
+
next_steps: string[];
|
|
69
|
+
}
|
|
70
|
+
export interface ScanResult {
|
|
71
|
+
scan_metadata: ScanMetadata;
|
|
72
|
+
project_info: ProjectInfo;
|
|
73
|
+
summary: ScanSummary;
|
|
74
|
+
findings: Finding[];
|
|
75
|
+
passed_checks: PassedCheck[];
|
|
76
|
+
grading: GradingConfig;
|
|
77
|
+
recommendations: Recommendations;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Calculate overall security grade based on score
|
|
81
|
+
*/
|
|
82
|
+
export declare function calculateGrade(score: number): {
|
|
83
|
+
grade: string;
|
|
84
|
+
color: string;
|
|
85
|
+
message: string;
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* Calculate security score based on findings
|
|
89
|
+
*/
|
|
90
|
+
export declare function calculateScore(findings: Finding[]): number;
|
|
91
|
+
/**
|
|
92
|
+
* Generate scan ID based on timestamp
|
|
93
|
+
*/
|
|
94
|
+
export declare function generateScanId(): string;
|
|
95
|
+
/**
|
|
96
|
+
* Create an empty scan result
|
|
97
|
+
*/
|
|
98
|
+
export declare function createEmptyScanResult(targetUrl: string, mode: ScanMetadata['scanner_mode']): ScanResult;
|
|
99
|
+
/**
|
|
100
|
+
* Update scan result with computed values
|
|
101
|
+
*/
|
|
102
|
+
export declare function finalizeScanResult(result: ScanResult): ScanResult;
|
|
103
|
+
//# sourceMappingURL=scan-result.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-result.d.ts","sourceRoot":"","sources":["../../src/models/scan-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Scan Result Model
|
|
4
|
+
* Represents the complete result of a security scan
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.calculateGrade = calculateGrade;
|
|
8
|
+
exports.calculateScore = calculateScore;
|
|
9
|
+
exports.generateScanId = generateScanId;
|
|
10
|
+
exports.createEmptyScanResult = createEmptyScanResult;
|
|
11
|
+
exports.finalizeScanResult = finalizeScanResult;
|
|
12
|
+
/**
|
|
13
|
+
* Calculate overall security grade based on score
|
|
14
|
+
*/
|
|
15
|
+
function calculateGrade(score) {
|
|
16
|
+
if (score >= 90)
|
|
17
|
+
return { grade: 'A', color: 'green', message: 'Excellent security!' };
|
|
18
|
+
if (score >= 80)
|
|
19
|
+
return { grade: 'B', color: 'green', message: 'Good security posture' };
|
|
20
|
+
if (score >= 70)
|
|
21
|
+
return { grade: 'C', color: 'yellow', message: 'Needs improvement' };
|
|
22
|
+
if (score >= 60)
|
|
23
|
+
return { grade: 'D', color: 'orange', message: 'Serious issues found' };
|
|
24
|
+
return { grade: 'F', color: 'red', message: 'CRITICAL VULNERABILITIES' };
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Calculate security score based on findings
|
|
28
|
+
*/
|
|
29
|
+
function calculateScore(findings) {
|
|
30
|
+
let score = 100;
|
|
31
|
+
for (const finding of findings) {
|
|
32
|
+
switch (finding.severity) {
|
|
33
|
+
case 'CRITICAL':
|
|
34
|
+
score -= 20;
|
|
35
|
+
break;
|
|
36
|
+
case 'HIGH':
|
|
37
|
+
score -= 10;
|
|
38
|
+
break;
|
|
39
|
+
case 'MEDIUM':
|
|
40
|
+
score -= 5;
|
|
41
|
+
break;
|
|
42
|
+
case 'LOW':
|
|
43
|
+
score -= 2;
|
|
44
|
+
break;
|
|
45
|
+
case 'INFO':
|
|
46
|
+
score -= 1;
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
return Math.max(0, score);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Generate scan ID based on timestamp
|
|
54
|
+
*/
|
|
55
|
+
function generateScanId() {
|
|
56
|
+
const now = new Date();
|
|
57
|
+
const timestamp = now.toISOString().replace(/[:.]/g, '-').slice(0, 19);
|
|
58
|
+
return `scan_${timestamp}`;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Create an empty scan result
|
|
62
|
+
*/
|
|
63
|
+
function createEmptyScanResult(targetUrl, mode) {
|
|
64
|
+
const now = new Date().toISOString();
|
|
65
|
+
return {
|
|
66
|
+
scan_metadata: {
|
|
67
|
+
tool: 'supasec',
|
|
68
|
+
version: '1.0.0',
|
|
69
|
+
scan_id: generateScanId(),
|
|
70
|
+
target_url: targetUrl,
|
|
71
|
+
scan_date: now,
|
|
72
|
+
scan_duration_seconds: 0,
|
|
73
|
+
scanner_mode: mode
|
|
74
|
+
},
|
|
75
|
+
project_info: {
|
|
76
|
+
tables_count: 0,
|
|
77
|
+
rpcs_count: 0,
|
|
78
|
+
storage_buckets: 0,
|
|
79
|
+
auth_providers: [],
|
|
80
|
+
edge_functions: 0
|
|
81
|
+
},
|
|
82
|
+
summary: {
|
|
83
|
+
total_issues: 0,
|
|
84
|
+
critical: 0,
|
|
85
|
+
high: 0,
|
|
86
|
+
medium: 0,
|
|
87
|
+
low: 0,
|
|
88
|
+
info: 0,
|
|
89
|
+
passed_checks: 0,
|
|
90
|
+
overall_grade: 'A',
|
|
91
|
+
overall_score: 100
|
|
92
|
+
},
|
|
93
|
+
findings: [],
|
|
94
|
+
passed_checks: [],
|
|
95
|
+
grading: {
|
|
96
|
+
overall_grade: 'A',
|
|
97
|
+
overall_score: 100,
|
|
98
|
+
category_scores: {},
|
|
99
|
+
scoring_methodology: {
|
|
100
|
+
base_score: 100,
|
|
101
|
+
critical_deduction: -20,
|
|
102
|
+
high_deduction: -10,
|
|
103
|
+
medium_deduction: -5,
|
|
104
|
+
low_deduction: -2
|
|
105
|
+
},
|
|
106
|
+
grade_thresholds: {
|
|
107
|
+
A: 90,
|
|
108
|
+
B: 80,
|
|
109
|
+
C: 70,
|
|
110
|
+
D: 60,
|
|
111
|
+
F: 0
|
|
112
|
+
},
|
|
113
|
+
improvement_priority: []
|
|
114
|
+
},
|
|
115
|
+
recommendations: {
|
|
116
|
+
immediate_actions: [],
|
|
117
|
+
security_best_practices: [],
|
|
118
|
+
next_steps: []
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Update scan result with computed values
|
|
124
|
+
*/
|
|
125
|
+
function finalizeScanResult(result) {
|
|
126
|
+
const findings = result.findings;
|
|
127
|
+
const score = calculateScore(findings);
|
|
128
|
+
const grade = calculateGrade(score);
|
|
129
|
+
// Count by severity
|
|
130
|
+
const counts = {
|
|
131
|
+
critical: findings.filter(f => f.severity === 'CRITICAL').length,
|
|
132
|
+
high: findings.filter(f => f.severity === 'HIGH').length,
|
|
133
|
+
medium: findings.filter(f => f.severity === 'MEDIUM').length,
|
|
134
|
+
low: findings.filter(f => f.severity === 'LOW').length,
|
|
135
|
+
info: findings.filter(f => f.severity === 'INFO').length
|
|
136
|
+
};
|
|
137
|
+
result.summary = {
|
|
138
|
+
total_issues: findings.length,
|
|
139
|
+
...counts,
|
|
140
|
+
passed_checks: result.passed_checks.length,
|
|
141
|
+
overall_grade: grade.grade,
|
|
142
|
+
overall_score: score
|
|
143
|
+
};
|
|
144
|
+
result.grading.overall_grade = grade.grade;
|
|
145
|
+
result.grading.overall_score = score;
|
|
146
|
+
// Generate improvement priority
|
|
147
|
+
result.grading.improvement_priority = findings
|
|
148
|
+
.filter(f => f.severity === 'CRITICAL' || f.severity === 'HIGH')
|
|
149
|
+
.slice(0, 5)
|
|
150
|
+
.map(f => `Fix ${f.finding_id}: ${f.title}`);
|
|
151
|
+
// Generate recommendations
|
|
152
|
+
result.recommendations.immediate_actions = findings
|
|
153
|
+
.filter(f => f.severity === 'CRITICAL')
|
|
154
|
+
.map(f => f.remediation.summary);
|
|
155
|
+
if (findings.some(f => f.category === 'rls')) {
|
|
156
|
+
result.recommendations.security_best_practices.push('Review all RLS policies for proper user isolation');
|
|
157
|
+
}
|
|
158
|
+
if (findings.some(f => f.category === 'secrets')) {
|
|
159
|
+
result.recommendations.security_best_practices.push('Audit all environment variables and secrets management');
|
|
160
|
+
}
|
|
161
|
+
result.recommendations.next_steps = [
|
|
162
|
+
'Run: supasec fix --interactive',
|
|
163
|
+
'Schedule weekly scans: supasec watch --interval 604800',
|
|
164
|
+
'Add to CI/CD: see https://github.com/yourusername/supasec#cicd'
|
|
165
|
+
];
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=scan-result.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scan-result.js","sourceRoot":"","sources":["../../src/models/scan-result.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Reporters Index
|
|
4
|
+
* Export all reporter modules
|
|
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("./terminal.js"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/reporters/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gDAA8B"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Terminal Reporter
|
|
3
|
+
* Formats and displays scan results in the terminal
|
|
4
|
+
*/
|
|
5
|
+
import { ScanResult } from '../models/scan-result.js';
|
|
6
|
+
export interface TerminalReportOptions {
|
|
7
|
+
showPassed?: boolean;
|
|
8
|
+
showRemediation?: boolean;
|
|
9
|
+
compact?: boolean;
|
|
10
|
+
noColor?: boolean;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Generate terminal report from scan result
|
|
14
|
+
*/
|
|
15
|
+
export declare function generateTerminalReport(result: ScanResult, options?: TerminalReportOptions): string;
|
|
16
|
+
/**
|
|
17
|
+
* Print report to console
|
|
18
|
+
*/
|
|
19
|
+
export declare function printReport(result: ScanResult, options?: TerminalReportOptions): void;
|
|
20
|
+
//# sourceMappingURL=terminal.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"terminal.d.ts","sourceRoot":"","sources":["../../src/reporters/terminal.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAEtD,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,UAAU,EAClB,OAAO,GAAE,qBAA0B,GAClC,MAAM,CAoCR;AAiWD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,EAAE,qBAAqB,GAAG,IAAI,CAGrF"}
|