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
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const commonSecretsPlugin: CheckPlugin;
3
+ //# sourceMappingURL=common-secrets-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-secrets-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/common-secrets-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAwEhD,eAAO,MAAM,mBAAmB,EAAE,WA0EjC,CAAC"}
@@ -0,0 +1,130 @@
1
+ /**
2
+ * SHA-256 hashes of common passwords, default credentials, and placeholder values.
3
+ * Stored as hashes so the actual secrets never appear in source code.
4
+ * Implements NIST SP 800-63B Rev 4 mandatory blocklist screening.
5
+ */
6
+ const COMMON_SECRET_HASHES = new Set([
7
+ // Top passwords: password, 123456, 12345678, qwerty, abc123, monkey, 1234567,
8
+ // letmein, trustno1, dragon, baseball, master, etc.
9
+ "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8", // password
10
+ "8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92", // 123456
11
+ "ef797c8118f02dfb649607dd5d3f8c7623048c9c063d532cc95c5ed7a898a64f", // 12345678
12
+ "65e84be33532fb784c48129675f9eff3a682b27168c0ea744b2cf58ee02337c5", // qwerty
13
+ "6ca13d52ca70c883e0f0bb101e425a89e8624de51db2d2392593af6a84118090", // abc123
14
+ "ab56b4d92b40713acc5af89985d4b786c2f8fcc30898a36a2c8e3b3b3cdd7460", // 1234567
15
+ "a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3", // 123456789
16
+ "03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4", // 1234
17
+ "5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5", // 12345
18
+ "20f3765880a5c269b747e1e906054a4b4a3a991259f1e16b5dde4742cec2319a", // 1234567890
19
+ "b822f1cd2dcfc685b47e83e3980289fd5d8e3ff3a82def24d7d1d68bb272eb32", // letmein
20
+ "fcab0453879a2b2281bc5073e3f5f93b2aee8f41109fbc3983180bfbf6ce8ade", // trustno1
21
+ "8621ffdbc5698829397d97767ac13db3f084e3e8d68e506c9cf5658c9e89b1c8", // dragon
22
+ "5906ac361a137e2d286465cd6588ebb5ac3f5ae955001100bc41577c3d751764", // baseball
23
+ "a8cfcd74832004951b4408cdb0a5dbcd8c7e52d43f7fe244bf720582e05241da", // iloveyou
24
+ "0ffe1abd1a08215353c233d6e009613e95eec4253832a761af28ff37ac5a150c", // master
25
+ "b7e94be513e96e8c45cd23f162275e5a12ebde9100a425c4ebcdd7fa4dcd897c", // sunshine
26
+ "f2d81a260dea8a100dd517984e53c56a7523d96942a834b9cdc249bd4e8c7aa9", // ashley
27
+ "b4b147bc522828731f1a016bfa72c073571be76ab0adb1a841c5eb4b79a56271", // michael
28
+ "2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824", // hello
29
+ // Common placeholder/test values
30
+ "057ba03d6c44104863dc7361fe4578965d1887360f90a0895882e58a6248fc86", // changeme
31
+ "8bb0cf6eb9b17d0f7d22b456f121257dc1254e1f01665370476383ea776df414", // password1
32
+ "b03ddf3ca2e714a6548e7495e2a03f5e824eaac9837cd7f159c67b90fb4b7342", // Password1
33
+ "a075d17f3d453073853f813838c15b8023b8c487038436354fe599c3942e1f95", // admin
34
+ "f0e4c2f76c58916ec258f246851bea091d14d4247a2fc3e18694461b1816e13b", // test
35
+ "e3b98a4da31a127d4bde6e43033f66ba274cab0eb7eb1c70ec41402bf6273dd8", // default
36
+ "4fc82b26aecb47d2868c4efbe3581732a3e7cbcc6c2efb32062c08170a05eeb8", // secret
37
+ "2bb80d537b1da3e38bd30361aa855686bde0eacd7162fef6a25fe97bf527a25b", // secret
38
+ ]);
39
+ /** Known placeholder patterns that indicate test/dummy values. */
40
+ const PLACEHOLDER_PATTERNS = [
41
+ /^your[-_]?api[-_]?key[-_]?here$/i,
42
+ /^insert[-_]?api[-_]?key$/i,
43
+ /^replace[-_]?me$/i,
44
+ /^xxx+$/i,
45
+ /^todo$/i,
46
+ /^fixme$/i,
47
+ /^example$/i,
48
+ /^test[-_]?key$/i,
49
+ /^dummy$/i,
50
+ /^fake[-_]?key$/i,
51
+ /^placeholder$/i,
52
+ /^changeme$/i,
53
+ /^your[-_]?token[-_]?here$/i,
54
+ /^sk[-_]test[-_]xxx+$/i,
55
+ ];
56
+ /** Sequential and keyboard patterns. */
57
+ const SEQUENTIAL_PATTERNS = [
58
+ /^(.)\1{7,}$/, // aaaaaaaa
59
+ /^0123456789/,
60
+ /^abcdefgh/i,
61
+ /^qwerty/i,
62
+ /^asdfgh/i,
63
+ /^zxcvbn/i,
64
+ ];
65
+ export const commonSecretsPlugin = {
66
+ id: "common-secrets",
67
+ name: "Common/Weak Secret Detection",
68
+ inputKind: "secret",
69
+ requiresNetwork: false,
70
+ requiredConfigKeys: [],
71
+ isFree: true,
72
+ privacySummary: "No data sent (local only)",
73
+ async check(input, _config) {
74
+ const secret = input;
75
+ // Check against hashed blocklist
76
+ const hash = secret.sha256Hex();
77
+ if (COMMON_SECRET_HASHES.has(hash)) {
78
+ return {
79
+ pluginId: "common-secrets",
80
+ pluginName: "Common/Weak Secret Detection",
81
+ found: true,
82
+ details: "Matches a commonly used password or default credential",
83
+ severity: "critical",
84
+ error: null,
85
+ metadata: { matchType: "blocklist" },
86
+ };
87
+ }
88
+ // Check placeholder patterns
89
+ const matchesPlaceholder = secret.withString((raw) => {
90
+ const trimmed = raw.trim();
91
+ return PLACEHOLDER_PATTERNS.some((p) => p.test(trimmed));
92
+ });
93
+ if (matchesPlaceholder) {
94
+ return {
95
+ pluginId: "common-secrets",
96
+ pluginName: "Common/Weak Secret Detection",
97
+ found: true,
98
+ details: "Matches a known placeholder or test value pattern",
99
+ severity: "medium",
100
+ error: null,
101
+ metadata: { matchType: "placeholder" },
102
+ };
103
+ }
104
+ // Check sequential/keyboard patterns
105
+ const matchesSequential = secret.withString((raw) => {
106
+ const trimmed = raw.trim();
107
+ return SEQUENTIAL_PATTERNS.some((p) => p.test(trimmed));
108
+ });
109
+ if (matchesSequential) {
110
+ return {
111
+ pluginId: "common-secrets",
112
+ pluginName: "Common/Weak Secret Detection",
113
+ found: true,
114
+ details: "Contains a sequential or keyboard pattern",
115
+ severity: "high",
116
+ error: null,
117
+ metadata: { matchType: "sequential" },
118
+ };
119
+ }
120
+ return {
121
+ pluginId: "common-secrets",
122
+ pluginName: "Common/Weak Secret Detection",
123
+ found: false,
124
+ details: "Not found in common secrets blocklist",
125
+ severity: "low",
126
+ error: null,
127
+ };
128
+ },
129
+ };
130
+ //# sourceMappingURL=common-secrets-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common-secrets-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/common-secrets-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const dehashedPlugin: CheckPlugin;
3
+ //# sourceMappingURL=dehashed-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dehashed-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/dehashed-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AA4BhD,eAAO,MAAM,cAAc,EAAE,WA+F5B,CAAC"}
@@ -0,0 +1,86 @@
1
+ import { sanitizeForTerminal } from "../../core/sanitize.js";
2
+ const DEHASHED_BASE = "https://api.dehashed.com/search";
3
+ const USER_AGENT = "compromising-position/1.0.0";
4
+ export const dehashedPlugin = {
5
+ id: "dehashed",
6
+ name: "DeHashed",
7
+ inputKind: "email",
8
+ requiresNetwork: true,
9
+ requiredConfigKeys: ["DEHASHED_EMAIL", "DEHASHED_API_KEY"],
10
+ isFree: false,
11
+ privacySummary: "Full email -> api.dehashed.com (requires paid API key)",
12
+ async check(input, config) {
13
+ const email = input;
14
+ const dehashedEmail = config.pluginApiKeys["DEHASHED_EMAIL"];
15
+ const apiKey = config.pluginApiKeys["DEHASHED_API_KEY"];
16
+ if (!dehashedEmail || !apiKey) {
17
+ return {
18
+ pluginId: "dehashed",
19
+ pluginName: "DeHashed",
20
+ found: false,
21
+ details: "DeHashed credentials not configured",
22
+ severity: "info",
23
+ error: "Missing DEHASHED_EMAIL and/or DEHASHED_API_KEY",
24
+ };
25
+ }
26
+ try {
27
+ const credentials = Buffer.from(`${dehashedEmail}:${apiKey}`).toString("base64");
28
+ const response = await fetch(`${DEHASHED_BASE}?query=email:${encodeURIComponent(email)}&size=10`, {
29
+ headers: {
30
+ Accept: "application/json",
31
+ Authorization: `Basic ${credentials}`,
32
+ "User-Agent": USER_AGENT,
33
+ },
34
+ });
35
+ if (!response.ok) {
36
+ const statusText = sanitizeForTerminal(response.statusText);
37
+ return {
38
+ pluginId: "dehashed",
39
+ pluginName: "DeHashed",
40
+ found: false,
41
+ details: `API error: ${response.status} ${statusText}`,
42
+ severity: "info",
43
+ error: `DeHashed API returned ${response.status}: ${statusText}`,
44
+ };
45
+ }
46
+ const data = (await response.json());
47
+ const found = data.total > 0;
48
+ // Count unique databases
49
+ const databases = new Set((data.entries ?? []).map((e) => e.database_name).filter(Boolean));
50
+ let severity = "low";
51
+ if (data.total > 10) {
52
+ severity = "critical";
53
+ }
54
+ else if (data.total > 0) {
55
+ severity = "high";
56
+ }
57
+ return {
58
+ pluginId: "dehashed",
59
+ pluginName: "DeHashed",
60
+ found,
61
+ details: found
62
+ ? `Found ${data.total} record(s) across ${databases.size} database(s)`
63
+ : "Not found in DeHashed database",
64
+ severity,
65
+ error: null,
66
+ metadata: {
67
+ total: data.total,
68
+ uniqueDatabases: databases.size,
69
+ balance: data.balance,
70
+ },
71
+ };
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : String(err);
75
+ return {
76
+ pluginId: "dehashed",
77
+ pluginName: "DeHashed",
78
+ found: false,
79
+ details: `Network error: ${sanitizeForTerminal(message)}`,
80
+ severity: "info",
81
+ error: sanitizeForTerminal(message),
82
+ };
83
+ }
84
+ },
85
+ };
86
+ //# sourceMappingURL=dehashed-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dehashed-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/dehashed-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const emailRepPlugin: CheckPlugin;
3
+ //# sourceMappingURL=emailrep-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailrep-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/emailrep-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAsChD,eAAO,MAAM,cAAc,EAAE,WAoG5B,CAAC"}
@@ -0,0 +1,95 @@
1
+ import { sanitizeForTerminal } from "../../core/sanitize.js";
2
+ const EMAILREP_BASE = "https://emailrep.io";
3
+ const USER_AGENT = "compromising-position/1.0.0";
4
+ export const emailRepPlugin = {
5
+ id: "emailrep",
6
+ name: "EmailRep.io",
7
+ inputKind: "email",
8
+ requiresNetwork: true,
9
+ requiredConfigKeys: [],
10
+ isFree: true,
11
+ privacySummary: "Full email -> emailrep.io (free, 100/day)",
12
+ async check(input, config) {
13
+ const email = input;
14
+ const apiKey = config.pluginApiKeys["EMAILREP_API_KEY"];
15
+ try {
16
+ const headers = {
17
+ "User-Agent": USER_AGENT,
18
+ Accept: "application/json",
19
+ };
20
+ if (apiKey) {
21
+ headers["Key"] = apiKey;
22
+ }
23
+ const response = await fetch(`${EMAILREP_BASE}/${encodeURIComponent(email)}`, {
24
+ headers,
25
+ });
26
+ if (!response.ok) {
27
+ const statusText = sanitizeForTerminal(response.statusText);
28
+ return {
29
+ pluginId: "emailrep",
30
+ pluginName: "EmailRep.io",
31
+ found: false,
32
+ details: `API error: ${response.status} ${statusText}`,
33
+ severity: "info",
34
+ error: `EmailRep API returned ${response.status}: ${statusText}`,
35
+ };
36
+ }
37
+ const data = (await response.json());
38
+ const findings = [];
39
+ if (data.details.credentials_leaked) {
40
+ findings.push("credentials leaked");
41
+ }
42
+ if (data.details.data_breach) {
43
+ findings.push("found in data breach");
44
+ }
45
+ if (data.details.dark_web_appearance) {
46
+ findings.push("dark web appearance");
47
+ }
48
+ if (data.details.malicious_activity) {
49
+ findings.push("malicious activity detected");
50
+ }
51
+ const found = findings.length > 0;
52
+ let severity = "low";
53
+ if (data.details.credentials_leaked_recent || data.details.malicious_activity_recent) {
54
+ severity = "critical";
55
+ }
56
+ else if (data.details.credentials_leaked || data.details.dark_web_appearance) {
57
+ severity = "high";
58
+ }
59
+ else if (data.details.data_breach || data.suspicious) {
60
+ severity = "medium";
61
+ }
62
+ return {
63
+ pluginId: "emailrep",
64
+ pluginName: "EmailRep.io",
65
+ found,
66
+ details: found
67
+ ? `Reputation: ${data.reputation} — ${findings.join(", ")}`
68
+ : `Reputation: ${data.reputation} — no exposure found`,
69
+ severity,
70
+ error: null,
71
+ metadata: {
72
+ reputation: data.reputation,
73
+ suspicious: data.suspicious,
74
+ references: data.references,
75
+ credentialsLeaked: data.details.credentials_leaked,
76
+ darkWebAppearance: data.details.dark_web_appearance,
77
+ dataBreach: data.details.data_breach,
78
+ profiles: data.details.profiles,
79
+ },
80
+ };
81
+ }
82
+ catch (err) {
83
+ const message = err instanceof Error ? err.message : String(err);
84
+ return {
85
+ pluginId: "emailrep",
86
+ pluginName: "EmailRep.io",
87
+ found: false,
88
+ details: `Network error: ${sanitizeForTerminal(message)}`,
89
+ severity: "info",
90
+ error: sanitizeForTerminal(message),
91
+ };
92
+ }
93
+ },
94
+ };
95
+ //# sourceMappingURL=emailrep-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"emailrep-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/emailrep-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const gitGuardianHslPlugin: CheckPlugin;
3
+ //# sourceMappingURL=gitguardian-hsl-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitguardian-hsl-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/gitguardian-hsl-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAYhD,eAAO,MAAM,oBAAoB,EAAE,WAkFlC,CAAC"}
@@ -0,0 +1,75 @@
1
+ import { sanitizeForTerminal } from "../../core/sanitize.js";
2
+ const GITGUARDIAN_BASE = "https://api.gitguardian.com/v1";
3
+ const USER_AGENT = "compromising-position/1.0.0";
4
+ export const gitGuardianHslPlugin = {
5
+ id: "gitguardian-hsl",
6
+ name: "GitGuardian HasMySecretLeaked",
7
+ inputKind: "secret",
8
+ requiresNetwork: true,
9
+ requiredConfigKeys: ["GITGUARDIAN_API_TOKEN"],
10
+ isFree: false,
11
+ privacySummary: "SHA-256 hash -> api.gitguardian.com (requires API token)",
12
+ async check(input, config) {
13
+ const secret = input;
14
+ const apiToken = config.pluginApiKeys["GITGUARDIAN_API_TOKEN"];
15
+ if (!apiToken) {
16
+ return {
17
+ pluginId: "gitguardian-hsl",
18
+ pluginName: "GitGuardian HasMySecretLeaked",
19
+ found: false,
20
+ details: "GitGuardian API token not configured",
21
+ severity: "info",
22
+ error: "Missing GITGUARDIAN_API_TOKEN",
23
+ };
24
+ }
25
+ // Only send the SHA-256 hash, not the actual secret
26
+ const hash = secret.sha256Hex();
27
+ try {
28
+ const response = await fetch(`${GITGUARDIAN_BASE}/secret/has_secret_leaked`, {
29
+ method: "POST",
30
+ headers: {
31
+ "Content-Type": "application/json",
32
+ Authorization: `Token ${apiToken}`,
33
+ "User-Agent": USER_AGENT,
34
+ },
35
+ body: JSON.stringify({ hash }),
36
+ });
37
+ if (!response.ok) {
38
+ const statusText = sanitizeForTerminal(response.statusText);
39
+ return {
40
+ pluginId: "gitguardian-hsl",
41
+ pluginName: "GitGuardian HasMySecretLeaked",
42
+ found: false,
43
+ details: `API error: ${response.status} ${statusText}`,
44
+ severity: "info",
45
+ error: `GitGuardian API returned ${response.status}: ${statusText}`,
46
+ };
47
+ }
48
+ const data = (await response.json());
49
+ const found = data.matches > 0;
50
+ return {
51
+ pluginId: "gitguardian-hsl",
52
+ pluginName: "GitGuardian HasMySecretLeaked",
53
+ found,
54
+ details: found
55
+ ? `Found in ${data.matches} public GitHub repo(s)`
56
+ : "Not found in public GitHub repos",
57
+ severity: found ? "critical" : "low",
58
+ error: null,
59
+ metadata: { matches: data.matches },
60
+ };
61
+ }
62
+ catch (err) {
63
+ const message = err instanceof Error ? err.message : String(err);
64
+ return {
65
+ pluginId: "gitguardian-hsl",
66
+ pluginName: "GitGuardian HasMySecretLeaked",
67
+ found: false,
68
+ details: `Network error: ${sanitizeForTerminal(message)}`,
69
+ severity: "info",
70
+ error: sanitizeForTerminal(message),
71
+ };
72
+ }
73
+ },
74
+ };
75
+ //# sourceMappingURL=gitguardian-hsl-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gitguardian-hsl-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/gitguardian-hsl-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const hibpEmailPlugin: CheckPlugin;
3
+ //# sourceMappingURL=hibp-email-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hibp-email-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/hibp-email-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAIhD,eAAO,MAAM,eAAe,EAAE,WAgF7B,CAAC"}
@@ -0,0 +1,73 @@
1
+ import { checkHibpEmail } from "../hibp-email.js";
2
+ export const hibpEmailPlugin = {
3
+ id: "hibp-email",
4
+ name: "HIBP Email Breach Check",
5
+ inputKind: "email",
6
+ requiresNetwork: true,
7
+ requiredConfigKeys: ["HIBP_API_KEY"],
8
+ isFree: false,
9
+ privacySummary: "Full email -> haveibeenpwned.com (requires paid API key)",
10
+ async check(input, config) {
11
+ const email = input;
12
+ const apiKey = config.pluginApiKeys["HIBP_API_KEY"] ?? config.hibpApiKey;
13
+ if (!apiKey) {
14
+ return {
15
+ pluginId: "hibp-email",
16
+ pluginName: "HIBP Email Breach Check",
17
+ found: false,
18
+ details: "HIBP API key not configured",
19
+ severity: "info",
20
+ error: "Missing HIBP_API_KEY",
21
+ };
22
+ }
23
+ const result = await checkHibpEmail(email, apiKey);
24
+ if (result.error) {
25
+ return {
26
+ pluginId: "hibp-email",
27
+ pluginName: "HIBP Email Breach Check",
28
+ found: false,
29
+ details: result.error,
30
+ severity: "info",
31
+ error: result.error,
32
+ };
33
+ }
34
+ const totalFindings = result.breaches.length +
35
+ result.stealerLogs.length +
36
+ result.pastes.length;
37
+ const found = totalFindings > 0;
38
+ const parts = [];
39
+ if (result.breaches.length > 0) {
40
+ parts.push(`${result.breaches.length} breach(es)`);
41
+ }
42
+ if (result.stealerLogs.length > 0) {
43
+ parts.push(`${result.stealerLogs.length} stealer log(s)`);
44
+ }
45
+ if (result.pastes.length > 0) {
46
+ parts.push(`${result.pastes.length} paste(s)`);
47
+ }
48
+ let severity = "low";
49
+ if (result.stealerLogs.length > 0 || result.breaches.length > 10) {
50
+ severity = "critical";
51
+ }
52
+ else if (result.breaches.length > 0) {
53
+ severity = "high";
54
+ }
55
+ else if (result.pastes.length > 0) {
56
+ severity = "medium";
57
+ }
58
+ return {
59
+ pluginId: "hibp-email",
60
+ pluginName: "HIBP Email Breach Check",
61
+ found,
62
+ details: found ? `Found in: ${parts.join(", ")}` : "No breaches found",
63
+ severity,
64
+ error: null,
65
+ metadata: {
66
+ breachCount: result.breaches.length,
67
+ stealerLogCount: result.stealerLogs.length,
68
+ pasteCount: result.pastes.length,
69
+ },
70
+ };
71
+ },
72
+ };
73
+ //# sourceMappingURL=hibp-email-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hibp-email-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/hibp-email-plugin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const hibpPasswordPlugin: CheckPlugin;
3
+ //# sourceMappingURL=hibp-password-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hibp-password-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/hibp-password-plugin.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,eAAO,MAAM,kBAAkB,EAAE,WA0ChC,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { checkHibpPassword } from "../hibp-password.js";
2
+ export const hibpPasswordPlugin = {
3
+ id: "hibp-password",
4
+ name: "HIBP Password Check",
5
+ inputKind: "secret",
6
+ requiresNetwork: true,
7
+ requiredConfigKeys: [],
8
+ isFree: true,
9
+ privacySummary: "SHA-1 prefix (5 hex chars) -> api.pwnedpasswords.com",
10
+ async check(input, _config) {
11
+ const secret = input;
12
+ const result = await checkHibpPassword(secret);
13
+ if (result.error) {
14
+ return {
15
+ pluginId: "hibp-password",
16
+ pluginName: "HIBP Password Check",
17
+ found: false,
18
+ details: result.error,
19
+ severity: "info",
20
+ error: result.error,
21
+ };
22
+ }
23
+ return {
24
+ pluginId: "hibp-password",
25
+ pluginName: "HIBP Password Check",
26
+ found: result.found,
27
+ details: result.found
28
+ ? `Found in ${result.occurrences.toLocaleString()} breach(es)`
29
+ : "Not found in breach data",
30
+ severity: result.found ? "critical" : "low",
31
+ error: null,
32
+ metadata: {
33
+ occurrences: result.occurrences,
34
+ hashPrefix: result.hashPrefix,
35
+ },
36
+ };
37
+ },
38
+ };
39
+ //# sourceMappingURL=hibp-password-plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hibp-password-plugin.js","sourceRoot":"","sources":["../../../src/checks/plugins/hibp-password-plugin.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,CAAC,MAAM,kBAAkB,GAAgB;IAC7C,EAAE,EAAE,eAAe;IACnB,IAAI,EAAE,qBAAqB;IAC3B,SAAS,EAAE,QAAQ;IACnB,eAAe,EAAE,IAAI;IACrB,kBAAkB,EAAE,EAAE;IACtB,MAAM,EAAE,IAAI;IACZ,cAAc,EAAE,sDAAsD;IAEtE,KAAK,CAAC,KAAK,CACT,KAA4B,EAC5B,OAAkB;QAElB,MAAM,MAAM,GAAG,KAAqB,CAAC;QACrC,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAE/C,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,OAAO;gBACL,QAAQ,EAAE,eAAe;gBACzB,UAAU,EAAE,qBAAqB;gBACjC,KAAK,EAAE,KAAK;gBACZ,OAAO,EAAE,MAAM,CAAC,KAAK;gBACrB,QAAQ,EAAE,MAAM;gBAChB,KAAK,EAAE,MAAM,CAAC,KAAK;aACpB,CAAC;QACJ,CAAC;QAED,OAAO;YACL,QAAQ,EAAE,eAAe;YACzB,UAAU,EAAE,qBAAqB;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,OAAO,EAAE,MAAM,CAAC,KAAK;gBACnB,CAAC,CAAC,YAAY,MAAM,CAAC,WAAW,CAAC,cAAc,EAAE,aAAa;gBAC9D,CAAC,CAAC,0BAA0B;YAC9B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK;YAC3C,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE;gBACR,WAAW,EAAE,MAAM,CAAC,WAAW;gBAC/B,UAAU,EAAE,MAAM,CAAC,UAAU;aAC9B;SACF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { CheckPlugin } from "../plugin.js";
2
+ export declare const intelXPlugin: CheckPlugin;
3
+ //# sourceMappingURL=intelx-plugin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"intelx-plugin.d.ts","sourceRoot":"","sources":["../../../src/checks/plugins/intelx-plugin.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAyBhD,eAAO,MAAM,YAAY,EAAE,WA8H1B,CAAC"}