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,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RPC Function Analyzer
|
|
3
|
+
* Scans for exposed RPC functions and analyzes their security
|
|
4
|
+
*/
|
|
5
|
+
import { Finding } from '../../models/finding.js';
|
|
6
|
+
export interface RPCFunctionInfo {
|
|
7
|
+
name: string;
|
|
8
|
+
schema: string;
|
|
9
|
+
arguments: RPCArgument[];
|
|
10
|
+
returnType: string;
|
|
11
|
+
isSecurityDefiner: boolean;
|
|
12
|
+
owner: string;
|
|
13
|
+
description?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RPCArgument {
|
|
16
|
+
name: string;
|
|
17
|
+
type: string;
|
|
18
|
+
hasDefault: boolean;
|
|
19
|
+
defaultValue?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RPCScanOptions {
|
|
22
|
+
functions: RPCFunctionInfo[];
|
|
23
|
+
supabaseUrl: string;
|
|
24
|
+
anonKey?: string;
|
|
25
|
+
serviceKey?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface RPCScanResult {
|
|
28
|
+
findings: Finding[];
|
|
29
|
+
functionsScanned: number;
|
|
30
|
+
exposedFunctions: number;
|
|
31
|
+
dangerousFunctions: number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Analyze RPC functions for security issues
|
|
35
|
+
*/
|
|
36
|
+
export declare function analyzeRPCFunctions(options: RPCScanOptions): Promise<RPCScanResult>;
|
|
37
|
+
/**
|
|
38
|
+
* Mock RPC functions for testing
|
|
39
|
+
*/
|
|
40
|
+
export declare function getMockRPCFunctions(): RPCFunctionInfo[];
|
|
41
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/scanners/functions/analyzer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAqB,MAAM,yBAAyB,CAAC;AAErE,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,WAAW,EAAE,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,eAAe,EAAE,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,gBAAgB,EAAE,MAAM,CAAC;IACzB,gBAAgB,EAAE,MAAM,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CAsCzF;AA0TD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,eAAe,EAAE,CAgDvD"}
|
|
@@ -0,0 +1,378 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* RPC Function Analyzer
|
|
4
|
+
* Scans for exposed RPC functions and analyzes their security
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.analyzeRPCFunctions = analyzeRPCFunctions;
|
|
8
|
+
exports.getMockRPCFunctions = getMockRPCFunctions;
|
|
9
|
+
const finding_js_1 = require("../../models/finding.js");
|
|
10
|
+
/**
|
|
11
|
+
* Analyze RPC functions for security issues
|
|
12
|
+
*/
|
|
13
|
+
async function analyzeRPCFunctions(options) {
|
|
14
|
+
const findings = [];
|
|
15
|
+
let findingCounter = 1;
|
|
16
|
+
let exposedCount = 0;
|
|
17
|
+
let dangerousCount = 0;
|
|
18
|
+
for (const func of options.functions) {
|
|
19
|
+
// Check if function is exposed (in public schema)
|
|
20
|
+
if (func.schema === 'public') {
|
|
21
|
+
exposedCount++;
|
|
22
|
+
// Check for dangerous function patterns
|
|
23
|
+
const dangerousFindings = checkDangerousPatterns(func, findingCounter);
|
|
24
|
+
findings.push(...dangerousFindings.findings);
|
|
25
|
+
findingCounter = dangerousFindings.nextCounter;
|
|
26
|
+
if (dangerousFindings.findings.length > 0) {
|
|
27
|
+
dangerousCount++;
|
|
28
|
+
}
|
|
29
|
+
// Check for missing security definer
|
|
30
|
+
if (!func.isSecurityDefiner) {
|
|
31
|
+
findings.push(createNoSecurityDefinerFinding(func, findingCounter++));
|
|
32
|
+
}
|
|
33
|
+
// Check for SQL injection vulnerabilities in arguments
|
|
34
|
+
const injectionFindings = checkSQLInjectionRisk(func, findingCounter);
|
|
35
|
+
findings.push(...injectionFindings.findings);
|
|
36
|
+
findingCounter = injectionFindings.nextCounter;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
findings,
|
|
41
|
+
functionsScanned: options.functions.length,
|
|
42
|
+
exposedFunctions: exposedCount,
|
|
43
|
+
dangerousFunctions: dangerousCount
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Check for dangerous function name patterns
|
|
48
|
+
*/
|
|
49
|
+
function checkDangerousPatterns(func, startCounter) {
|
|
50
|
+
const findings = [];
|
|
51
|
+
let counter = startCounter;
|
|
52
|
+
const dangerousPatterns = [
|
|
53
|
+
{
|
|
54
|
+
pattern: /admin|superuser|root/i,
|
|
55
|
+
severity: 'CRITICAL',
|
|
56
|
+
description: 'Function name suggests administrative privileges'
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
pattern: /delete.*all|drop.*table|truncate/i,
|
|
60
|
+
severity: 'CRITICAL',
|
|
61
|
+
description: 'Function name suggests destructive operations'
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
pattern: /exec|execute|run|system/i,
|
|
65
|
+
severity: 'HIGH',
|
|
66
|
+
description: 'Function name suggests command execution capability'
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
pattern: /raw.*sql|query.*exec|dynamic.*sql/i,
|
|
70
|
+
severity: 'HIGH',
|
|
71
|
+
description: 'Function name suggests raw SQL execution'
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
pattern: /bypass|skip.*rls|ignore.*policy/i,
|
|
75
|
+
severity: 'CRITICAL',
|
|
76
|
+
description: 'Function name suggests RLS bypass capability'
|
|
77
|
+
}
|
|
78
|
+
];
|
|
79
|
+
for (const { pattern, severity, description } of dangerousPatterns) {
|
|
80
|
+
if (pattern.test(func.name)) {
|
|
81
|
+
findings.push(createDangerousFunctionFinding(func, severity, description, counter++));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return { findings, nextCounter: counter };
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Check for SQL injection risks in function arguments
|
|
88
|
+
*/
|
|
89
|
+
function checkSQLInjectionRisk(func, startCounter) {
|
|
90
|
+
const findings = [];
|
|
91
|
+
let counter = startCounter;
|
|
92
|
+
// Check for text/varchar parameters that might be used in dynamic SQL
|
|
93
|
+
const textParams = func.arguments.filter(arg => arg.type.toLowerCase().includes('text') ||
|
|
94
|
+
arg.type.toLowerCase().includes('varchar') ||
|
|
95
|
+
arg.type.toLowerCase().includes('char'));
|
|
96
|
+
if (textParams.length > 0 && func.name.toLowerCase().includes('query')) {
|
|
97
|
+
findings.push(createSQLInjectionRiskFinding(func, textParams, counter++));
|
|
98
|
+
}
|
|
99
|
+
return { findings, nextCounter: counter };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Create finding for dangerous function
|
|
103
|
+
*/
|
|
104
|
+
function createDangerousFunctionFinding(func, severity, description, counter) {
|
|
105
|
+
return {
|
|
106
|
+
finding_id: (0, finding_js_1.generateFindingId)('functions', counter),
|
|
107
|
+
timestamp: new Date().toISOString(),
|
|
108
|
+
severity,
|
|
109
|
+
category: 'functions',
|
|
110
|
+
subcategory: 'dangerous_function',
|
|
111
|
+
title: `Potentially dangerous RPC function '${func.name}'`,
|
|
112
|
+
description: `The RPC function '${func.name}' has a name pattern that suggests ${description.toLowerCase()}. This could allow unauthorized access or operations.`,
|
|
113
|
+
location: {
|
|
114
|
+
table: `${func.schema}.${func.name}`
|
|
115
|
+
},
|
|
116
|
+
evidence: {
|
|
117
|
+
function_name: func.name,
|
|
118
|
+
schema: func.schema,
|
|
119
|
+
return_type: func.returnType,
|
|
120
|
+
is_security_definer: func.isSecurityDefiner,
|
|
121
|
+
argument_count: func.arguments.length,
|
|
122
|
+
description
|
|
123
|
+
},
|
|
124
|
+
impact: {
|
|
125
|
+
severity_score: severity === 'CRITICAL' ? 9.5 : 7.5,
|
|
126
|
+
description: `${description}. Could lead to unauthorized data access or system compromise.`,
|
|
127
|
+
affected_resources: [`${func.schema}.${func.name}`],
|
|
128
|
+
compliance_violations: ['OWASP-A01-2021', 'SOC2-CC6.1']
|
|
129
|
+
},
|
|
130
|
+
remediation: {
|
|
131
|
+
summary: `Review and secure RPC function '${func.name}'`,
|
|
132
|
+
priority: severity === 'CRITICAL' ? 'IMMEDIATE' : 'HIGH',
|
|
133
|
+
effort: 'MEDIUM',
|
|
134
|
+
steps: [
|
|
135
|
+
{
|
|
136
|
+
order: 1,
|
|
137
|
+
action: 'Review function implementation for security issues',
|
|
138
|
+
sql: `-- Review function definition
|
|
139
|
+
\df+ ${func.schema}.${func.name}`
|
|
140
|
+
},
|
|
141
|
+
{
|
|
142
|
+
order: 2,
|
|
143
|
+
action: 'Add proper access controls and input validation',
|
|
144
|
+
sql: `-- Example: Add security definer and validation
|
|
145
|
+
CREATE OR REPLACE FUNCTION ${func.schema}.${func.name}(${func.arguments.map(a => `${a.name} ${a.type}`).join(', ')})
|
|
146
|
+
RETURNS ${func.returnType}
|
|
147
|
+
SECURITY DEFINER
|
|
148
|
+
SET search_path = public
|
|
149
|
+
AS $$
|
|
150
|
+
BEGIN
|
|
151
|
+
-- Add validation logic here
|
|
152
|
+
-- Check user permissions
|
|
153
|
+
-- Validate inputs
|
|
154
|
+
|
|
155
|
+
-- Original function logic
|
|
156
|
+
END;
|
|
157
|
+
$$ LANGUAGE plpgsql;`
|
|
158
|
+
},
|
|
159
|
+
{
|
|
160
|
+
order: 3,
|
|
161
|
+
action: 'Restrict function to authenticated users only',
|
|
162
|
+
sql: `-- Revoke public access
|
|
163
|
+
REVOKE EXECUTE ON FUNCTION ${func.schema}.${func.name}(${func.arguments.map(a => a.type).join(', ')}) FROM PUBLIC;
|
|
164
|
+
|
|
165
|
+
-- Grant to authenticated users only
|
|
166
|
+
GRANT EXECUTE ON FUNCTION ${func.schema}.${func.name}(${func.arguments.map(a => a.type).join(', ')}) TO authenticated;`
|
|
167
|
+
}
|
|
168
|
+
],
|
|
169
|
+
auto_fixable: false
|
|
170
|
+
},
|
|
171
|
+
references: [
|
|
172
|
+
{
|
|
173
|
+
title: 'PostgreSQL Function Security',
|
|
174
|
+
url: 'https://www.postgresql.org/docs/current/sql-createfunction.html#SQL-CREATEFUNCTION-SECURITY'
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
title: 'Supabase RPC Security Best Practices',
|
|
178
|
+
url: 'https://supabase.com/docs/guides/database/functions#security'
|
|
179
|
+
}
|
|
180
|
+
],
|
|
181
|
+
false_positive_likelihood: 'MEDIUM',
|
|
182
|
+
confidence: 0.75
|
|
183
|
+
};
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Create finding for missing security definer
|
|
187
|
+
*/
|
|
188
|
+
function createNoSecurityDefinerFinding(func, counter) {
|
|
189
|
+
return {
|
|
190
|
+
finding_id: (0, finding_js_1.generateFindingId)('functions', counter),
|
|
191
|
+
timestamp: new Date().toISOString(),
|
|
192
|
+
severity: 'MEDIUM',
|
|
193
|
+
category: 'functions',
|
|
194
|
+
subcategory: 'no_security_definer',
|
|
195
|
+
title: `RPC function '${func.name}' lacks SECURITY DEFINER`,
|
|
196
|
+
description: `The RPC function '${func.name}' does not use SECURITY DEFINER. This means it executes with the privileges of the caller, which may allow privilege escalation or unauthorized access.`,
|
|
197
|
+
location: {
|
|
198
|
+
table: `${func.schema}.${func.name}`
|
|
199
|
+
},
|
|
200
|
+
evidence: {
|
|
201
|
+
function_name: func.name,
|
|
202
|
+
schema: func.schema,
|
|
203
|
+
is_security_definer: false,
|
|
204
|
+
owner: func.owner
|
|
205
|
+
},
|
|
206
|
+
impact: {
|
|
207
|
+
severity_score: 5.0,
|
|
208
|
+
description: 'Function executes with caller privileges - potential privilege escalation',
|
|
209
|
+
affected_resources: [`${func.schema}.${func.name}`]
|
|
210
|
+
},
|
|
211
|
+
remediation: {
|
|
212
|
+
summary: `Add SECURITY DEFINER to function '${func.name}'`,
|
|
213
|
+
priority: 'MEDIUM',
|
|
214
|
+
effort: 'LOW',
|
|
215
|
+
steps: [
|
|
216
|
+
{
|
|
217
|
+
order: 1,
|
|
218
|
+
action: 'Review if SECURITY DEFINER is appropriate',
|
|
219
|
+
sql: `-- Check current function definition
|
|
220
|
+
\df+ ${func.schema}.${func.name}`
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
order: 2,
|
|
224
|
+
action: 'Add SECURITY DEFINER if needed',
|
|
225
|
+
sql: `-- Add security definer
|
|
226
|
+
CREATE OR REPLACE FUNCTION ${func.schema}.${func.name}(${func.arguments.map(a => `${a.name} ${a.type}`).join(', ')})
|
|
227
|
+
RETURNS ${func.returnType}
|
|
228
|
+
SECURITY DEFINER
|
|
229
|
+
SET search_path = public
|
|
230
|
+
AS $$
|
|
231
|
+
-- Function body
|
|
232
|
+
$$ LANGUAGE plpgsql;`
|
|
233
|
+
}
|
|
234
|
+
],
|
|
235
|
+
auto_fixable: true
|
|
236
|
+
},
|
|
237
|
+
references: [
|
|
238
|
+
{
|
|
239
|
+
title: 'PostgreSQL SECURITY DEFINER',
|
|
240
|
+
url: 'https://www.postgresql.org/docs/current/sql-createfunction.html#SQL-CREATEFUNCTION-SECURITY'
|
|
241
|
+
}
|
|
242
|
+
],
|
|
243
|
+
false_positive_likelihood: 'HIGH',
|
|
244
|
+
confidence: 0.6
|
|
245
|
+
};
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create finding for SQL injection risk
|
|
249
|
+
*/
|
|
250
|
+
function createSQLInjectionRiskFinding(func, textParams, counter) {
|
|
251
|
+
const paramNames = textParams.map(p => p.name).join(', ');
|
|
252
|
+
return {
|
|
253
|
+
finding_id: (0, finding_js_1.generateFindingId)('functions', counter),
|
|
254
|
+
timestamp: new Date().toISOString(),
|
|
255
|
+
severity: 'HIGH',
|
|
256
|
+
category: 'functions',
|
|
257
|
+
subcategory: 'sql_injection_risk',
|
|
258
|
+
title: `Potential SQL injection in RPC function '${func.name}'`,
|
|
259
|
+
description: `The RPC function '${func.name}' accepts text parameters (${paramNames}) and has a name suggesting query execution. This may be vulnerable to SQL injection if inputs are not properly sanitized.`,
|
|
260
|
+
location: {
|
|
261
|
+
table: `${func.schema}.${func.name}`
|
|
262
|
+
},
|
|
263
|
+
evidence: {
|
|
264
|
+
function_name: func.name,
|
|
265
|
+
schema: func.schema,
|
|
266
|
+
text_parameters: textParams.map(p => ({ name: p.name, type: p.type })),
|
|
267
|
+
argument_count: func.arguments.length
|
|
268
|
+
},
|
|
269
|
+
impact: {
|
|
270
|
+
severity_score: 8.0,
|
|
271
|
+
description: 'SQL injection vulnerability could allow arbitrary SQL execution',
|
|
272
|
+
affected_resources: [`${func.schema}.${func.name}`],
|
|
273
|
+
compliance_violations: ['OWASP-A03-2021', 'PCI-DSS-6.5.1']
|
|
274
|
+
},
|
|
275
|
+
remediation: {
|
|
276
|
+
summary: `Secure function '${func.name}' against SQL injection`,
|
|
277
|
+
priority: 'HIGH',
|
|
278
|
+
effort: 'MEDIUM',
|
|
279
|
+
steps: [
|
|
280
|
+
{
|
|
281
|
+
order: 1,
|
|
282
|
+
action: 'Review function implementation for dynamic SQL',
|
|
283
|
+
sql: `-- Check function source code
|
|
284
|
+
SELECT prosrc FROM pg_proc WHERE proname = '${func.name}';`
|
|
285
|
+
},
|
|
286
|
+
{
|
|
287
|
+
order: 2,
|
|
288
|
+
action: 'Use parameterized queries or proper escaping',
|
|
289
|
+
sql: `-- Example: Use format() with proper escaping
|
|
290
|
+
CREATE OR REPLACE FUNCTION ${func.schema}.${func.name}(query_text text)
|
|
291
|
+
RETURNS TABLE (...) AS $$
|
|
292
|
+
BEGIN
|
|
293
|
+
-- Use format() with %I for identifiers, %L for literals
|
|
294
|
+
RETURN QUERY EXECUTE format('SELECT * FROM %I WHERE id = %L',
|
|
295
|
+
'my_table',
|
|
296
|
+
query_text
|
|
297
|
+
);
|
|
298
|
+
END;
|
|
299
|
+
$$ LANGUAGE plpgsql SECURITY DEFINER;`
|
|
300
|
+
},
|
|
301
|
+
{
|
|
302
|
+
order: 3,
|
|
303
|
+
action: 'Add input validation',
|
|
304
|
+
code: `-- Validate inputs before using in dynamic SQL
|
|
305
|
+
IF query_text !~ '^[a-zA-Z0-9_]+$' THEN
|
|
306
|
+
RAISE EXCEPTION 'Invalid input format';
|
|
307
|
+
END IF;`
|
|
308
|
+
}
|
|
309
|
+
],
|
|
310
|
+
auto_fixable: false
|
|
311
|
+
},
|
|
312
|
+
references: [
|
|
313
|
+
{
|
|
314
|
+
title: 'OWASP SQL Injection Prevention',
|
|
315
|
+
url: 'https://cheatsheetseries.owasp.org/cheatsheets/SQL_Injection_Prevention_Cheat_Sheet.html'
|
|
316
|
+
},
|
|
317
|
+
{
|
|
318
|
+
title: 'PostgreSQL Dynamic SQL',
|
|
319
|
+
url: 'https://www.postgresql.org/docs/current/plpgsql-statements.html#PLPGSQL-STATEMENTS-EXECUTING-DYN'
|
|
320
|
+
}
|
|
321
|
+
],
|
|
322
|
+
false_positive_likelihood: 'MEDIUM',
|
|
323
|
+
confidence: 0.7
|
|
324
|
+
};
|
|
325
|
+
}
|
|
326
|
+
/**
|
|
327
|
+
* Mock RPC functions for testing
|
|
328
|
+
*/
|
|
329
|
+
function getMockRPCFunctions() {
|
|
330
|
+
return [
|
|
331
|
+
{
|
|
332
|
+
name: 'get_user_profile',
|
|
333
|
+
schema: 'public',
|
|
334
|
+
arguments: [
|
|
335
|
+
{ name: 'user_id', type: 'uuid', hasDefault: false }
|
|
336
|
+
],
|
|
337
|
+
returnType: 'json',
|
|
338
|
+
isSecurityDefiner: true,
|
|
339
|
+
owner: 'postgres',
|
|
340
|
+
description: 'Get user profile information'
|
|
341
|
+
},
|
|
342
|
+
{
|
|
343
|
+
name: 'admin_delete_user',
|
|
344
|
+
schema: 'public',
|
|
345
|
+
arguments: [
|
|
346
|
+
{ name: 'target_user_id', type: 'uuid', hasDefault: false }
|
|
347
|
+
],
|
|
348
|
+
returnType: 'boolean',
|
|
349
|
+
isSecurityDefiner: false,
|
|
350
|
+
owner: 'postgres',
|
|
351
|
+
description: 'Admin function to delete users'
|
|
352
|
+
},
|
|
353
|
+
{
|
|
354
|
+
name: 'execute_raw_query',
|
|
355
|
+
schema: 'public',
|
|
356
|
+
arguments: [
|
|
357
|
+
{ name: 'sql_query', type: 'text', hasDefault: false }
|
|
358
|
+
],
|
|
359
|
+
returnType: 'json',
|
|
360
|
+
isSecurityDefiner: true,
|
|
361
|
+
owner: 'postgres',
|
|
362
|
+
description: 'Execute arbitrary SQL query'
|
|
363
|
+
},
|
|
364
|
+
{
|
|
365
|
+
name: 'search_posts',
|
|
366
|
+
schema: 'public',
|
|
367
|
+
arguments: [
|
|
368
|
+
{ name: 'search_term', type: 'text', hasDefault: false },
|
|
369
|
+
{ name: 'limit_count', type: 'integer', hasDefault: true, defaultValue: '10' }
|
|
370
|
+
],
|
|
371
|
+
returnType: 'json',
|
|
372
|
+
isSecurityDefiner: false,
|
|
373
|
+
owner: 'postgres',
|
|
374
|
+
description: 'Search posts by term'
|
|
375
|
+
}
|
|
376
|
+
];
|
|
377
|
+
}
|
|
378
|
+
//# sourceMappingURL=analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.js","sourceRoot":"","sources":["../../../src/scanners/functions/analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/functions/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,eAAe,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Functions Scanner Module
|
|
4
|
+
* Export all RPC function 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/functions/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,gDAA8B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/scanners/git/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,cAAc,CAAC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git Scanner Module
|
|
4
|
+
* Export all git history scanning 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("./scanner.js"), exports);
|
|
22
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/scanners/git/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;AAEH,+CAA6B"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Git History Scanner
|
|
3
|
+
* Scans git history for secrets and sensitive data
|
|
4
|
+
*/
|
|
5
|
+
import { Finding } from '../../models/finding.js';
|
|
6
|
+
export interface GitScanOptions {
|
|
7
|
+
repoPath: string;
|
|
8
|
+
since?: string;
|
|
9
|
+
maxCommits?: number;
|
|
10
|
+
scanBranches?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface GitScanResult {
|
|
13
|
+
findings: Finding[];
|
|
14
|
+
commitsScanned: number;
|
|
15
|
+
branchesScanned: number;
|
|
16
|
+
secretsFound: number;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Scan git history for secrets
|
|
20
|
+
*/
|
|
21
|
+
export declare function scanGitHistory(options: GitScanOptions): Promise<GitScanResult>;
|
|
22
|
+
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["../../../src/scanners/git/scanner.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,OAAO,EAAqB,MAAM,yBAAyB,CAAC;AAKrE,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD;;GAEG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,aAAa,CAAC,CA+DpF"}
|