supasec 1.0.3 → 1.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/Feature-List.md +233 -0
  2. package/README.md +53 -12
  3. package/dist/cli.js +2 -0
  4. package/dist/cli.js.map +1 -1
  5. package/dist/commands/index.d.ts +1 -0
  6. package/dist/commands/index.d.ts.map +1 -1
  7. package/dist/commands/index.js +1 -0
  8. package/dist/commands/index.js.map +1 -1
  9. package/dist/commands/scan.d.ts.map +1 -1
  10. package/dist/commands/scan.js +82 -26
  11. package/dist/commands/scan.js.map +1 -1
  12. package/dist/commands/snapshot.d.ts +32 -0
  13. package/dist/commands/snapshot.d.ts.map +1 -0
  14. package/dist/commands/snapshot.js +282 -0
  15. package/dist/commands/snapshot.js.map +1 -0
  16. package/dist/reporters/html.d.ts +3 -2
  17. package/dist/reporters/html.d.ts.map +1 -1
  18. package/dist/reporters/html.js +844 -538
  19. package/dist/reporters/html.js.map +1 -1
  20. package/dist/reporters/terminal.d.ts +38 -2
  21. package/dist/reporters/terminal.d.ts.map +1 -1
  22. package/dist/reporters/terminal.js +292 -131
  23. package/dist/reporters/terminal.js.map +1 -1
  24. package/dist/scanners/auth/analyzer.d.ts +40 -0
  25. package/dist/scanners/auth/analyzer.d.ts.map +1 -0
  26. package/dist/scanners/auth/analyzer.js +673 -0
  27. package/dist/scanners/auth/analyzer.js.map +1 -0
  28. package/dist/scanners/auth/index.d.ts +6 -0
  29. package/dist/scanners/auth/index.d.ts.map +1 -0
  30. package/dist/scanners/auth/index.js +22 -0
  31. package/dist/scanners/auth/index.js.map +1 -0
  32. package/dist/scanners/edge/analyzer.d.ts +35 -0
  33. package/dist/scanners/edge/analyzer.d.ts.map +1 -0
  34. package/dist/scanners/edge/analyzer.js +614 -0
  35. package/dist/scanners/edge/analyzer.js.map +1 -0
  36. package/dist/scanners/edge/index.d.ts +6 -0
  37. package/dist/scanners/edge/index.d.ts.map +1 -0
  38. package/dist/scanners/edge/index.js +22 -0
  39. package/dist/scanners/edge/index.js.map +1 -0
  40. package/dist/scanners/functions/analyzer.d.ts +41 -0
  41. package/dist/scanners/functions/analyzer.d.ts.map +1 -0
  42. package/dist/scanners/functions/analyzer.js +378 -0
  43. package/dist/scanners/functions/analyzer.js.map +1 -0
  44. package/dist/scanners/functions/index.d.ts +6 -0
  45. package/dist/scanners/functions/index.d.ts.map +1 -0
  46. package/dist/scanners/functions/index.js +22 -0
  47. package/dist/scanners/functions/index.js.map +1 -0
  48. package/dist/scanners/git/index.d.ts +6 -0
  49. package/dist/scanners/git/index.d.ts.map +1 -0
  50. package/dist/scanners/git/index.js +22 -0
  51. package/dist/scanners/git/index.js.map +1 -0
  52. package/dist/scanners/git/scanner.d.ts +22 -0
  53. package/dist/scanners/git/scanner.d.ts.map +1 -0
  54. package/dist/scanners/git/scanner.js +531 -0
  55. package/dist/scanners/git/scanner.js.map +1 -0
  56. package/dist/scanners/https/analyzer.d.ts +42 -0
  57. package/dist/scanners/https/analyzer.d.ts.map +1 -0
  58. package/dist/scanners/https/analyzer.js +470 -0
  59. package/dist/scanners/https/analyzer.js.map +1 -0
  60. package/dist/scanners/https/index.d.ts +8 -0
  61. package/dist/scanners/https/index.d.ts.map +1 -0
  62. package/dist/scanners/https/index.js +17 -0
  63. package/dist/scanners/https/index.js.map +1 -0
  64. package/dist/scanners/index.d.ts +6 -0
  65. package/dist/scanners/index.d.ts.map +1 -1
  66. package/dist/scanners/index.js +6 -0
  67. package/dist/scanners/index.js.map +1 -1
  68. package/dist/scanners/rls/fuzzer.d.ts +40 -0
  69. package/dist/scanners/rls/fuzzer.d.ts.map +1 -0
  70. package/dist/scanners/rls/fuzzer.js +360 -0
  71. package/dist/scanners/rls/fuzzer.js.map +1 -0
  72. package/dist/scanners/rls/index.d.ts +1 -0
  73. package/dist/scanners/rls/index.d.ts.map +1 -1
  74. package/dist/scanners/rls/index.js +1 -0
  75. package/dist/scanners/rls/index.js.map +1 -1
  76. package/dist/scanners/secrets/detector.d.ts.map +1 -1
  77. package/dist/scanners/secrets/detector.js +44 -12
  78. package/dist/scanners/secrets/detector.js.map +1 -1
  79. package/dist/scanners/secrets/index.d.ts +1 -0
  80. package/dist/scanners/secrets/index.d.ts.map +1 -1
  81. package/dist/scanners/secrets/index.js +4 -0
  82. package/dist/scanners/secrets/index.js.map +1 -1
  83. package/dist/scanners/secrets/patterns.d.ts +25 -0
  84. package/dist/scanners/secrets/patterns.d.ts.map +1 -1
  85. package/dist/scanners/secrets/patterns.js +138 -27
  86. package/dist/scanners/secrets/patterns.js.map +1 -1
  87. package/dist/scanners/storage/analyzer.d.ts +49 -0
  88. package/dist/scanners/storage/analyzer.d.ts.map +1 -0
  89. package/dist/scanners/storage/analyzer.js +438 -0
  90. package/dist/scanners/storage/analyzer.js.map +1 -0
  91. package/dist/scanners/storage/index.d.ts +6 -0
  92. package/dist/scanners/storage/index.d.ts.map +1 -0
  93. package/dist/scanners/storage/index.js +22 -0
  94. package/dist/scanners/storage/index.js.map +1 -0
  95. package/package.json +1 -1
  96. package/reports/{supasec-audityour-app-2026-01-28-17-09-24.html → supasec-audityour-app-2026-01-28-19-42-22.html} +51 -16
  97. package/reports/supasec-audityour-app-2026-01-28-19-49-18.html +1122 -0
  98. package/COMPLETION_REPORT.md +0 -324
  99. package/FIXES_SUMMARY.md +0 -224
  100. package/IMPLEMENTATION_NOTES.md +0 -305
  101. package/QUICK_REFERENCE.md +0 -185
  102. package/REPORTING.md +0 -217
  103. package/STATUS.md +0 -269
  104. package/reports/supasec---------app-2026-01-28-16-58-47.html +0 -804
  105. package/reports/supasec---------app-2026-01-28-17-06-43.html +0 -722
  106. package/reports/supasec---------app-2026-01-28-17-07-23.html +0 -722
  107. package/reports/supasec---------app-2026-01-28-17-08-00.html +0 -722
  108. package/reports/supasec---------app-2026-01-28-17-08-20.html +0 -722
  109. package/reports/supasec---------app-2026-01-28-17-08-41.html +0 -722
  110. package/reports/supasec-au---your-app-2026-01-28-17-14-57.html +0 -715
  111. package/reports/supasec-au---your-app-2026-01-28-17-19-03.html +0 -715
  112. package/reports/supasec-ex-mple-com-2026-01-28-17-14-52.json +0 -229
  113. package/reports/supasec-ex-mple-com-2026-01-28-17-15-39.html +0 -715
  114. package/reports/supasec-ex-mple-com-2026-01-28-17-17-22.html +0 -715
  115. package/reports/supasec-example-com-2026-01-28-17-15-06.html +0 -715
  116. package/reports/supasec-my--------------name-com-2026-01-28-17-15-02.html +0 -715
  117. package/reports/supasec-st-ging-com-2026-01-28-17-16-17.html +0 -715
@@ -0,0 +1,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":"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"}
@@ -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"}