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,531 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Git History Scanner
|
|
4
|
+
* Scans git history for secrets and sensitive data
|
|
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 __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.scanGitHistory = scanGitHistory;
|
|
41
|
+
const finding_js_1 = require("../../models/finding.js");
|
|
42
|
+
const child_process_1 = require("child_process");
|
|
43
|
+
const fs = __importStar(require("fs"));
|
|
44
|
+
const path = __importStar(require("path"));
|
|
45
|
+
/**
|
|
46
|
+
* Scan git history for secrets
|
|
47
|
+
*/
|
|
48
|
+
async function scanGitHistory(options) {
|
|
49
|
+
const findings = [];
|
|
50
|
+
let findingCounter = 1;
|
|
51
|
+
let commitsScanned = 0;
|
|
52
|
+
let branchesScanned = 0;
|
|
53
|
+
let secretsFound = 0;
|
|
54
|
+
// Check if .git directory exists
|
|
55
|
+
const gitDir = path.join(options.repoPath, '.git');
|
|
56
|
+
if (!fs.existsSync(gitDir)) {
|
|
57
|
+
return {
|
|
58
|
+
findings: [],
|
|
59
|
+
commitsScanned: 0,
|
|
60
|
+
branchesScanned: 0,
|
|
61
|
+
secretsFound: 0
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
try {
|
|
65
|
+
// Get list of commits
|
|
66
|
+
const commits = getCommits(options.repoPath, options.since, options.maxCommits);
|
|
67
|
+
commitsScanned = commits.length;
|
|
68
|
+
// Scan each commit
|
|
69
|
+
for (const commit of commits) {
|
|
70
|
+
// Check for secrets in commit message
|
|
71
|
+
const messageFindings = scanCommitMessage(commit, findingCounter);
|
|
72
|
+
findings.push(...messageFindings.findings);
|
|
73
|
+
findingCounter = messageFindings.nextCounter;
|
|
74
|
+
secretsFound += messageFindings.findings.length;
|
|
75
|
+
// Check for secrets in file changes
|
|
76
|
+
for (const file of commit.files) {
|
|
77
|
+
const fileFindings = scanFileInCommit(options.repoPath, commit.hash, file, findingCounter);
|
|
78
|
+
findings.push(...fileFindings.findings);
|
|
79
|
+
findingCounter = fileFindings.nextCounter;
|
|
80
|
+
secretsFound += fileFindings.findings.length;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
// Scan branches if requested
|
|
84
|
+
if (options.scanBranches) {
|
|
85
|
+
const branches = getBranches(options.repoPath);
|
|
86
|
+
branchesScanned = branches.length;
|
|
87
|
+
for (const branch of branches) {
|
|
88
|
+
const branchFindings = scanBranch(options.repoPath, branch, findingCounter);
|
|
89
|
+
findings.push(...branchFindings.findings);
|
|
90
|
+
findingCounter = branchFindings.nextCounter;
|
|
91
|
+
secretsFound += branchFindings.findings.length;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
catch (error) {
|
|
96
|
+
console.error('Error scanning git history:', error);
|
|
97
|
+
}
|
|
98
|
+
return {
|
|
99
|
+
findings,
|
|
100
|
+
commitsScanned,
|
|
101
|
+
branchesScanned,
|
|
102
|
+
secretsFound
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get list of commits from git log
|
|
107
|
+
*/
|
|
108
|
+
function getCommits(repoPath, since, maxCommits = 100) {
|
|
109
|
+
try {
|
|
110
|
+
const format = '%H|%an|%ad|%s';
|
|
111
|
+
let cmd = `git -C "${repoPath}" log --pretty=format:"${format}" --name-only`;
|
|
112
|
+
if (since) {
|
|
113
|
+
cmd += ` --since="${since}"`;
|
|
114
|
+
}
|
|
115
|
+
cmd += ` -n ${maxCommits}`;
|
|
116
|
+
const output = (0, child_process_1.execSync)(cmd, { encoding: 'utf-8' });
|
|
117
|
+
return parseGitLog(output);
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
return [];
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Parse git log output
|
|
125
|
+
*/
|
|
126
|
+
function parseGitLog(output) {
|
|
127
|
+
const commits = [];
|
|
128
|
+
const lines = output.split('\n');
|
|
129
|
+
let currentCommit = null;
|
|
130
|
+
for (const line of lines) {
|
|
131
|
+
// Check if line is a commit header
|
|
132
|
+
if (line.includes('|')) {
|
|
133
|
+
if (currentCommit) {
|
|
134
|
+
commits.push(currentCommit);
|
|
135
|
+
}
|
|
136
|
+
const parts = line.split('|');
|
|
137
|
+
currentCommit = {
|
|
138
|
+
hash: parts[0],
|
|
139
|
+
author: parts[1],
|
|
140
|
+
date: parts[2],
|
|
141
|
+
message: parts[3] || '',
|
|
142
|
+
files: []
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
else if (currentCommit && line.trim()) {
|
|
146
|
+
// This is a file path
|
|
147
|
+
currentCommit.files.push(line.trim());
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
if (currentCommit) {
|
|
151
|
+
commits.push(currentCommit);
|
|
152
|
+
}
|
|
153
|
+
return commits;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* Get list of branches
|
|
157
|
+
*/
|
|
158
|
+
function getBranches(repoPath) {
|
|
159
|
+
try {
|
|
160
|
+
const output = (0, child_process_1.execSync)(`git -C "${repoPath}" branch -a`, { encoding: 'utf-8' });
|
|
161
|
+
return output
|
|
162
|
+
.split('\n')
|
|
163
|
+
.map(b => b.trim().replace(/^\*\s*/, ''))
|
|
164
|
+
.filter(b => b && !b.includes('HEAD'));
|
|
165
|
+
}
|
|
166
|
+
catch {
|
|
167
|
+
return [];
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Scan commit message for secrets
|
|
172
|
+
*/
|
|
173
|
+
function scanCommitMessage(commit, startCounter) {
|
|
174
|
+
const findings = [];
|
|
175
|
+
let counter = startCounter;
|
|
176
|
+
// Patterns to check in commit messages
|
|
177
|
+
const patterns = [
|
|
178
|
+
{ pattern: /password[:=]\s*(\S+)/i, type: 'password' },
|
|
179
|
+
{ pattern: /api[_-]?key[:=]\s*(\S+)/i, type: 'api_key' },
|
|
180
|
+
{ pattern: /secret[:=]\s*(\S+)/i, type: 'secret' },
|
|
181
|
+
{ pattern: /token[:=]\s*(\S+)/i, type: 'token' },
|
|
182
|
+
{ pattern: /sk-[a-zA-Z0-9]{48}/, type: 'stripe_key' },
|
|
183
|
+
{ pattern: /eyJ[A-Za-z0-9-_]*\.eyJ[A-Za-z0-9-_]*\.[A-Za-z0-9-_]*/, type: 'jwt' }
|
|
184
|
+
];
|
|
185
|
+
for (const { pattern, type } of patterns) {
|
|
186
|
+
const match = commit.message.match(pattern);
|
|
187
|
+
if (match) {
|
|
188
|
+
findings.push(createCommitSecretFinding(commit, type, match[0], counter++));
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
return { findings, nextCounter: counter };
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Scan file content in a specific commit
|
|
195
|
+
*/
|
|
196
|
+
function scanFileInCommit(repoPath, commitHash, filePath, startCounter) {
|
|
197
|
+
const findings = [];
|
|
198
|
+
let counter = startCounter;
|
|
199
|
+
try {
|
|
200
|
+
// Get file content at this commit
|
|
201
|
+
const content = (0, child_process_1.execSync)(`git -C "${repoPath}" show ${commitHash}:"${filePath}"`, { encoding: 'utf-8' });
|
|
202
|
+
// Check for .env files
|
|
203
|
+
if (filePath.includes('.env') && !filePath.includes('.env.example')) {
|
|
204
|
+
findings.push(createEnvFileFinding(commitHash, filePath, counter++));
|
|
205
|
+
}
|
|
206
|
+
// Check for private keys
|
|
207
|
+
if (content.includes('-----BEGIN') && content.includes('PRIVATE KEY-----')) {
|
|
208
|
+
findings.push(createPrivateKeyFinding(commitHash, filePath, counter++));
|
|
209
|
+
}
|
|
210
|
+
// Check for common secret patterns
|
|
211
|
+
const secretPatterns = [
|
|
212
|
+
{ pattern: /password[:=]\s*["']([^"']+)["']/i, type: 'password' },
|
|
213
|
+
{ pattern: /api[_-]?key[:=]\s*["']([^"']+)["']/i, type: 'api_key' },
|
|
214
|
+
{ pattern: /secret[:=]\s*["']([^"']+)["']/i, type: 'secret' },
|
|
215
|
+
{ pattern: /sk-[a-zA-Z0-9]{48}/, type: 'stripe_key' },
|
|
216
|
+
{ pattern: /AKIA[0-9A-Z]{16}/, type: 'aws_key' }
|
|
217
|
+
];
|
|
218
|
+
for (const { pattern, type } of secretPatterns) {
|
|
219
|
+
if (pattern.test(content)) {
|
|
220
|
+
findings.push(createFileSecretFinding(commitHash, filePath, type, counter++));
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
catch {
|
|
225
|
+
// File might not exist in this commit
|
|
226
|
+
}
|
|
227
|
+
return { findings, nextCounter: counter };
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Scan a branch for secrets
|
|
231
|
+
*/
|
|
232
|
+
function scanBranch(repoPath, branch, startCounter) {
|
|
233
|
+
const findings = [];
|
|
234
|
+
let counter = startCounter;
|
|
235
|
+
// Check for stashed secrets
|
|
236
|
+
try {
|
|
237
|
+
const stashList = (0, child_process_1.execSync)(`git -C "${repoPath}" stash list`, { encoding: 'utf-8' });
|
|
238
|
+
if (stashList.includes(branch)) {
|
|
239
|
+
findings.push(createStashFinding(branch, counter++));
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
catch {
|
|
243
|
+
// No stash or error
|
|
244
|
+
}
|
|
245
|
+
return { findings, nextCounter: counter };
|
|
246
|
+
}
|
|
247
|
+
/**
|
|
248
|
+
* Create finding for secret in commit message
|
|
249
|
+
*/
|
|
250
|
+
function createCommitSecretFinding(commit, type, match, counter) {
|
|
251
|
+
return {
|
|
252
|
+
finding_id: (0, finding_js_1.generateFindingId)('secrets', counter),
|
|
253
|
+
timestamp: new Date().toISOString(),
|
|
254
|
+
severity: 'HIGH',
|
|
255
|
+
category: 'secrets',
|
|
256
|
+
subcategory: 'git_commit_secret',
|
|
257
|
+
title: `Potential ${type} in commit message`,
|
|
258
|
+
description: `A potential ${type} was found in the commit message. Secrets in commit history are visible to anyone with repository access.`,
|
|
259
|
+
location: {
|
|
260
|
+
file: `commit:${commit.hash}`,
|
|
261
|
+
line: 1
|
|
262
|
+
},
|
|
263
|
+
evidence: {
|
|
264
|
+
commit_hash: commit.hash,
|
|
265
|
+
commit_author: commit.author,
|
|
266
|
+
commit_date: commit.date,
|
|
267
|
+
commit_message: commit.message,
|
|
268
|
+
secret_type: type,
|
|
269
|
+
matched_text: match.substring(0, 20) + '...'
|
|
270
|
+
},
|
|
271
|
+
impact: {
|
|
272
|
+
severity_score: 7.5,
|
|
273
|
+
description: 'Secret exposed in git history - requires history rewrite to remove',
|
|
274
|
+
affected_resources: [`git:commit:${commit.hash}`],
|
|
275
|
+
compliance_violations: ['OWASP-A05-2021']
|
|
276
|
+
},
|
|
277
|
+
remediation: {
|
|
278
|
+
summary: 'Remove secret from git history',
|
|
279
|
+
priority: 'HIGH',
|
|
280
|
+
effort: 'HIGH',
|
|
281
|
+
steps: [
|
|
282
|
+
{
|
|
283
|
+
order: 1,
|
|
284
|
+
action: 'Rotate the exposed secret immediately',
|
|
285
|
+
code: 'Change the password/API key in your service provider dashboard'
|
|
286
|
+
},
|
|
287
|
+
{
|
|
288
|
+
order: 2,
|
|
289
|
+
action: 'Remove from git history using git-filter-repo or BFG',
|
|
290
|
+
code: `# Using git-filter-repo
|
|
291
|
+
pip install git-filter-repo
|
|
292
|
+
git filter-repo --replace-text <(echo '${match}==>REMOVED')`
|
|
293
|
+
},
|
|
294
|
+
{
|
|
295
|
+
order: 3,
|
|
296
|
+
action: 'Force push to remote (coordinate with team)',
|
|
297
|
+
code: 'git push --force-with-lease origin main'
|
|
298
|
+
}
|
|
299
|
+
],
|
|
300
|
+
auto_fixable: false
|
|
301
|
+
},
|
|
302
|
+
references: [
|
|
303
|
+
{
|
|
304
|
+
title: 'Removing sensitive data from GitHub',
|
|
305
|
+
url: 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository'
|
|
306
|
+
}
|
|
307
|
+
],
|
|
308
|
+
false_positive_likelihood: 'MEDIUM',
|
|
309
|
+
confidence: 0.75
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Create finding for .env file committed
|
|
314
|
+
*/
|
|
315
|
+
function createEnvFileFinding(commitHash, filePath, counter) {
|
|
316
|
+
return {
|
|
317
|
+
finding_id: (0, finding_js_1.generateFindingId)('secrets', counter),
|
|
318
|
+
timestamp: new Date().toISOString(),
|
|
319
|
+
severity: 'CRITICAL',
|
|
320
|
+
category: 'secrets',
|
|
321
|
+
subcategory: 'env_file_committed',
|
|
322
|
+
title: `.env file committed to repository`,
|
|
323
|
+
description: `A .env file (${filePath}) was committed to the repository. These files typically contain sensitive configuration and secrets.`,
|
|
324
|
+
location: {
|
|
325
|
+
file: filePath,
|
|
326
|
+
line: 1
|
|
327
|
+
},
|
|
328
|
+
evidence: {
|
|
329
|
+
commit_hash: commitHash,
|
|
330
|
+
file_path: filePath
|
|
331
|
+
},
|
|
332
|
+
impact: {
|
|
333
|
+
severity_score: 9.0,
|
|
334
|
+
description: 'Environment file with secrets committed to version control',
|
|
335
|
+
affected_resources: [`git:${filePath}`],
|
|
336
|
+
compliance_violations: ['OWASP-A05-2021', 'GDPR-Article-32']
|
|
337
|
+
},
|
|
338
|
+
remediation: {
|
|
339
|
+
summary: 'Remove .env file from repository and add to .gitignore',
|
|
340
|
+
priority: 'IMMEDIATE',
|
|
341
|
+
effort: 'MEDIUM',
|
|
342
|
+
steps: [
|
|
343
|
+
{
|
|
344
|
+
order: 1,
|
|
345
|
+
action: 'Add .env to .gitignore',
|
|
346
|
+
code: 'echo ".env" >> .gitignore'
|
|
347
|
+
},
|
|
348
|
+
{
|
|
349
|
+
order: 2,
|
|
350
|
+
action: 'Remove from git history',
|
|
351
|
+
code: `git rm --cached ${filePath}
|
|
352
|
+
git commit -m "Remove .env file from repository"`
|
|
353
|
+
},
|
|
354
|
+
{
|
|
355
|
+
order: 3,
|
|
356
|
+
action: 'Rotate all secrets in the .env file',
|
|
357
|
+
code: 'Change all passwords, API keys, and tokens that were in the file'
|
|
358
|
+
}
|
|
359
|
+
],
|
|
360
|
+
auto_fixable: false
|
|
361
|
+
},
|
|
362
|
+
references: [
|
|
363
|
+
{
|
|
364
|
+
title: 'GitHub - Removing sensitive data',
|
|
365
|
+
url: 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository'
|
|
366
|
+
}
|
|
367
|
+
],
|
|
368
|
+
false_positive_likelihood: 'VERY_LOW',
|
|
369
|
+
confidence: 0.95
|
|
370
|
+
};
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Create finding for private key committed
|
|
374
|
+
*/
|
|
375
|
+
function createPrivateKeyFinding(commitHash, filePath, counter) {
|
|
376
|
+
return {
|
|
377
|
+
finding_id: (0, finding_js_1.generateFindingId)('secrets', counter),
|
|
378
|
+
timestamp: new Date().toISOString(),
|
|
379
|
+
severity: 'CRITICAL',
|
|
380
|
+
category: 'secrets',
|
|
381
|
+
subcategory: 'private_key_committed',
|
|
382
|
+
title: `Private key committed to repository`,
|
|
383
|
+
description: `A private key file was committed to the repository at ${filePath}. Private keys should never be committed to version control.`,
|
|
384
|
+
location: {
|
|
385
|
+
file: filePath,
|
|
386
|
+
line: 1
|
|
387
|
+
},
|
|
388
|
+
evidence: {
|
|
389
|
+
commit_hash: commitHash,
|
|
390
|
+
file_path: filePath
|
|
391
|
+
},
|
|
392
|
+
impact: {
|
|
393
|
+
severity_score: 9.5,
|
|
394
|
+
description: 'Private key exposed - complete security compromise possible',
|
|
395
|
+
affected_resources: [`git:${filePath}`],
|
|
396
|
+
compliance_violations: ['OWASP-A05-2021', 'GDPR-Article-32']
|
|
397
|
+
},
|
|
398
|
+
remediation: {
|
|
399
|
+
summary: 'Remove private key and generate new one',
|
|
400
|
+
priority: 'IMMEDIATE',
|
|
401
|
+
effort: 'HIGH',
|
|
402
|
+
steps: [
|
|
403
|
+
{
|
|
404
|
+
order: 1,
|
|
405
|
+
action: 'Generate new private key',
|
|
406
|
+
code: 'ssh-keygen -t rsa -b 4096 -f new_key'
|
|
407
|
+
},
|
|
408
|
+
{
|
|
409
|
+
order: 2,
|
|
410
|
+
action: 'Remove old key from git history',
|
|
411
|
+
code: `git filter-repo --path ${filePath} --invert-paths`
|
|
412
|
+
},
|
|
413
|
+
{
|
|
414
|
+
order: 3,
|
|
415
|
+
action: 'Add key files to .gitignore',
|
|
416
|
+
code: `echo "*.pem" >> .gitignore
|
|
417
|
+
echo "*.key" >> .gitignore`
|
|
418
|
+
}
|
|
419
|
+
],
|
|
420
|
+
auto_fixable: false
|
|
421
|
+
},
|
|
422
|
+
references: [
|
|
423
|
+
{
|
|
424
|
+
title: 'GitHub - Removing sensitive data',
|
|
425
|
+
url: 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository'
|
|
426
|
+
}
|
|
427
|
+
],
|
|
428
|
+
false_positive_likelihood: 'VERY_LOW',
|
|
429
|
+
confidence: 0.98
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Create finding for secret in file
|
|
434
|
+
*/
|
|
435
|
+
function createFileSecretFinding(commitHash, filePath, type, counter) {
|
|
436
|
+
return {
|
|
437
|
+
finding_id: (0, finding_js_1.generateFindingId)('secrets', counter),
|
|
438
|
+
timestamp: new Date().toISOString(),
|
|
439
|
+
severity: 'HIGH',
|
|
440
|
+
category: 'secrets',
|
|
441
|
+
subcategory: 'file_secret',
|
|
442
|
+
title: `Potential ${type} in ${path.basename(filePath)}`,
|
|
443
|
+
description: `A potential ${type} was found in ${filePath} at commit ${commitHash.substring(0, 7)}.`,
|
|
444
|
+
location: {
|
|
445
|
+
file: filePath,
|
|
446
|
+
line: 1
|
|
447
|
+
},
|
|
448
|
+
evidence: {
|
|
449
|
+
commit_hash: commitHash,
|
|
450
|
+
file_path: filePath,
|
|
451
|
+
secret_type: type
|
|
452
|
+
},
|
|
453
|
+
impact: {
|
|
454
|
+
severity_score: 7.5,
|
|
455
|
+
description: 'Secret committed to version control',
|
|
456
|
+
affected_resources: [`git:${filePath}`]
|
|
457
|
+
},
|
|
458
|
+
remediation: {
|
|
459
|
+
summary: 'Remove secret from file and history',
|
|
460
|
+
priority: 'HIGH',
|
|
461
|
+
effort: 'HIGH',
|
|
462
|
+
steps: [
|
|
463
|
+
{
|
|
464
|
+
order: 1,
|
|
465
|
+
action: 'Rotate the exposed secret'
|
|
466
|
+
},
|
|
467
|
+
{
|
|
468
|
+
order: 2,
|
|
469
|
+
action: 'Remove from git history',
|
|
470
|
+
code: 'git filter-repo --replace-text <(echo "OLD_SECRET==>NEW_SECRET")'
|
|
471
|
+
}
|
|
472
|
+
],
|
|
473
|
+
auto_fixable: false
|
|
474
|
+
},
|
|
475
|
+
references: [
|
|
476
|
+
{
|
|
477
|
+
title: 'Removing sensitive data from GitHub',
|
|
478
|
+
url: 'https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository'
|
|
479
|
+
}
|
|
480
|
+
],
|
|
481
|
+
false_positive_likelihood: 'MEDIUM',
|
|
482
|
+
confidence: 0.75
|
|
483
|
+
};
|
|
484
|
+
}
|
|
485
|
+
/**
|
|
486
|
+
* Create finding for secrets in stash
|
|
487
|
+
*/
|
|
488
|
+
function createStashFinding(branch, counter) {
|
|
489
|
+
return {
|
|
490
|
+
finding_id: (0, finding_js_1.generateFindingId)('secrets', counter),
|
|
491
|
+
timestamp: new Date().toISOString(),
|
|
492
|
+
severity: 'MEDIUM',
|
|
493
|
+
category: 'secrets',
|
|
494
|
+
subcategory: 'stash_secret',
|
|
495
|
+
title: `Potential secrets in git stash on ${branch}`,
|
|
496
|
+
description: `There are stashed changes on branch ${branch}. Stashes may contain uncommitted secrets.`,
|
|
497
|
+
location: {
|
|
498
|
+
file: `stash:${branch}`
|
|
499
|
+
},
|
|
500
|
+
evidence: {
|
|
501
|
+
branch
|
|
502
|
+
},
|
|
503
|
+
impact: {
|
|
504
|
+
severity_score: 5.0,
|
|
505
|
+
description: 'Stashed changes may contain secrets',
|
|
506
|
+
affected_resources: [`git:stash:${branch}`]
|
|
507
|
+
},
|
|
508
|
+
remediation: {
|
|
509
|
+
summary: 'Review and clear git stash',
|
|
510
|
+
priority: 'MEDIUM',
|
|
511
|
+
effort: 'LOW',
|
|
512
|
+
steps: [
|
|
513
|
+
{
|
|
514
|
+
order: 1,
|
|
515
|
+
action: 'Review stash contents',
|
|
516
|
+
code: 'git stash show -p'
|
|
517
|
+
},
|
|
518
|
+
{
|
|
519
|
+
order: 2,
|
|
520
|
+
action: 'Clear stash if not needed',
|
|
521
|
+
code: 'git stash clear'
|
|
522
|
+
}
|
|
523
|
+
],
|
|
524
|
+
auto_fixable: false
|
|
525
|
+
},
|
|
526
|
+
references: [],
|
|
527
|
+
false_positive_likelihood: 'HIGH',
|
|
528
|
+
confidence: 0.5
|
|
529
|
+
};
|
|
530
|
+
}
|
|
531
|
+
//# sourceMappingURL=scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["../../../src/scanners/git/scanner.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCH,wCA+DC;AA7FD,wDAAqE;AACrE,iDAAyC;AACzC,uCAAyB;AACzB,2CAA6B;AAwB7B;;GAEG;AACI,KAAK,UAAU,cAAc,CAAC,OAAuB;IAC1D,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,cAAc,GAAG,CAAC,CAAC;IACvB,IAAI,eAAe,GAAG,CAAC,CAAC;IACxB,IAAI,YAAY,GAAG,CAAC,CAAC;IAErB,iCAAiC;IACjC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,OAAO;YACL,QAAQ,EAAE,EAAE;YACZ,cAAc,EAAE,CAAC;YACjB,eAAe,EAAE,CAAC;YAClB,YAAY,EAAE,CAAC;SAChB,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,sBAAsB;QACtB,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;QAChF,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;QAEhC,mBAAmB;QACnB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;YAC7B,sCAAsC;YACtC,MAAM,eAAe,GAAG,iBAAiB,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;YAClE,QAAQ,CAAC,IAAI,CAAC,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;YAC3C,cAAc,GAAG,eAAe,CAAC,WAAW,CAAC;YAC7C,YAAY,IAAI,eAAe,CAAC,QAAQ,CAAC,MAAM,CAAC;YAEhD,oCAAoC;YACpC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,cAAc,CAAC,CAAC;gBAC3F,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,CAAC;gBACxC,cAAc,GAAG,YAAY,CAAC,WAAW,CAAC;gBAC1C,YAAY,IAAI,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;YAC/C,CAAC;QACH,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC/C,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC;YAElC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAAG,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,CAAC;gBAC5E,QAAQ,CAAC,IAAI,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,CAAC;gBAC1C,cAAc,GAAG,cAAc,CAAC,WAAW,CAAC;gBAC5C,YAAY,IAAI,cAAc,CAAC,QAAQ,CAAC,MAAM,CAAC;YACjD,CAAC;QACH,CAAC;IAEH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,6BAA6B,EAAE,KAAK,CAAC,CAAC;IACtD,CAAC;IAED,OAAO;QACL,QAAQ;QACR,cAAc;QACd,eAAe;QACf,YAAY;KACb,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CAAC,QAAgB,EAAE,KAAc,EAAE,aAAqB,GAAG;IAC5E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,eAAe,CAAC;QAC/B,IAAI,GAAG,GAAG,WAAW,QAAQ,0BAA0B,MAAM,eAAe,CAAC;QAE7E,IAAI,KAAK,EAAE,CAAC;YACV,GAAG,IAAI,aAAa,KAAK,GAAG,CAAC;QAC/B,CAAC;QAED,GAAG,IAAI,OAAO,UAAU,EAAE,CAAC;QAE3B,MAAM,MAAM,GAAG,IAAA,wBAAQ,EAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,OAAO,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,MAAc;IACjC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAEjC,IAAI,aAAa,GAAsB,IAAI,CAAC;IAE5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,mCAAmC;QACnC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACvB,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YAC9B,CAAC;YAED,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAC9B,aAAa,GAAG;gBACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;gBAChB,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;gBACd,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,EAAE;gBACvB,KAAK,EAAE,EAAE;aACV,CAAC;QACJ,CAAC;aAAM,IAAI,aAAa,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,sBAAsB;YACtB,aAAa,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,aAAa,EAAE,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAC9B,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,QAAgB;IACnC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAA,wBAAQ,EACrB,WAAW,QAAQ,aAAa,EAChC,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QACF,OAAO,MAAM;aACV,KAAK,CAAC,IAAI,CAAC;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;aACxC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,iBAAiB,CACxB,MAAkB,EAClB,YAAoB;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,YAAY,CAAC;IAE3B,uCAAuC;IACvC,MAAM,QAAQ,GAAG;QACf,EAAE,OAAO,EAAE,uBAAuB,EAAE,IAAI,EAAE,UAAU,EAAE;QACtD,EAAE,OAAO,EAAE,0BAA0B,EAAE,IAAI,EAAE,SAAS,EAAE;QACxD,EAAE,OAAO,EAAE,qBAAqB,EAAE,IAAI,EAAE,QAAQ,EAAE;QAClD,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,OAAO,EAAE;QAChD,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE;QACrD,EAAE,OAAO,EAAE,sDAAsD,EAAE,IAAI,EAAE,KAAK,EAAE;KACjF,CAAC;IAEF,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,KAAK,EAAE,CAAC;YACV,QAAQ,CAAC,IAAI,CAAC,yBAAyB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC9E,CAAC;IACH,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CACvB,QAAgB,EAChB,UAAkB,EAClB,QAAgB,EAChB,YAAoB;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,YAAY,CAAC;IAE3B,IAAI,CAAC;QACH,kCAAkC;QAClC,MAAM,OAAO,GAAG,IAAA,wBAAQ,EACtB,WAAW,QAAQ,UAAU,UAAU,KAAK,QAAQ,GAAG,EACvD,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QAEF,uBAAuB;QACvB,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACpE,QAAQ,CAAC,IAAI,CAAC,oBAAoB,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,yBAAyB;QACzB,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,CAAC;YAC3E,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC1E,CAAC;QAED,mCAAmC;QACnC,MAAM,cAAc,GAAG;YACrB,EAAE,OAAO,EAAE,kCAAkC,EAAE,IAAI,EAAE,UAAU,EAAE;YACjE,EAAE,OAAO,EAAE,qCAAqC,EAAE,IAAI,EAAE,SAAS,EAAE;YACnE,EAAE,OAAO,EAAE,gCAAgC,EAAE,IAAI,EAAE,QAAQ,EAAE;YAC7D,EAAE,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,YAAY,EAAE;YACrD,EAAE,OAAO,EAAE,kBAAkB,EAAE,IAAI,EAAE,SAAS,EAAE;SACjD,CAAC;QAEF,KAAK,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,cAAc,EAAE,CAAC;YAC/C,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC1B,QAAQ,CAAC,IAAI,CAAC,uBAAuB,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;YAChF,CAAC;QACH,CAAC;IAEH,CAAC;IAAC,MAAM,CAAC;QACP,sCAAsC;IACxC,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,UAAU,CACjB,QAAgB,EAChB,MAAc,EACd,YAAoB;IAEpB,MAAM,QAAQ,GAAc,EAAE,CAAC;IAC/B,IAAI,OAAO,GAAG,YAAY,CAAC;IAE3B,4BAA4B;IAC5B,IAAI,CAAC;QACH,MAAM,SAAS,GAAG,IAAA,wBAAQ,EACxB,WAAW,QAAQ,cAAc,EACjC,EAAE,QAAQ,EAAE,OAAO,EAAE,CACtB,CAAC;QAEF,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;YAC/B,QAAQ,CAAC,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,oBAAoB;IACtB,CAAC;IAED,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,SAAS,yBAAyB,CAChC,MAAkB,EAClB,IAAY,EACZ,KAAa,EACb,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,IAAA,8BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,mBAAmB;QAChC,KAAK,EAAE,aAAa,IAAI,oBAAoB;QAC5C,WAAW,EAAE,eAAe,IAAI,2GAA2G;QAC3I,QAAQ,EAAE;YACR,IAAI,EAAE,UAAU,MAAM,CAAC,IAAI,EAAE;YAC7B,IAAI,EAAE,CAAC;SACR;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,aAAa,EAAE,MAAM,CAAC,MAAM;YAC5B,WAAW,EAAE,MAAM,CAAC,IAAI;YACxB,cAAc,EAAE,MAAM,CAAC,OAAO;YAC9B,WAAW,EAAE,IAAI;YACjB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK;SAC7C;QACD,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,oEAAoE;YACjF,kBAAkB,EAAE,CAAC,cAAc,MAAM,CAAC,IAAI,EAAE,CAAC;YACjD,qBAAqB,EAAE,CAAC,gBAAgB,CAAC;SAC1C;QACD,WAAW,EAAE;YACX,OAAO,EAAE,gCAAgC;YACzC,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,uCAAuC;oBAC/C,IAAI,EAAE,gEAAgE;iBACvE;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,sDAAsD;oBAC9D,IAAI,EAAE;;yCAEyB,KAAK,cAAc;iBACnD;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,6CAA6C;oBACrD,IAAI,EAAE,yCAAyC;iBAChD;aACF;YACD,YAAY,EAAE,KAAK;SACpB;QACD,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,qCAAqC;gBAC5C,GAAG,EAAE,0HAA0H;aAChI;SACF;QACD,yBAAyB,EAAE,QAAQ;QACnC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAC3B,UAAkB,EAClB,QAAgB,EAChB,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,IAAA,8BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,oBAAoB;QACjC,KAAK,EAAE,mCAAmC;QAC1C,WAAW,EAAE,gBAAgB,QAAQ,uGAAuG;QAC5I,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC;SACR;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;SACpB;QACD,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,4DAA4D;YACzE,kBAAkB,EAAE,CAAC,OAAO,QAAQ,EAAE,CAAC;YACvC,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;SAC7D;QACD,WAAW,EAAE;YACX,OAAO,EAAE,wDAAwD;YACjE,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,QAAQ;YAChB,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,wBAAwB;oBAChC,IAAI,EAAE,2BAA2B;iBAClC;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,yBAAyB;oBACjC,IAAI,EAAE,mBAAmB,QAAQ;iDACM;iBACxC;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,qCAAqC;oBAC7C,IAAI,EAAE,kEAAkE;iBACzE;aACF;YACD,YAAY,EAAE,KAAK;SACpB;QACD,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,kCAAkC;gBACzC,GAAG,EAAE,0HAA0H;aAChI;SACF;QACD,yBAAyB,EAAE,UAAU;QACrC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,UAAkB,EAClB,QAAgB,EAChB,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,IAAA,8BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,UAAU;QACpB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,uBAAuB;QACpC,KAAK,EAAE,qCAAqC;QAC5C,WAAW,EAAE,yDAAyD,QAAQ,8DAA8D;QAC5I,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC;SACR;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;SACpB;QACD,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,6DAA6D;YAC1E,kBAAkB,EAAE,CAAC,OAAO,QAAQ,EAAE,CAAC;YACvC,qBAAqB,EAAE,CAAC,gBAAgB,EAAE,iBAAiB,CAAC;SAC7D;QACD,WAAW,EAAE;YACX,OAAO,EAAE,yCAAyC;YAClD,QAAQ,EAAE,WAAW;YACrB,MAAM,EAAE,MAAM;YACd,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,0BAA0B;oBAClC,IAAI,EAAE,sCAAsC;iBAC7C;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,iCAAiC;oBACzC,IAAI,EAAE,0BAA0B,QAAQ,iBAAiB;iBAC1D;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,6BAA6B;oBACrC,IAAI,EAAE;2BACW;iBAClB;aACF;YACD,YAAY,EAAE,KAAK;SACpB;QACD,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,kCAAkC;gBACzC,GAAG,EAAE,0HAA0H;aAChI;SACF;QACD,yBAAyB,EAAE,UAAU;QACrC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,UAAkB,EAClB,QAAgB,EAChB,IAAY,EACZ,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,IAAA,8BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,MAAM;QAChB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,aAAa;QAC1B,KAAK,EAAE,aAAa,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;QACxD,WAAW,EAAE,eAAe,IAAI,iBAAiB,QAAQ,cAAc,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;QACpG,QAAQ,EAAE;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,CAAC;SACR;QACD,QAAQ,EAAE;YACR,WAAW,EAAE,UAAU;YACvB,SAAS,EAAE,QAAQ;YACnB,WAAW,EAAE,IAAI;SAClB;QACD,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,qCAAqC;YAClD,kBAAkB,EAAE,CAAC,OAAO,QAAQ,EAAE,CAAC;SACxC;QACD,WAAW,EAAE;YACX,OAAO,EAAE,qCAAqC;YAC9C,QAAQ,EAAE,MAAM;YAChB,MAAM,EAAE,MAAM;YACd,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,2BAA2B;iBACpC;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,yBAAyB;oBACjC,IAAI,EAAE,kEAAkE;iBACzE;aACF;YACD,YAAY,EAAE,KAAK;SACpB;QACD,UAAU,EAAE;YACV;gBACE,KAAK,EAAE,qCAAqC;gBAC5C,GAAG,EAAE,0HAA0H;aAChI;SACF;QACD,yBAAyB,EAAE,QAAQ;QACnC,UAAU,EAAE,IAAI;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CACzB,MAAc,EACd,OAAe;IAEf,OAAO;QACL,UAAU,EAAE,IAAA,8BAAiB,EAAC,SAAS,EAAE,OAAO,CAAC;QACjD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,QAAQ,EAAE,QAAQ;QAClB,QAAQ,EAAE,SAAS;QACnB,WAAW,EAAE,cAAc;QAC3B,KAAK,EAAE,qCAAqC,MAAM,EAAE;QACpD,WAAW,EAAE,uCAAuC,MAAM,4CAA4C;QACtG,QAAQ,EAAE;YACR,IAAI,EAAE,SAAS,MAAM,EAAE;SACxB;QACD,QAAQ,EAAE;YACR,MAAM;SACP;QACD,MAAM,EAAE;YACN,cAAc,EAAE,GAAG;YACnB,WAAW,EAAE,qCAAqC;YAClD,kBAAkB,EAAE,CAAC,aAAa,MAAM,EAAE,CAAC;SAC5C;QACD,WAAW,EAAE;YACX,OAAO,EAAE,4BAA4B;YACrC,QAAQ,EAAE,QAAQ;YAClB,MAAM,EAAE,KAAK;YACb,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,uBAAuB;oBAC/B,IAAI,EAAE,mBAAmB;iBAC1B;gBACD;oBACE,KAAK,EAAE,CAAC;oBACR,MAAM,EAAE,2BAA2B;oBACnC,IAAI,EAAE,iBAAiB;iBACxB;aACF;YACD,YAAY,EAAE,KAAK;SACpB;QACD,UAAU,EAAE,EAAE;QACd,yBAAyB,EAAE,MAAM;QACjC,UAAU,EAAE,GAAG;KAChB,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTPS/TLS Security Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Performs real HTTPS enforcement checks:
|
|
5
|
+
* - Verifies HTTPS is actually used
|
|
6
|
+
* - Checks TLS version and cipher suites
|
|
7
|
+
* - Tests for HSTS headers
|
|
8
|
+
* - Detects mixed content
|
|
9
|
+
* - Checks certificate details
|
|
10
|
+
*/
|
|
11
|
+
import { Finding, Category } from '../../models/finding.js';
|
|
12
|
+
export interface PassedCheck {
|
|
13
|
+
check_id: string;
|
|
14
|
+
category: Category;
|
|
15
|
+
title: string;
|
|
16
|
+
description: string;
|
|
17
|
+
}
|
|
18
|
+
export interface HTTPSCheckResult {
|
|
19
|
+
httpsEnabled: boolean;
|
|
20
|
+
tlsVersion: string | null;
|
|
21
|
+
hstsEnabled: boolean;
|
|
22
|
+
hstsMaxAge: number | null;
|
|
23
|
+
mixedContent: boolean;
|
|
24
|
+
certificateValid: boolean;
|
|
25
|
+
certificateExpiry: Date | null;
|
|
26
|
+
cipherSuites: string[];
|
|
27
|
+
vulnerabilities: string[];
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Analyze HTTPS/TLS configuration for a target URL
|
|
31
|
+
*/
|
|
32
|
+
export declare function analyzeHTTPS(targetUrl: string): Promise<{
|
|
33
|
+
findings: Finding[];
|
|
34
|
+
passedChecks: PassedCheck[];
|
|
35
|
+
httpsInfo: HTTPSCheckResult;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Check for mixed content on the page
|
|
39
|
+
*/
|
|
40
|
+
export declare function checkMixedContent(htmlContent: string, baseUrl: string): Promise<Finding[]>;
|
|
41
|
+
export default analyzeHTTPS;
|
|
42
|
+
//# sourceMappingURL=analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"analyzer.d.ts","sourceRoot":"","sources":["../../../src/scanners/https/analyzer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,EAAE,OAAO,EAAY,QAAQ,EAAsD,MAAM,yBAAyB,CAAC;AAE1H,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,gBAAgB;IAC/B,YAAY,EAAE,OAAO,CAAC;IACtB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,YAAY,EAAE,OAAO,CAAC;IACtB,gBAAgB,EAAE,OAAO,CAAC;IAC1B,iBAAiB,EAAE,IAAI,GAAG,IAAI,CAAC;IAC/B,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AAED;;GAEG;AAEH,wBAAsB,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IAC7D,QAAQ,EAAE,OAAO,EAAE,CAAC;IACpB,YAAY,EAAE,WAAW,EAAE,CAAC;IAC5B,SAAS,EAAE,gBAAgB,CAAC;CAC7B,CAAC,CA+SD;AAsJD;;GAEG;AACH,wBAAsB,iBAAiB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAqChG;AAED,eAAe,YAAY,CAAC"}
|