compromising-position 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +250 -0
  3. package/bin/compromising-position +29 -0
  4. package/dist/checks/hibp-email.d.ts +7 -0
  5. package/dist/checks/hibp-email.d.ts.map +1 -0
  6. package/dist/checks/hibp-email.js +99 -0
  7. package/dist/checks/hibp-email.js.map +1 -0
  8. package/dist/checks/hibp-password.d.ts +13 -0
  9. package/dist/checks/hibp-password.d.ts.map +1 -0
  10. package/dist/checks/hibp-password.js +119 -0
  11. package/dist/checks/hibp-password.js.map +1 -0
  12. package/dist/checks/local-check.d.ts +9 -0
  13. package/dist/checks/local-check.d.ts.map +1 -0
  14. package/dist/checks/local-check.js +36 -0
  15. package/dist/checks/local-check.js.map +1 -0
  16. package/dist/checks/plugin.d.ts +29 -0
  17. package/dist/checks/plugin.d.ts.map +1 -0
  18. package/dist/checks/plugin.js +2 -0
  19. package/dist/checks/plugin.js.map +1 -0
  20. package/dist/checks/plugins/common-secrets-plugin.d.ts +3 -0
  21. package/dist/checks/plugins/common-secrets-plugin.d.ts.map +1 -0
  22. package/dist/checks/plugins/common-secrets-plugin.js +130 -0
  23. package/dist/checks/plugins/common-secrets-plugin.js.map +1 -0
  24. package/dist/checks/plugins/dehashed-plugin.d.ts +3 -0
  25. package/dist/checks/plugins/dehashed-plugin.d.ts.map +1 -0
  26. package/dist/checks/plugins/dehashed-plugin.js +86 -0
  27. package/dist/checks/plugins/dehashed-plugin.js.map +1 -0
  28. package/dist/checks/plugins/emailrep-plugin.d.ts +3 -0
  29. package/dist/checks/plugins/emailrep-plugin.d.ts.map +1 -0
  30. package/dist/checks/plugins/emailrep-plugin.js +95 -0
  31. package/dist/checks/plugins/emailrep-plugin.js.map +1 -0
  32. package/dist/checks/plugins/gitguardian-hsl-plugin.d.ts +3 -0
  33. package/dist/checks/plugins/gitguardian-hsl-plugin.d.ts.map +1 -0
  34. package/dist/checks/plugins/gitguardian-hsl-plugin.js +75 -0
  35. package/dist/checks/plugins/gitguardian-hsl-plugin.js.map +1 -0
  36. package/dist/checks/plugins/hibp-email-plugin.d.ts +3 -0
  37. package/dist/checks/plugins/hibp-email-plugin.d.ts.map +1 -0
  38. package/dist/checks/plugins/hibp-email-plugin.js +73 -0
  39. package/dist/checks/plugins/hibp-email-plugin.js.map +1 -0
  40. package/dist/checks/plugins/hibp-password-plugin.d.ts +3 -0
  41. package/dist/checks/plugins/hibp-password-plugin.d.ts.map +1 -0
  42. package/dist/checks/plugins/hibp-password-plugin.js +39 -0
  43. package/dist/checks/plugins/hibp-password-plugin.js.map +1 -0
  44. package/dist/checks/plugins/intelx-plugin.d.ts +3 -0
  45. package/dist/checks/plugins/intelx-plugin.d.ts.map +1 -0
  46. package/dist/checks/plugins/intelx-plugin.js +113 -0
  47. package/dist/checks/plugins/intelx-plugin.js.map +1 -0
  48. package/dist/checks/plugins/leakcheck-plugin.d.ts +3 -0
  49. package/dist/checks/plugins/leakcheck-plugin.d.ts.map +1 -0
  50. package/dist/checks/plugins/leakcheck-plugin.js +82 -0
  51. package/dist/checks/plugins/leakcheck-plugin.js.map +1 -0
  52. package/dist/checks/plugins/local-analysis-plugin.d.ts +3 -0
  53. package/dist/checks/plugins/local-analysis-plugin.d.ts.map +1 -0
  54. package/dist/checks/plugins/local-analysis-plugin.js +36 -0
  55. package/dist/checks/plugins/local-analysis-plugin.js.map +1 -0
  56. package/dist/checks/registry.d.ts +24 -0
  57. package/dist/checks/registry.d.ts.map +1 -0
  58. package/dist/checks/registry.js +53 -0
  59. package/dist/checks/registry.js.map +1 -0
  60. package/dist/config/config.d.ts +10 -0
  61. package/dist/config/config.d.ts.map +1 -0
  62. package/dist/config/config.js +56 -0
  63. package/dist/config/config.js.map +1 -0
  64. package/dist/core/entropy.d.ts +23 -0
  65. package/dist/core/entropy.d.ts.map +1 -0
  66. package/dist/core/entropy.js +180 -0
  67. package/dist/core/entropy.js.map +1 -0
  68. package/dist/core/fingerprint.d.ts +7 -0
  69. package/dist/core/fingerprint.d.ts.map +1 -0
  70. package/dist/core/fingerprint.js +10 -0
  71. package/dist/core/fingerprint.js.map +1 -0
  72. package/dist/core/key-identifier.d.ts +9 -0
  73. package/dist/core/key-identifier.d.ts.map +1 -0
  74. package/dist/core/key-identifier.js +310 -0
  75. package/dist/core/key-identifier.js.map +1 -0
  76. package/dist/core/sanitize.d.ts +7 -0
  77. package/dist/core/sanitize.d.ts.map +1 -0
  78. package/dist/core/sanitize.js +15 -0
  79. package/dist/core/sanitize.js.map +1 -0
  80. package/dist/core/secure-buffer.d.ts +61 -0
  81. package/dist/core/secure-buffer.d.ts.map +1 -0
  82. package/dist/core/secure-buffer.js +122 -0
  83. package/dist/core/secure-buffer.js.map +1 -0
  84. package/dist/index.d.ts +4 -0
  85. package/dist/index.d.ts.map +1 -0
  86. package/dist/index.js +472 -0
  87. package/dist/index.js.map +1 -0
  88. package/dist/input/batch-parser.d.ts +21 -0
  89. package/dist/input/batch-parser.d.ts.map +1 -0
  90. package/dist/input/batch-parser.js +65 -0
  91. package/dist/input/batch-parser.js.map +1 -0
  92. package/dist/input/secure-prompt.d.ts +11 -0
  93. package/dist/input/secure-prompt.d.ts.map +1 -0
  94. package/dist/input/secure-prompt.js +105 -0
  95. package/dist/input/secure-prompt.js.map +1 -0
  96. package/dist/output/audit-log.d.ts +11 -0
  97. package/dist/output/audit-log.d.ts.map +1 -0
  98. package/dist/output/audit-log.js +50 -0
  99. package/dist/output/audit-log.js.map +1 -0
  100. package/dist/output/csv.d.ts +6 -0
  101. package/dist/output/csv.d.ts.map +1 -0
  102. package/dist/output/csv.js +28 -0
  103. package/dist/output/csv.js.map +1 -0
  104. package/dist/output/formatter.d.ts +12 -0
  105. package/dist/output/formatter.d.ts.map +1 -0
  106. package/dist/output/formatter.js +154 -0
  107. package/dist/output/formatter.js.map +1 -0
  108. package/dist/output/sarif.d.ts +6 -0
  109. package/dist/output/sarif.d.ts.map +1 -0
  110. package/dist/output/sarif.js +52 -0
  111. package/dist/output/sarif.js.map +1 -0
  112. package/dist/types/index.d.ts +141 -0
  113. package/dist/types/index.d.ts.map +1 -0
  114. package/dist/types/index.js +45 -0
  115. package/dist/types/index.js.map +1 -0
  116. package/dist/verification/anthropic-verifier.d.ts +3 -0
  117. package/dist/verification/anthropic-verifier.d.ts.map +1 -0
  118. package/dist/verification/anthropic-verifier.js +56 -0
  119. package/dist/verification/anthropic-verifier.js.map +1 -0
  120. package/dist/verification/aws-verifier.d.ts +14 -0
  121. package/dist/verification/aws-verifier.d.ts.map +1 -0
  122. package/dist/verification/aws-verifier.js +30 -0
  123. package/dist/verification/aws-verifier.js.map +1 -0
  124. package/dist/verification/github-verifier.d.ts +4 -0
  125. package/dist/verification/github-verifier.d.ts.map +1 -0
  126. package/dist/verification/github-verifier.js +62 -0
  127. package/dist/verification/github-verifier.js.map +1 -0
  128. package/dist/verification/openai-verifier.d.ts +4 -0
  129. package/dist/verification/openai-verifier.d.ts.map +1 -0
  130. package/dist/verification/openai-verifier.js +59 -0
  131. package/dist/verification/openai-verifier.js.map +1 -0
  132. package/dist/verification/slack-verifier.d.ts +4 -0
  133. package/dist/verification/slack-verifier.d.ts.map +1 -0
  134. package/dist/verification/slack-verifier.js +67 -0
  135. package/dist/verification/slack-verifier.js.map +1 -0
  136. package/dist/verification/verifier-registry.d.ts +13 -0
  137. package/dist/verification/verifier-registry.d.ts.map +1 -0
  138. package/dist/verification/verifier-registry.js +19 -0
  139. package/dist/verification/verifier-registry.js.map +1 -0
  140. package/dist/verification/verifier.d.ts +24 -0
  141. package/dist/verification/verifier.d.ts.map +1 -0
  142. package/dist/verification/verifier.js +2 -0
  143. package/dist/verification/verifier.js.map +1 -0
  144. package/package.json +61 -0
package/dist/index.js ADDED
@@ -0,0 +1,472 @@
1
+ import { Command } from "commander";
2
+ import { loadConfig } from "./config/config.js";
3
+ import { readSecret } from "./input/secure-prompt.js";
4
+ import { performLocalCheck } from "./checks/local-check.js";
5
+ import { checkHibpPassword } from "./checks/hibp-password.js";
6
+ import { checkHibpEmail } from "./checks/hibp-email.js";
7
+ import { CheckRegistry } from "./checks/registry.js";
8
+ import { fingerprint } from "./core/fingerprint.js";
9
+ import { sanitizeForTerminal } from "./core/sanitize.js";
10
+ import { formatReport, formatJson, formatPrivacySummary } from "./output/formatter.js";
11
+ import { formatSarif } from "./output/sarif.js";
12
+ import { formatCsv } from "./output/csv.js";
13
+ import { writeAuditLog } from "./output/audit-log.js";
14
+ import { parseEnvFile, parseJsonFile, disposeBatch } from "./input/batch-parser.js";
15
+ // Import plugins
16
+ import { hibpPasswordPlugin } from "./checks/plugins/hibp-password-plugin.js";
17
+ import { hibpEmailPlugin } from "./checks/plugins/hibp-email-plugin.js";
18
+ import { localAnalysisPlugin } from "./checks/plugins/local-analysis-plugin.js";
19
+ import { commonSecretsPlugin } from "./checks/plugins/common-secrets-plugin.js";
20
+ import { emailRepPlugin } from "./checks/plugins/emailrep-plugin.js";
21
+ import { gitGuardianHslPlugin } from "./checks/plugins/gitguardian-hsl-plugin.js";
22
+ import { dehashedPlugin } from "./checks/plugins/dehashed-plugin.js";
23
+ import { leakCheckPlugin } from "./checks/plugins/leakcheck-plugin.js";
24
+ import { intelXPlugin } from "./checks/plugins/intelx-plugin.js";
25
+ // Import verifiers
26
+ import { VerifierRegistry } from "./verification/verifier-registry.js";
27
+ import { openaiVerifier, openaiServiceVerifier } from "./verification/openai-verifier.js";
28
+ import { anthropicVerifier } from "./verification/anthropic-verifier.js";
29
+ import { githubPatVerifier, githubFineGrainedVerifier } from "./verification/github-verifier.js";
30
+ import { awsVerifier } from "./verification/aws-verifier.js";
31
+ import { slackBotVerifier, slackUserVerifier } from "./verification/slack-verifier.js";
32
+ // Build the global plugin registry
33
+ const registry = new CheckRegistry();
34
+ registry.register(localAnalysisPlugin);
35
+ registry.register(hibpPasswordPlugin);
36
+ registry.register(hibpEmailPlugin);
37
+ registry.register(commonSecretsPlugin);
38
+ registry.register(emailRepPlugin);
39
+ registry.register(gitGuardianHslPlugin);
40
+ registry.register(dehashedPlugin);
41
+ registry.register(leakCheckPlugin);
42
+ registry.register(intelXPlugin);
43
+ // Build the global verifier registry
44
+ const verifierRegistry = new VerifierRegistry();
45
+ verifierRegistry.register(openaiVerifier);
46
+ verifierRegistry.register(openaiServiceVerifier);
47
+ verifierRegistry.register(anthropicVerifier);
48
+ verifierRegistry.register(githubPatVerifier);
49
+ verifierRegistry.register(githubFineGrainedVerifier);
50
+ verifierRegistry.register(awsVerifier);
51
+ verifierRegistry.register(slackBotVerifier);
52
+ verifierRegistry.register(slackUserVerifier);
53
+ /** Simple yes/no prompt for verification consent. */
54
+ function promptYesNo() {
55
+ return new Promise((resolve) => {
56
+ const stdin = process.stdin;
57
+ stdin.setRawMode(true);
58
+ stdin.resume();
59
+ const onData = (data) => {
60
+ const ch = data.toString().toLowerCase();
61
+ stdin.setRawMode(false);
62
+ stdin.pause();
63
+ stdin.removeListener("data", onData);
64
+ if (ch === "y") {
65
+ process.stderr.write("y\n");
66
+ resolve(true);
67
+ }
68
+ else {
69
+ process.stderr.write("n\n");
70
+ resolve(false);
71
+ }
72
+ };
73
+ stdin.on("data", onData);
74
+ });
75
+ }
76
+ const program = new Command();
77
+ program
78
+ .name("compromising-position")
79
+ .description("Privacy-preserving credential exposure checker using k-anonymity")
80
+ .version("1.0.0");
81
+ program
82
+ .command("check")
83
+ .description("Check a secret/API key for exposure in breach databases")
84
+ .option("--offline", "Local analysis only — skip network checks")
85
+ .option("--json", "Output JSON to stdout (human report still goes to stderr)")
86
+ .option("--verbose", "Show additional details")
87
+ .option("--verify", "Attempt active key verification (sends key to provider API)")
88
+ .option("--privacy", "Show what data each plugin sends and where")
89
+ .option("--env-file <path>", "Path to .env file (default: auto-detect in cwd)")
90
+ .option("--audit-log <path>", "Path to append audit log entries")
91
+ .option("--enable-plugins <ids>", "Comma-separated list of plugin IDs to enable")
92
+ .option("--disable-plugins <ids>", "Comma-separated list of plugin IDs to disable")
93
+ .action(async (opts) => {
94
+ const config = loadConfig({
95
+ offline: opts.offline,
96
+ json: opts.json,
97
+ verbose: opts.verbose,
98
+ verify: opts.verify,
99
+ envFile: opts.envFile,
100
+ auditLogPath: opts.auditLog,
101
+ enabledPlugins: opts.enablePlugins
102
+ ? opts.enablePlugins.split(",").map((s) => s.trim())
103
+ : [],
104
+ disabledPlugins: opts.disablePlugins
105
+ ? opts.disablePlugins.split(",").map((s) => s.trim())
106
+ : [],
107
+ });
108
+ // --privacy: show data flow summary and exit
109
+ if (opts.privacy) {
110
+ process.stderr.write(formatPrivacySummary(registry.getAll()));
111
+ process.exit(0);
112
+ }
113
+ // Read the secret securely
114
+ const secret = await readSecret();
115
+ try {
116
+ // Layer 1: Local analysis (always runs)
117
+ const local = performLocalCheck(secret);
118
+ // Layer 2: HIBP k-anonymity check (unless offline)
119
+ let hibpPassword = null;
120
+ if (!config.offline) {
121
+ process.stderr.write("Checking HIBP (k-anonymity)...\n");
122
+ hibpPassword = await checkHibpPassword(secret);
123
+ }
124
+ // Layer 3: Run registered plugins
125
+ const runnablePlugins = registry.getRunnable("secret", config);
126
+ const pluginResults = [];
127
+ for (const plugin of runnablePlugins) {
128
+ // Skip built-in plugins that are already handled directly
129
+ if (plugin.id === "local-analysis" || plugin.id === "hibp-password") {
130
+ continue;
131
+ }
132
+ process.stderr.write(`Running ${plugin.name}...\n`);
133
+ const result = await plugin.check(secret, config);
134
+ pluginResults.push(result);
135
+ }
136
+ // Layer 4: Active verification (opt-in, requires --verify flag)
137
+ let verification = null;
138
+ if (config.verify && local.identification.provider !== "Unknown") {
139
+ const verifier = verifierRegistry.get(local.identification.provider);
140
+ if (verifier) {
141
+ process.stderr.write(`\nVerification will send your key to: ${verifier.endpoint}\n` +
142
+ `Purpose: ${verifier.description}\n` +
143
+ `Proceed? [y/N] `);
144
+ // In non-interactive mode (pipe), skip verification
145
+ if (!process.stdin.isTTY) {
146
+ process.stderr.write("(skipped — non-interactive mode)\n");
147
+ }
148
+ else {
149
+ const confirmed = await promptYesNo();
150
+ if (confirmed) {
151
+ process.stderr.write("Verifying key...\n");
152
+ verification = await verifier.verify(secret);
153
+ }
154
+ else {
155
+ process.stderr.write("Verification skipped.\n");
156
+ }
157
+ }
158
+ }
159
+ }
160
+ // Compute fingerprint before disposing
161
+ const fp = fingerprint(secret);
162
+ // Build result
163
+ const result = {
164
+ local,
165
+ hibpPassword,
166
+ hibpEmail: null,
167
+ pluginResults,
168
+ verification,
169
+ riskLevel: determineRiskLevel(local, hibpPassword, null, pluginResults, verification),
170
+ summary: buildSummary(local, hibpPassword, pluginResults, verification),
171
+ fingerprint: fp,
172
+ timestamp: new Date().toISOString(),
173
+ };
174
+ // Output
175
+ if (config.json) {
176
+ process.stdout.write(formatJson(result) + "\n");
177
+ }
178
+ // Always write human report to stderr
179
+ process.stderr.write(formatReport(result));
180
+ // Audit log
181
+ if (config.auditLogPath) {
182
+ await writeAuditLog(config.auditLogPath, result);
183
+ }
184
+ // Exit code: 0=safe, 1=exposed, 2=error
185
+ const exitCode = result.riskLevel === "critical" || result.riskLevel === "high"
186
+ ? 1
187
+ : 0;
188
+ process.exit(exitCode);
189
+ }
190
+ finally {
191
+ secret.dispose();
192
+ }
193
+ });
194
+ program
195
+ .command("check-email <email>")
196
+ .description("Check an email address against HIBP breach databases")
197
+ .option("--json", "Output JSON to stdout")
198
+ .option("--env-file <path>", "Path to .env file (default: auto-detect in cwd)")
199
+ .option("--audit-log <path>", "Path to append audit log entries")
200
+ .option("--enable-plugins <ids>", "Comma-separated list of plugin IDs to enable")
201
+ .option("--disable-plugins <ids>", "Comma-separated list of plugin IDs to disable")
202
+ .action(async (email, opts) => {
203
+ // Validate email format before proceeding
204
+ if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(email) || email.length > 254) {
205
+ process.stderr.write("Error: invalid email address format.\n");
206
+ process.exit(2);
207
+ }
208
+ const config = loadConfig({
209
+ json: opts.json,
210
+ envFile: opts.envFile,
211
+ auditLogPath: opts.auditLog,
212
+ enabledPlugins: opts.enablePlugins
213
+ ? opts.enablePlugins.split(",").map((s) => s.trim())
214
+ : [],
215
+ disabledPlugins: opts.disablePlugins
216
+ ? opts.disablePlugins.split(",").map((s) => s.trim())
217
+ : [],
218
+ });
219
+ if (!config.hibpApiKey) {
220
+ process.stderr.write("Error: HIBP API key required for email checks.\n" +
221
+ "Set HIBP_API_KEY environment variable or provide via .env file.\n" +
222
+ "Get a key at https://haveibeenpwned.com/API/Key ($3.50/mo)\n");
223
+ process.exit(2);
224
+ }
225
+ // Sanitize email for terminal output (prevent escape sequence injection)
226
+ process.stderr.write(`Checking email breaches for ${sanitizeForTerminal(email)}...\n`);
227
+ const emailResult = await checkHibpEmail(email, config.hibpApiKey);
228
+ // Run email-type plugins
229
+ const runnablePlugins = registry.getRunnable("email", config);
230
+ const pluginResults = [];
231
+ for (const plugin of runnablePlugins) {
232
+ if (plugin.id === "hibp-email")
233
+ continue; // already handled
234
+ process.stderr.write(`Running ${plugin.name}...\n`);
235
+ const result = await plugin.check(email, config);
236
+ pluginResults.push(result);
237
+ }
238
+ const riskLevel = determineEmailRiskLevel(emailResult, pluginResults);
239
+ const result = {
240
+ local: {
241
+ identification: {
242
+ provider: "Unknown",
243
+ confidence: "low",
244
+ description: "Email breach check",
245
+ },
246
+ entropy: {
247
+ shannonEntropy: 0,
248
+ maxPossibleEntropy: 0,
249
+ normalizedEntropy: 0,
250
+ encoding: "mixed",
251
+ length: email.length,
252
+ warning: null,
253
+ },
254
+ warnings: [],
255
+ looksLikeSecret: false,
256
+ },
257
+ hibpPassword: null,
258
+ hibpEmail: emailResult,
259
+ pluginResults,
260
+ verification: null,
261
+ riskLevel,
262
+ summary: buildEmailSummary(emailResult, pluginResults),
263
+ fingerprint: "email-check",
264
+ timestamp: new Date().toISOString(),
265
+ };
266
+ if (config.json) {
267
+ process.stdout.write(formatJson(result) + "\n");
268
+ }
269
+ process.stderr.write(formatReport(result));
270
+ if (config.auditLogPath) {
271
+ await writeAuditLog(config.auditLogPath, result);
272
+ }
273
+ const exitCode = riskLevel === "critical" || riskLevel === "high" ? 1 : 0;
274
+ process.exit(exitCode);
275
+ });
276
+ function determineRiskLevel(local, hibp, _email, pluginResults, verification) {
277
+ // Active + exposed = critical
278
+ if (verification?.active && pluginResults.some((p) => p.found)) {
279
+ return "critical";
280
+ }
281
+ if (verification?.active && hibp?.found) {
282
+ return "critical";
283
+ }
284
+ // Found in breach data = critical
285
+ if (hibp?.found && (hibp.occurrences ?? 0) > 0) {
286
+ return "critical";
287
+ }
288
+ // Any plugin found exposure at critical level
289
+ if (pluginResults.some((p) => p.found && p.severity === "critical")) {
290
+ return "critical";
291
+ }
292
+ // Any plugin found exposure at high level
293
+ if (pluginResults.some((p) => p.found && p.severity === "high")) {
294
+ return "high";
295
+ }
296
+ // Recognized provider key with high entropy = high risk if no HIBP check done
297
+ if (local.identification.confidence === "high" && local.looksLikeSecret) {
298
+ if (hibp === null) {
299
+ return "medium"; // offline check — we don't know
300
+ }
301
+ return "low"; // checked HIBP, not found
302
+ }
303
+ // Looks like a secret but unrecognized
304
+ if (local.looksLikeSecret) {
305
+ if (hibp?.found)
306
+ return "critical";
307
+ return hibp ? "low" : "medium";
308
+ }
309
+ // Plugin found something at medium level
310
+ if (pluginResults.some((p) => p.found && p.severity === "medium")) {
311
+ return "medium";
312
+ }
313
+ // Doesn't look like a secret
314
+ return "info";
315
+ }
316
+ function determineEmailRiskLevel(email, pluginResults) {
317
+ if (email.stealerLogs.length > 0)
318
+ return "critical";
319
+ if (email.breaches.length > 10)
320
+ return "critical";
321
+ if (pluginResults.some((p) => p.found && p.severity === "critical"))
322
+ return "critical";
323
+ if (email.breaches.length > 0)
324
+ return "high";
325
+ if (pluginResults.some((p) => p.found && p.severity === "high"))
326
+ return "high";
327
+ if (email.pastes.length > 0)
328
+ return "medium";
329
+ if (pluginResults.some((p) => p.found && p.severity === "medium"))
330
+ return "medium";
331
+ return "low";
332
+ }
333
+ function buildSummary(local, hibp, pluginResults, verification) {
334
+ const parts = [];
335
+ if (local.identification.provider !== "Unknown") {
336
+ parts.push(`Identified as ${local.identification.provider}`);
337
+ }
338
+ else {
339
+ parts.push("Unknown key format");
340
+ }
341
+ if (hibp?.found) {
342
+ parts.push(`EXPOSED in ${hibp.occurrences.toLocaleString()} breach(es)`);
343
+ }
344
+ else if (hibp?.checked && !hibp.error) {
345
+ parts.push("not found in HIBP breach data");
346
+ }
347
+ else if (hibp?.error) {
348
+ parts.push(`HIBP check failed: ${hibp.error}`);
349
+ }
350
+ // Summarize plugin findings
351
+ const foundPlugins = pluginResults.filter((p) => p.found);
352
+ if (foundPlugins.length > 0) {
353
+ parts.push(`found in ${foundPlugins.length} additional source(s)`);
354
+ }
355
+ if (verification?.active) {
356
+ parts.push("KEY IS CURRENTLY ACTIVE");
357
+ }
358
+ return parts.join(" — ");
359
+ }
360
+ function buildEmailSummary(email, pluginResults) {
361
+ if (email.error)
362
+ return `Email check failed: ${email.error}`;
363
+ const parts = [];
364
+ if (email.breaches.length > 0) {
365
+ parts.push(`${email.breaches.length} breach(es)`);
366
+ }
367
+ if (email.stealerLogs.length > 0) {
368
+ parts.push(`${email.stealerLogs.length} stealer log(s)`);
369
+ }
370
+ if (email.pastes.length > 0) {
371
+ parts.push(`${email.pastes.length} paste(s)`);
372
+ }
373
+ const foundPlugins = pluginResults.filter((p) => p.found);
374
+ if (foundPlugins.length > 0) {
375
+ parts.push(`${foundPlugins.length} additional source(s)`);
376
+ }
377
+ return parts.length > 0
378
+ ? `Found in: ${parts.join(", ")}`
379
+ : "No breaches found";
380
+ }
381
+ program
382
+ .command("check-batch <file>")
383
+ .description("Check multiple secrets from a .env or JSON file")
384
+ .option("--offline", "Local analysis only — skip network checks")
385
+ .option("--format <format>", "Output format: json, sarif, csv (default: json)", "json")
386
+ .option("--env-file <path>", "Path to .env file for config")
387
+ .option("--audit-log <path>", "Path to append audit log entries")
388
+ .action(async (file, opts) => {
389
+ const config = loadConfig({
390
+ offline: opts.offline,
391
+ envFile: opts.envFile,
392
+ auditLogPath: opts.auditLog,
393
+ json: true,
394
+ });
395
+ // Determine file format from extension
396
+ let entries;
397
+ if (file.endsWith(".json")) {
398
+ entries = parseJsonFile(file);
399
+ }
400
+ else {
401
+ // Default to .env format
402
+ entries = parseEnvFile(file);
403
+ }
404
+ if (entries.length === 0) {
405
+ process.stderr.write("No secrets found in input file.\n");
406
+ process.exit(0);
407
+ }
408
+ process.stderr.write(`Checking ${entries.length} secret(s)...\n`);
409
+ const results = [];
410
+ let hasExposure = false;
411
+ try {
412
+ for (const entry of entries) {
413
+ process.stderr.write(` Checking ${sanitizeForTerminal(entry.name)}...\n`);
414
+ const local = performLocalCheck(entry.secret);
415
+ let hibpPassword = null;
416
+ if (!config.offline) {
417
+ hibpPassword = await checkHibpPassword(entry.secret);
418
+ }
419
+ // Run plugins
420
+ const runnablePlugins = registry.getRunnable("secret", config);
421
+ const pluginResults = [];
422
+ for (const plugin of runnablePlugins) {
423
+ if (plugin.id === "local-analysis" || plugin.id === "hibp-password")
424
+ continue;
425
+ const pr = await plugin.check(entry.secret, config);
426
+ pluginResults.push(pr);
427
+ }
428
+ const fp = fingerprint(entry.secret);
429
+ const result = {
430
+ local,
431
+ hibpPassword,
432
+ hibpEmail: null,
433
+ pluginResults,
434
+ verification: null,
435
+ riskLevel: determineRiskLevel(local, hibpPassword, null, pluginResults, null),
436
+ summary: `[${entry.name}] ${buildSummary(local, hibpPassword, pluginResults, null)}`,
437
+ fingerprint: fp,
438
+ timestamp: new Date().toISOString(),
439
+ };
440
+ results.push(result);
441
+ if (result.riskLevel === "critical" || result.riskLevel === "high") {
442
+ hasExposure = true;
443
+ }
444
+ if (config.auditLogPath) {
445
+ await writeAuditLog(config.auditLogPath, result);
446
+ }
447
+ }
448
+ // Output
449
+ const format = opts.format;
450
+ if (format === "sarif") {
451
+ process.stdout.write(formatSarif(results) + "\n");
452
+ }
453
+ else if (format === "csv") {
454
+ process.stdout.write(formatCsv(results) + "\n");
455
+ }
456
+ else {
457
+ process.stdout.write(JSON.stringify(results, null, 2) + "\n");
458
+ }
459
+ // Summary to stderr
460
+ const critCount = results.filter((r) => r.riskLevel === "critical").length;
461
+ const highCount = results.filter((r) => r.riskLevel === "high").length;
462
+ process.stderr.write(`\nBatch complete: ${results.length} checked, ${critCount} critical, ${highCount} high\n`);
463
+ process.exit(hasExposure ? 1 : 0);
464
+ }
465
+ finally {
466
+ disposeBatch(entries);
467
+ }
468
+ });
469
+ // Export registry for external use (e.g., registering new plugins)
470
+ export { registry };
471
+ program.parse();
472
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { SecureBuffer } from "../core/secure-buffer.js";
2
+ export interface BatchEntry {
3
+ name: string;
4
+ secret: SecureBuffer;
5
+ }
6
+ /**
7
+ * Parse a .env file into batch entries.
8
+ * Supports KEY=VALUE and KEY="VALUE" formats.
9
+ * Skips comments (#) and empty lines.
10
+ */
11
+ export declare function parseEnvFile(path: string): BatchEntry[];
12
+ export declare function parseEnvString(content: string): BatchEntry[];
13
+ /**
14
+ * Parse a JSON file into batch entries.
15
+ * Expects { "KEY_NAME": "secret_value", ... }
16
+ */
17
+ export declare function parseJsonFile(path: string): BatchEntry[];
18
+ export declare function parseJsonString(content: string): BatchEntry[];
19
+ /** Dispose all SecureBuffers in a batch. */
20
+ export declare function disposeBatch(entries: BatchEntry[]): void;
21
+ //# sourceMappingURL=batch-parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-parser.d.ts","sourceRoot":"","sources":["../../src/input/batch-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD,MAAM,WAAW,UAAU;IACzB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAGvD;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CA+B5D;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,EAAE,CAGxD;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,EAAE,CAc7D;AAED,4CAA4C;AAC5C,wBAAgB,YAAY,CAAC,OAAO,EAAE,UAAU,EAAE,GAAG,IAAI,CAIxD"}
@@ -0,0 +1,65 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { SecureBuffer } from "../core/secure-buffer.js";
3
+ /**
4
+ * Parse a .env file into batch entries.
5
+ * Supports KEY=VALUE and KEY="VALUE" formats.
6
+ * Skips comments (#) and empty lines.
7
+ */
8
+ export function parseEnvFile(path) {
9
+ const content = readFileSync(path, "utf-8");
10
+ return parseEnvString(content);
11
+ }
12
+ export function parseEnvString(content) {
13
+ const entries = [];
14
+ for (const line of content.split("\n")) {
15
+ const trimmed = line.trim();
16
+ // Skip empty lines and comments
17
+ if (!trimmed || trimmed.startsWith("#"))
18
+ continue;
19
+ const eqIndex = trimmed.indexOf("=");
20
+ if (eqIndex === -1)
21
+ continue;
22
+ const name = trimmed.slice(0, eqIndex).trim();
23
+ let value = trimmed.slice(eqIndex + 1).trim();
24
+ // Strip surrounding quotes
25
+ if ((value.startsWith('"') && value.endsWith('"')) ||
26
+ (value.startsWith("'") && value.endsWith("'"))) {
27
+ value = value.slice(1, -1);
28
+ }
29
+ if (!name || !value)
30
+ continue;
31
+ entries.push({
32
+ name,
33
+ secret: SecureBuffer.fromString(value),
34
+ });
35
+ }
36
+ return entries;
37
+ }
38
+ /**
39
+ * Parse a JSON file into batch entries.
40
+ * Expects { "KEY_NAME": "secret_value", ... }
41
+ */
42
+ export function parseJsonFile(path) {
43
+ const content = readFileSync(path, "utf-8");
44
+ return parseJsonString(content);
45
+ }
46
+ export function parseJsonString(content) {
47
+ const data = JSON.parse(content);
48
+ const entries = [];
49
+ for (const [name, value] of Object.entries(data)) {
50
+ if (typeof value === "string" && value.length > 0) {
51
+ entries.push({
52
+ name,
53
+ secret: SecureBuffer.fromString(value),
54
+ });
55
+ }
56
+ }
57
+ return entries;
58
+ }
59
+ /** Dispose all SecureBuffers in a batch. */
60
+ export function disposeBatch(entries) {
61
+ for (const entry of entries) {
62
+ entry.secret.dispose();
63
+ }
64
+ }
65
+ //# sourceMappingURL=batch-parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batch-parser.js","sourceRoot":"","sources":["../../src/input/batch-parser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAOxD;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe;IAC5C,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,gCAAgC;QAChC,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QAElD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC;YAAE,SAAS;QAE7B,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9C,IAAI,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAE9C,2BAA2B;QAC3B,IACE,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC9C,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,EAC9C,CAAC;YACD,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK;YAAE,SAAS;QAE9B,OAAO,CAAC,IAAI,CAAC;YACX,IAAI;YACJ,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;SACvC,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,OAAO,GAAG,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,eAAe,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAAe;IAC7C,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IAC5D,MAAM,OAAO,GAAiB,EAAE,CAAC;IAEjC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClD,OAAO,CAAC,IAAI,CAAC;gBACX,IAAI;gBACJ,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,KAAK,CAAC;aACvC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,4CAA4C;AAC5C,MAAM,UAAU,YAAY,CAAC,OAAqB;IAChD,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACzB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { SecureBuffer } from "../core/secure-buffer.js";
2
+ /**
3
+ * Read a secret from stdin.
4
+ *
5
+ * - If stdin is a pipe: reads all data from the pipe.
6
+ * - If stdin is a TTY: prompts interactively with hidden input.
7
+ *
8
+ * Always returns a SecureBuffer (Buffer-backed, not String).
9
+ */
10
+ export declare function readSecret(): Promise<SecureBuffer>;
11
+ //# sourceMappingURL=secure-prompt.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secure-prompt.d.ts","sourceRoot":"","sources":["../../src/input/secure-prompt.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AAExD;;;;;;;GAOG;AACH,wBAAsB,UAAU,IAAI,OAAO,CAAC,YAAY,CAAC,CAKxD"}