whatileaked 0.1.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 (4) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +244 -0
  3. package/dist/cli.js +2698 -0
  4. package/package.json +56 -0
package/dist/cli.js ADDED
@@ -0,0 +1,2698 @@
1
+ #!/usr/bin/env node
2
+
3
+ // src/main.ts
4
+ import { homedir } from "os";
5
+
6
+ // src/commands.ts
7
+ var Command = {
8
+ home: "home",
9
+ scan: "scan",
10
+ wipe: "wipe"
11
+ };
12
+ function parseCommand(argv) {
13
+ const first = argv[0];
14
+ if (first === void 0) return Command.home;
15
+ if (first === Command.scan || first === Command.wipe) return first;
16
+ return null;
17
+ }
18
+
19
+ // src/errors.ts
20
+ var UnknownCommandError = class extends Error {
21
+ command;
22
+ constructor(command) {
23
+ super(`unknown command "${command}" \u2014 expected "scan" or "wipe"`);
24
+ this.name = "UnknownCommandError";
25
+ this.command = command;
26
+ }
27
+ };
28
+
29
+ // src/report/style.ts
30
+ var ESC = "\x1B[";
31
+ var RESET = `${ESC}0m`;
32
+ var enabled = process.stdout.isTTY === true && process.env.NO_COLOR === void 0;
33
+ var wrap = (code) => (text) => enabled ? `${ESC}${code}m${text}${RESET}` : text;
34
+ var bold = wrap("1");
35
+ var dim = wrap("2");
36
+ var red = wrap("31");
37
+ var yellow = wrap("33");
38
+ var green = wrap("32");
39
+ var cyan = wrap("36");
40
+
41
+ // src/report/home.ts
42
+ function home() {
43
+ return [
44
+ ` ${dim("Built by Selan \u2014")} ${cyan("selan.ai")} ${dim("\u2014 we redact these before they leave your machine.")}`,
45
+ "",
46
+ ` ${bold("whatileaked scan")} ${dim("find credentials in your local transcripts")}`,
47
+ ` ${bold("whatileaked wipe")} ${dim("replace them with a placeholder")} ${red("(rewrites files)")}`,
48
+ "",
49
+ ` ${green("No network.")} ${dim("No telemetry. Nothing is written unless you run wipe.")}`,
50
+ ` ${dim("Secrets are never printed \u2014 findings show a fingerprint, not the value.")}`
51
+ ];
52
+ }
53
+
54
+ // src/report/paths.ts
55
+ function shorten(file) {
56
+ const home2 = process.env.HOME;
57
+ return home2 !== void 0 && file.startsWith(home2) ? `~${file.slice(home2.length)}` : file;
58
+ }
59
+ function plural(count2, noun) {
60
+ return `${count2.toLocaleString("en-US")} ${noun}${count2 === 1 ? "" : "s"}`;
61
+ }
62
+
63
+ // src/report/progress.ts
64
+ var SPINNER = ["|", "/", "-", "\\"];
65
+ var CLEAR_LINE = `${String.fromCharCode(27)}[2K`;
66
+ var Progress = class {
67
+ #write;
68
+ #enabled;
69
+ #frame = 0;
70
+ constructor(write, enabled2) {
71
+ this.#write = write;
72
+ this.#enabled = enabled2;
73
+ }
74
+ advance(transcripts, project) {
75
+ if (!this.#enabled) return;
76
+ if (transcripts % 8 !== 0) return;
77
+ const spinner = SPINNER[this.#frame % SPINNER.length] ?? "|";
78
+ this.#frame++;
79
+ this.#write(`\r${CLEAR_LINE} ${spinner} reading ${transcripts} transcripts \u2014 ${clip(project)}`);
80
+ }
81
+ done() {
82
+ if (this.#enabled) this.#write(`\r${CLEAR_LINE}`);
83
+ }
84
+ };
85
+ function clip(project) {
86
+ return project.length > 40 ? `${project.slice(0, 39)}\u2026` : project;
87
+ }
88
+
89
+ // src/report/aggregate.ts
90
+ function aggregate(findings) {
91
+ const byRule = /* @__PURE__ */ new Map();
92
+ const totals = /* @__PURE__ */ new Map();
93
+ for (const finding of findings) {
94
+ totals.set(finding.rule, (totals.get(finding.rule) ?? 0) + 1);
95
+ const sites = byRule.get(finding.rule) ?? /* @__PURE__ */ new Map();
96
+ byRule.set(finding.rule, sites);
97
+ const key = `${finding.fingerprint}:${finding.project}`;
98
+ const site = sites.get(key);
99
+ if (site) {
100
+ site.occurrences++;
101
+ site.firstEntryIndex = Math.min(site.firstEntryIndex, finding.entryIndex);
102
+ continue;
103
+ }
104
+ sites.set(key, {
105
+ fingerprint: finding.fingerprint,
106
+ project: finding.project,
107
+ sessionId: finding.sessionId,
108
+ file: finding.file,
109
+ context: finding.context,
110
+ occurrences: 1,
111
+ firstEntryIndex: finding.entryIndex
112
+ });
113
+ }
114
+ return [...byRule.entries()].map(([rule, sites]) => ({
115
+ rule,
116
+ total: totals.get(rule) ?? 0,
117
+ distinct: new Set([...sites.values()].map((site) => site.fingerprint)).size,
118
+ sites: [...sites.values()].sort((a, b) => b.occurrences - a.occurrences)
119
+ })).sort((a, b) => b.total - a.total || a.rule.localeCompare(b.rule));
120
+ }
121
+
122
+ // src/report/disclosure.ts
123
+ var DISCLOSURE = [
124
+ "Built by Selan (selan.ai) \u2014 we make a proxy that redacts these before they leave",
125
+ "your machine. This tool sends nothing anywhere; read src/scan/scanner.ts."
126
+ ].join("\n");
127
+
128
+ // src/report/terminal-reporter.ts
129
+ var PROJECT_COLUMN = 22;
130
+ var FINGERPRINT_CHARS = 8;
131
+ var TerminalReporter = class {
132
+ #write;
133
+ constructor(write) {
134
+ this.#write = write;
135
+ }
136
+ report(findings, stats) {
137
+ const totals = aggregate(findings);
138
+ const secrets = totals.reduce((sum, total) => sum + total.distinct, 0);
139
+ this.#write(
140
+ dim(` scanned ${count(stats.transcripts)} transcripts \xB7 ${count(stats.entries)} messages`)
141
+ );
142
+ this.#write("");
143
+ if (totals.length === 0) {
144
+ this.#write(green("No credentials found."));
145
+ this.#write("");
146
+ this.#write(dim(DISCLOSURE));
147
+ return;
148
+ }
149
+ for (const total of totals) {
150
+ this.#write(`${red("*")} ${bold(total.rule)} ${dim(plural(total.distinct, "secret"))}`);
151
+ for (const site of total.sites) {
152
+ const times = site.occurrences === 1 ? "sent once" : `sent ${count(site.occurrences)} times`;
153
+ this.#write(
154
+ ` ${yellow(site.fingerprint.slice(0, FINGERPRINT_CHARS))} ${site.project.padEnd(PROJECT_COLUMN)} ${dim(times)}`
155
+ );
156
+ if (site.context !== "") this.#write(` ${dim(`${site.context}***`)}`);
157
+ this.#write(` ${dim(shorten(site.file))}`);
158
+ }
159
+ this.#write("");
160
+ }
161
+ this.#write(bold(red(`${plural(secrets, "credential")} sent to a model provider.`)));
162
+ if (stats.unscannable > 0) {
163
+ this.#write(
164
+ yellow(`${plural(stats.unscannable, "message")} could not be scanned and are not counted.`)
165
+ );
166
+ }
167
+ this.#write("");
168
+ this.#write(dim("The 8-character code is a fingerprint, never the secret: a truncated"));
169
+ this.#write(dim("SHA-256, so one credential shows the same code everywhere it leaked."));
170
+ this.#write(dim("Some findings will be test fixtures \u2014 open the file to tell."));
171
+ this.#write("");
172
+ this.#write(dim(DISCLOSURE));
173
+ }
174
+ };
175
+ function count(value) {
176
+ return value.toLocaleString("en-US");
177
+ }
178
+
179
+ // src/scan/keyword-index.ts
180
+ var WINDOW_CHARS = 512;
181
+ var KeywordIndex = class {
182
+ #alternation;
183
+ #byKeyword;
184
+ constructor(rules) {
185
+ const byKeyword = /* @__PURE__ */ new Map();
186
+ for (const rule of rules) {
187
+ for (const word of rule.keywords) {
188
+ const owners = byKeyword.get(word);
189
+ if (owners) owners.push(rule);
190
+ else byKeyword.set(word, [rule]);
191
+ }
192
+ }
193
+ this.#byKeyword = byKeyword;
194
+ this.#alternation = new RegExp(
195
+ `(?:${[...byKeyword.keys()].map(escapeLiteral).join("|")})`,
196
+ "gi"
197
+ );
198
+ }
199
+ windows(text) {
200
+ this.#alternation.lastIndex = 0;
201
+ const spans = /* @__PURE__ */ new Map();
202
+ for (const hit of text.matchAll(this.#alternation)) {
203
+ const at = hit.index;
204
+ const start = Math.max(0, at - WINDOW_CHARS);
205
+ const end = Math.min(text.length, at + hit[0].length + WINDOW_CHARS);
206
+ for (const rule of this.#byKeyword.get(hit[0].toLowerCase()) ?? []) {
207
+ const existing = spans.get(rule);
208
+ if (!existing) {
209
+ spans.set(rule, [{ start, end }]);
210
+ continue;
211
+ }
212
+ const last = existing[existing.length - 1];
213
+ if (last && start <= last.end) last.end = Math.max(last.end, end);
214
+ else existing.push({ start, end });
215
+ }
216
+ }
217
+ const windows = [];
218
+ for (const [rule, ranges] of spans) {
219
+ for (const range of ranges) windows.push({ rule, text: text.slice(range.start, range.end) });
220
+ }
221
+ return windows;
222
+ }
223
+ };
224
+ function escapeLiteral(value) {
225
+ return value.replace(/[.*+?^${}()|[\]-]/g, "\\$&");
226
+ }
227
+
228
+ // src/scan/entropy.ts
229
+ function shannonEntropy(value) {
230
+ if (value.length === 0) return 0;
231
+ const counts = /* @__PURE__ */ new Map();
232
+ for (const char of value) counts.set(char, (counts.get(char) ?? 0) + 1);
233
+ let bits = 0;
234
+ for (const count2 of counts.values()) {
235
+ const p = count2 / value.length;
236
+ bits -= p * Math.log2(p);
237
+ }
238
+ return bits;
239
+ }
240
+
241
+ // src/scan/case-fold.ts
242
+ function foldToJavaScript(pattern) {
243
+ const out = [];
244
+ const insensitive = [false];
245
+ const current = () => insensitive[insensitive.length - 1] ?? false;
246
+ for (let i = 0; i < pattern.length; ) {
247
+ const char = pattern[i];
248
+ if (char === "\\") {
249
+ const next = pattern[i + 1];
250
+ if (next === void 0) return null;
251
+ out.push(char, next);
252
+ i += 2;
253
+ continue;
254
+ }
255
+ if (char === "[") {
256
+ const end = classEnd(pattern, i);
257
+ if (end === null) return null;
258
+ const body = pattern.slice(i, end + 1);
259
+ out.push(current() ? foldClass(body) : body);
260
+ i = end + 1;
261
+ continue;
262
+ }
263
+ if (pattern.startsWith("(?i)", i)) {
264
+ insensitive[insensitive.length - 1] = true;
265
+ i += 4;
266
+ continue;
267
+ }
268
+ if (char === "(") {
269
+ const opened = openGroup(pattern, i, current());
270
+ if (opened === null) return null;
271
+ out.push(opened.text);
272
+ insensitive.push(opened.insensitive);
273
+ i += opened.consumed;
274
+ continue;
275
+ }
276
+ if (char === ")") {
277
+ if (insensitive.length === 1) return null;
278
+ insensitive.pop();
279
+ out.push(char);
280
+ i += 1;
281
+ continue;
282
+ }
283
+ out.push(current() ? foldLiteral(char ?? "") : char ?? "");
284
+ i += 1;
285
+ }
286
+ if (insensitive.length !== 1) return null;
287
+ try {
288
+ new RegExp(out.join(""), "g");
289
+ } catch {
290
+ return null;
291
+ }
292
+ return out.join("");
293
+ }
294
+ function openGroup(pattern, at, inherited) {
295
+ if (pattern.startsWith("(?i:", at)) {
296
+ return { text: "(?:", insensitive: true, consumed: 4 };
297
+ }
298
+ if (pattern.startsWith("(?-i:", at)) {
299
+ return { text: "(?:", insensitive: false, consumed: 5 };
300
+ }
301
+ if (pattern.startsWith("(?:", at)) {
302
+ return { text: "(?:", insensitive: inherited, consumed: 3 };
303
+ }
304
+ if (pattern.startsWith("(?P<", at)) {
305
+ const close = pattern.indexOf(">", at);
306
+ if (close === -1) return null;
307
+ const name = pattern.slice(at + 4, close);
308
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(name)) return null;
309
+ return { text: `(?<${name}>`, insensitive: inherited, consumed: close - at + 1 };
310
+ }
311
+ if (pattern.startsWith("(?<", at)) {
312
+ const close = pattern.indexOf(">", at);
313
+ if (close === -1) return null;
314
+ return { text: pattern.slice(at, close + 1), insensitive: inherited, consumed: close - at + 1 };
315
+ }
316
+ if (pattern.startsWith("(?", at)) return null;
317
+ return { text: "(", insensitive: inherited, consumed: 1 };
318
+ }
319
+ function classEnd(pattern, at) {
320
+ let i = at + 1;
321
+ if (pattern[i] === "^") i += 1;
322
+ if (pattern[i] === "]") i += 1;
323
+ for (; i < pattern.length; i++) {
324
+ if (pattern[i] === "\\") {
325
+ i += 1;
326
+ continue;
327
+ }
328
+ if (pattern[i] === "]") return i;
329
+ }
330
+ return null;
331
+ }
332
+ function foldClass(body) {
333
+ const inner = body.slice(1, -1);
334
+ const negated = inner.startsWith("^");
335
+ const items = negated ? inner.slice(1) : inner;
336
+ const additions = [];
337
+ for (let i = 0; i < items.length; i++) {
338
+ if (items[i] === "\\") {
339
+ i += 1;
340
+ continue;
341
+ }
342
+ const char = items[i];
343
+ const isRange = items[i + 1] === "-" && items[i + 2] !== void 0 && items[i + 2] !== "]";
344
+ if (isRange) {
345
+ const from = char ?? "";
346
+ const to = items[i + 2] ?? "";
347
+ if (isAlpha(from) && isAlpha(to)) additions.push(`${flip(from)}-${flip(to)}`);
348
+ i += 2;
349
+ continue;
350
+ }
351
+ if (isAlpha(char ?? "")) additions.push(flip(char ?? ""));
352
+ }
353
+ if (additions.length === 0) return body;
354
+ return `[${negated ? "^" : ""}${items}${additions.join("")}]`;
355
+ }
356
+ function foldLiteral(char) {
357
+ return isAlpha(char) ? `[${char}${flip(char)}]` : char;
358
+ }
359
+ function isAlpha(char) {
360
+ return /^[A-Za-z]$/.test(char);
361
+ }
362
+ function flip(char) {
363
+ return char === char.toLowerCase() ? char.toUpperCase() : char.toLowerCase();
364
+ }
365
+
366
+ // src/scan/errors.ts
367
+ var UntranslatableRuleError = class extends Error {
368
+ pattern;
369
+ constructor(pattern) {
370
+ super(`no JavaScript translation preserves what this pattern matches: ${pattern}`);
371
+ this.name = "UntranslatableRuleError";
372
+ this.pattern = pattern;
373
+ }
374
+ };
375
+
376
+ // src/scan/matcher.ts
377
+ function translateToJavaScript(pattern) {
378
+ const leading = pattern.startsWith("(?i)");
379
+ const body = leading ? pattern.slice(4) : pattern;
380
+ if (body.includes("(?i)") || body.includes("(?-i")) return null;
381
+ try {
382
+ return new RegExp(body, leading ? "gi" : "g");
383
+ } catch {
384
+ return null;
385
+ }
386
+ }
387
+ var JavaScriptMatcher = class {
388
+ #regex;
389
+ #group;
390
+ constructor(regex, group) {
391
+ this.#regex = regex;
392
+ this.#group = group;
393
+ }
394
+ candidatesIn(text) {
395
+ this.#regex.lastIndex = 0;
396
+ const candidates = [];
397
+ for (const match of text.matchAll(this.#regex)) {
398
+ const value = match[this.#group] ?? match[0];
399
+ if (value !== void 0) candidates.push(value);
400
+ }
401
+ return candidates;
402
+ }
403
+ matches(text) {
404
+ this.#regex.lastIndex = 0;
405
+ return this.#regex.test(text);
406
+ }
407
+ };
408
+ function matcherFor(pattern, group) {
409
+ const flagged = translateToJavaScript(pattern);
410
+ if (flagged !== null) return new JavaScriptMatcher(flagged, group);
411
+ const folded = foldToJavaScript(pattern);
412
+ if (folded !== null) return new JavaScriptMatcher(new RegExp(folded, "g"), group);
413
+ throw new UntranslatableRuleError(pattern);
414
+ }
415
+
416
+ // src/scan/rule.ts
417
+ var CompiledRule = class {
418
+ id;
419
+ keywords;
420
+ #source;
421
+ #compiled = null;
422
+ constructor(source) {
423
+ this.id = source.id;
424
+ this.keywords = source.keywords;
425
+ this.#source = source;
426
+ }
427
+ /** Every secret this rule finds in `text`, after its entropy threshold and
428
+ * its upstream allowlist have had their say. */
429
+ secretsIn(text) {
430
+ const { matcher, allowlist } = this.#compile();
431
+ const secrets = [];
432
+ for (const secret of matcher.candidatesIn(text)) {
433
+ if (this.#source.entropy > 0 && shannonEntropy(secret) < this.#source.entropy) continue;
434
+ if (allowlist.some((allowed) => allowed.matches(secret))) continue;
435
+ secrets.push(secret);
436
+ }
437
+ return secrets;
438
+ }
439
+ #compile() {
440
+ const existing = this.#compiled;
441
+ if (existing) return existing;
442
+ const compiled = {
443
+ matcher: matcherFor(this.#source.pattern, this.#source.group),
444
+ allowlist: this.#source.allowlist.map((entry) => matcherFor(entry, 0))
445
+ };
446
+ this.#compiled = compiled;
447
+ return compiled;
448
+ }
449
+ };
450
+ function compileRules(sources) {
451
+ return sources.map((source) => new CompiledRule(source));
452
+ }
453
+
454
+ // src/scan/fingerprint.ts
455
+ import { createHash } from "crypto";
456
+ function fingerprint(secret) {
457
+ return createHash("sha256").update(secret).digest("hex").slice(0, 12);
458
+ }
459
+
460
+ // src/scan/scanner.ts
461
+ var BASE64_RUN = /[A-Za-z0-9+/_-]{40,}={0,2}/g;
462
+ var CHUNK_CHARS = 16 * 1024;
463
+ var OVERLAP_CHARS = 1024;
464
+ var Scanner = class {
465
+ #index;
466
+ constructor(index) {
467
+ this.#index = index;
468
+ }
469
+ scan(text) {
470
+ const found = /* @__PURE__ */ new Map();
471
+ for (const chunk of chunks(text)) {
472
+ this.#collect(chunk, found);
473
+ BASE64_RUN.lastIndex = 0;
474
+ for (const run of chunk.matchAll(BASE64_RUN)) {
475
+ const decoded = decodeBase64(run[0]);
476
+ if (decoded !== null) this.#collect(decoded, found);
477
+ }
478
+ }
479
+ return [...found.values()];
480
+ }
481
+ /**
482
+ * The secret values themselves, mapped to the rule that found them.
483
+ *
484
+ * Every other path in this codebase is built so a secret cannot escape it.
485
+ * This one exists because redaction has to know what string to replace, and
486
+ * nothing else may call it: the result is held in memory long enough to
487
+ * rewrite a line and is never printed, logged, stored or returned to a
488
+ * reporter.
489
+ */
490
+ secretsOf(text) {
491
+ const secrets = /* @__PURE__ */ new Map();
492
+ for (const chunk of chunks(text)) {
493
+ for (const window of this.#index.windows(chunk)) {
494
+ for (const secret of window.rule.secretsIn(window.text)) {
495
+ secrets.set(secret, window.rule.id);
496
+ }
497
+ }
498
+ BASE64_RUN.lastIndex = 0;
499
+ for (const run of chunk.matchAll(BASE64_RUN)) {
500
+ const decoded = decodeBase64(run[0]);
501
+ if (decoded === null) continue;
502
+ for (const window of this.#index.windows(decoded)) {
503
+ const found = window.rule.secretsIn(window.text);
504
+ if (found.length > 0) secrets.set(run[0], window.rule.id);
505
+ }
506
+ }
507
+ }
508
+ return secrets;
509
+ }
510
+ #collect(text, found) {
511
+ for (const window of this.#index.windows(text)) {
512
+ const secrets = window.rule.secretsIn(window.text);
513
+ for (const secret of secrets) {
514
+ found.set(`${window.rule.id}:${secret}`, {
515
+ rule: window.rule.id,
516
+ fingerprint: fingerprint(secret),
517
+ context: contextBefore(window.text, secret, secrets)
518
+ });
519
+ }
520
+ }
521
+ }
522
+ };
523
+ function* chunks(text) {
524
+ if (text.length === 0) return;
525
+ for (let offset = 0; offset < text.length; offset += CHUNK_CHARS) {
526
+ yield text.slice(offset, Math.min(text.length, offset + CHUNK_CHARS + OVERLAP_CHARS));
527
+ }
528
+ }
529
+ var CONTEXT_CHARS = 52;
530
+ function contextBefore(text, secret, secrets) {
531
+ const at = text.indexOf(secret);
532
+ if (at === -1) return "";
533
+ let lead = text.slice(Math.max(0, at - CONTEXT_CHARS), at);
534
+ for (const other of secrets) lead = lead.split(other).join("***");
535
+ return lead.replace(/\s+/g, " ").trimStart();
536
+ }
537
+ function decodeBase64(run) {
538
+ const decoded = Buffer.from(run, "base64").toString("utf8");
539
+ return decoded.includes("\uFFFD") ? null : decoded;
540
+ }
541
+
542
+ // src/scan/secret-rules.ts
543
+ var SECRET_RULE_SOURCES = [
544
+ {
545
+ id: "1password-secret-key",
546
+ keywords: ["a3-"],
547
+ pattern: "\\bA3-[A-Z0-9]{6}-(?:(?:[A-Z0-9]{11})|(?:[A-Z0-9]{6}-[A-Z0-9]{5}))-[A-Z0-9]{5}-[A-Z0-9]{5}-[A-Z0-9]{5}\\b",
548
+ group: 0,
549
+ entropy: 3.8,
550
+ allowlist: []
551
+ },
552
+ {
553
+ id: "1password-service-account-token",
554
+ keywords: ["ops_"],
555
+ pattern: "ops_eyJ[a-zA-Z0-9+/]{250,}={0,3}",
556
+ group: 0,
557
+ entropy: 4,
558
+ allowlist: []
559
+ },
560
+ {
561
+ id: "adafruit-api-key",
562
+ keywords: ["adafruit"],
563
+ pattern: `(?i)[\\w.-]{0,50}?(?:adafruit)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9_-]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
564
+ group: 0,
565
+ entropy: 0,
566
+ allowlist: []
567
+ },
568
+ {
569
+ id: "adobe-client-id",
570
+ keywords: ["adobe"],
571
+ pattern: `(?i)[\\w.-]{0,50}?(?:adobe)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
572
+ group: 0,
573
+ entropy: 2,
574
+ allowlist: []
575
+ },
576
+ {
577
+ id: "adobe-client-secret",
578
+ keywords: ["p8e-"],
579
+ pattern: `\\b(p8e-(?i)[a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
580
+ group: 0,
581
+ entropy: 2,
582
+ allowlist: []
583
+ },
584
+ {
585
+ id: "age-secret-key",
586
+ keywords: ["age-secret-key-1"],
587
+ pattern: "AGE-SECRET-KEY-1[QPZRY9X8GF2TVDW0S3JN54KHCE6MUA7L]{58}",
588
+ group: 0,
589
+ entropy: 0,
590
+ allowlist: []
591
+ },
592
+ {
593
+ id: "airtable-api-key",
594
+ keywords: ["airtable"],
595
+ pattern: `(?i)[\\w.-]{0,50}?(?:airtable)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{17})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
596
+ group: 0,
597
+ entropy: 0,
598
+ allowlist: []
599
+ },
600
+ {
601
+ id: "airtable-personnal-access-token",
602
+ keywords: ["airtable"],
603
+ pattern: "\\b(pat[[:alnum:]]{14}\\.[a-f0-9]{64})\\b",
604
+ group: 0,
605
+ entropy: 0,
606
+ allowlist: []
607
+ },
608
+ {
609
+ id: "algolia-api-key",
610
+ keywords: ["algolia"],
611
+ pattern: `(?i)[\\w.-]{0,50}?(?:algolia)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
612
+ group: 0,
613
+ entropy: 0,
614
+ allowlist: []
615
+ },
616
+ {
617
+ id: "alibaba-access-key-id",
618
+ keywords: ["ltai"],
619
+ pattern: `\\b(LTAI(?i)[a-z0-9]{20})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
620
+ group: 0,
621
+ entropy: 2,
622
+ allowlist: []
623
+ },
624
+ {
625
+ id: "alibaba-secret-key",
626
+ keywords: ["alibaba"],
627
+ pattern: `(?i)[\\w.-]{0,50}?(?:alibaba)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{30})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
628
+ group: 0,
629
+ entropy: 2,
630
+ allowlist: []
631
+ },
632
+ {
633
+ id: "anthropic-admin-api-key",
634
+ keywords: ["sk-ant-admin01"],
635
+ pattern: `\\b(sk-ant-admin01-[a-zA-Z0-9_\\-]{93}AA)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
636
+ group: 0,
637
+ entropy: 0,
638
+ allowlist: []
639
+ },
640
+ {
641
+ id: "anthropic-api-key",
642
+ keywords: ["sk-ant-api03"],
643
+ pattern: `\\b(sk-ant-api03-[a-zA-Z0-9_\\-]{93}AA)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
644
+ group: 0,
645
+ entropy: 0,
646
+ allowlist: []
647
+ },
648
+ {
649
+ id: "artifactory-api-key",
650
+ keywords: ["akcp"],
651
+ pattern: "\\bAKCp[A-Za-z0-9]{69}\\b",
652
+ group: 0,
653
+ entropy: 4.5,
654
+ allowlist: []
655
+ },
656
+ {
657
+ id: "artifactory-reference-token",
658
+ keywords: ["cmvmd"],
659
+ pattern: "\\bcmVmd[A-Za-z0-9]{59}\\b",
660
+ group: 0,
661
+ entropy: 4.5,
662
+ allowlist: []
663
+ },
664
+ {
665
+ id: "asana-client-id",
666
+ keywords: ["asana"],
667
+ pattern: `(?i)[\\w.-]{0,50}?(?:asana)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
668
+ group: 0,
669
+ entropy: 0,
670
+ allowlist: []
671
+ },
672
+ {
673
+ id: "asana-client-secret",
674
+ keywords: ["asana"],
675
+ pattern: `(?i)[\\w.-]{0,50}?(?:asana)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
676
+ group: 0,
677
+ entropy: 0,
678
+ allowlist: []
679
+ },
680
+ {
681
+ id: "atlassian-api-token",
682
+ keywords: ["atlassian", "confluence", "jira", "atatt3"],
683
+ pattern: `(?i)[\\w.-]{0,50}?(?:(?-i:ATLASSIAN|[Aa]tlassian)|(?-i:CONFLUENCE|[Cc]onfluence)|(?-i:JIRA|[Jj]ira))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{20}[a-f0-9]{4})(?:[\\x60'"\\s;]|\\\\[nr]|$)|\\b(ATATT3[A-Za-z0-9_\\-=]{186})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
684
+ group: 0,
685
+ entropy: 3.5,
686
+ allowlist: []
687
+ },
688
+ {
689
+ id: "authress-service-client-access-key",
690
+ keywords: ["sc_", "ext_", "scauth_", "authress_"],
691
+ pattern: `\\b((?:sc|ext|scauth|authress)_(?i)[a-z0-9]{5,30}\\.[a-z0-9]{4,6}\\.(?-i:acc)[_-][a-z0-9-]{10,32}\\.[a-z0-9+/_=-]{30,120})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
692
+ group: 0,
693
+ entropy: 2,
694
+ allowlist: []
695
+ },
696
+ {
697
+ id: "aws-access-token",
698
+ keywords: ["a3t", "akia", "asia", "abia", "acca"],
699
+ pattern: "\\b((?:A3T[A-Z0-9]|AKIA|ASIA|ABIA|ACCA)[A-Z2-7]{16})\\b",
700
+ group: 0,
701
+ entropy: 3,
702
+ allowlist: [".+EXAMPLE$"]
703
+ },
704
+ {
705
+ id: "aws-amazon-bedrock-api-key-long-lived",
706
+ keywords: ["absk"],
707
+ pattern: `\\b(ABSK[A-Za-z0-9+/]{109,269}={0,2})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
708
+ group: 0,
709
+ entropy: 3,
710
+ allowlist: []
711
+ },
712
+ {
713
+ id: "aws-amazon-bedrock-api-key-short-lived",
714
+ keywords: ["bedrock-api-key-"],
715
+ pattern: "bedrock-api-key-YmVkcm9jay5hbWF6b25hd3MuY29t",
716
+ group: 0,
717
+ entropy: 3,
718
+ allowlist: []
719
+ },
720
+ {
721
+ id: "azure-ad-client-secret",
722
+ keywords: ["q~"],
723
+ pattern: `(?:^|[\\\\'"\\x60\\s>=:(,)])([a-zA-Z0-9_~.]{3}\\dQ~[a-zA-Z0-9_~.-]{31,34})(?:$|[\\\\'"\\x60\\s<),])`,
724
+ group: 0,
725
+ entropy: 3,
726
+ allowlist: []
727
+ },
728
+ {
729
+ id: "beamer-api-token",
730
+ keywords: ["beamer"],
731
+ pattern: `(?i)[\\w.-]{0,50}?(?:beamer)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(b_[a-z0-9=_\\-]{44})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
732
+ group: 0,
733
+ entropy: 0,
734
+ allowlist: []
735
+ },
736
+ {
737
+ id: "bitbucket-client-id",
738
+ keywords: ["bitbucket"],
739
+ pattern: `(?i)[\\w.-]{0,50}?(?:bitbucket)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
740
+ group: 0,
741
+ entropy: 0,
742
+ allowlist: []
743
+ },
744
+ {
745
+ id: "bitbucket-client-secret",
746
+ keywords: ["bitbucket"],
747
+ pattern: `(?i)[\\w.-]{0,50}?(?:bitbucket)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
748
+ group: 0,
749
+ entropy: 0,
750
+ allowlist: []
751
+ },
752
+ {
753
+ id: "bittrex-access-key",
754
+ keywords: ["bittrex"],
755
+ pattern: `(?i)[\\w.-]{0,50}?(?:bittrex)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
756
+ group: 0,
757
+ entropy: 0,
758
+ allowlist: []
759
+ },
760
+ {
761
+ id: "bittrex-secret-key",
762
+ keywords: ["bittrex"],
763
+ pattern: `(?i)[\\w.-]{0,50}?(?:bittrex)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
764
+ group: 0,
765
+ entropy: 0,
766
+ allowlist: []
767
+ },
768
+ {
769
+ id: "cisco-meraki-api-key",
770
+ keywords: ["meraki"],
771
+ pattern: `[\\w.-]{0,50}?(?i:[\\w.-]{0,50}?(?:(?-i:[Mm]eraki|MERAKI))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3})(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
772
+ group: 0,
773
+ entropy: 3,
774
+ allowlist: []
775
+ },
776
+ {
777
+ id: "clickhouse-cloud-api-secret-key",
778
+ keywords: ["4b1d"],
779
+ pattern: "\\b(4b1d[A-Za-z0-9]{38})\\b",
780
+ group: 0,
781
+ entropy: 3,
782
+ allowlist: []
783
+ },
784
+ {
785
+ id: "clojars-api-token",
786
+ keywords: ["clojars_"],
787
+ pattern: "(?i)CLOJARS_[a-z0-9]{60}",
788
+ group: 0,
789
+ entropy: 2,
790
+ allowlist: []
791
+ },
792
+ {
793
+ id: "cloudflare-api-key",
794
+ keywords: ["cloudflare"],
795
+ pattern: `(?i)[\\w.-]{0,50}?(?:cloudflare)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9_-]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
796
+ group: 0,
797
+ entropy: 2,
798
+ allowlist: []
799
+ },
800
+ {
801
+ id: "cloudflare-global-api-key",
802
+ keywords: ["cloudflare"],
803
+ pattern: `(?i)[\\w.-]{0,50}?(?:cloudflare)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{37})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
804
+ group: 0,
805
+ entropy: 2,
806
+ allowlist: []
807
+ },
808
+ {
809
+ id: "cloudflare-origin-ca-key",
810
+ keywords: ["cloudflare", "v1.0-"],
811
+ pattern: `\\b(v1\\.0-[a-f0-9]{24}-[a-f0-9]{146})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
812
+ group: 0,
813
+ entropy: 2,
814
+ allowlist: []
815
+ },
816
+ {
817
+ id: "codecov-access-token",
818
+ keywords: ["codecov"],
819
+ pattern: `(?i)[\\w.-]{0,50}?(?:codecov)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
820
+ group: 0,
821
+ entropy: 0,
822
+ allowlist: []
823
+ },
824
+ {
825
+ id: "cohere-api-token",
826
+ keywords: ["cohere", "co_api_key"],
827
+ pattern: `[\\w.-]{0,50}?(?i:[\\w.-]{0,50}?(?:cohere|CO_API_KEY)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3})(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-zA-Z0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
828
+ group: 0,
829
+ entropy: 4,
830
+ allowlist: []
831
+ },
832
+ {
833
+ id: "coinbase-access-token",
834
+ keywords: ["coinbase"],
835
+ pattern: `(?i)[\\w.-]{0,50}?(?:coinbase)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9_-]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
836
+ group: 0,
837
+ entropy: 0,
838
+ allowlist: []
839
+ },
840
+ {
841
+ id: "confluent-access-token",
842
+ keywords: ["confluent"],
843
+ pattern: `(?i)[\\w.-]{0,50}?(?:confluent)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
844
+ group: 0,
845
+ entropy: 0,
846
+ allowlist: []
847
+ },
848
+ {
849
+ id: "confluent-secret-key",
850
+ keywords: ["confluent"],
851
+ pattern: `(?i)[\\w.-]{0,50}?(?:confluent)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
852
+ group: 0,
853
+ entropy: 0,
854
+ allowlist: []
855
+ },
856
+ {
857
+ id: "contentful-delivery-api-token",
858
+ keywords: ["contentful"],
859
+ pattern: `(?i)[\\w.-]{0,50}?(?:contentful)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{43})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
860
+ group: 0,
861
+ entropy: 0,
862
+ allowlist: []
863
+ },
864
+ {
865
+ id: "curl-auth-header",
866
+ keywords: ["curl"],
867
+ pattern: `\\bcurl\\b(?:.*?|.*?(?:[\\r\\n]{1,2}.*?){1,5})[ \\t\\n\\r](?:-H|--header)(?:=|[ \\t]{0,5})(?:"(?i)(?:Authorization:[ \\t]{0,5}(?:Basic[ \\t]([a-z0-9+/]{8,}={0,3})|(?:Bearer|(?:Api-)?Token)[ \\t]([\\w=~@.+/-]{8,})|([\\w=~@.+/-]{8,}))|(?:(?:X-(?:[a-z]+-)?)?(?:Api-?)?(?:Key|Token)):[ \\t]{0,5}([\\w=~@.+/-]{8,}))"|'(?i)(?:Authorization:[ \\t]{0,5}(?:Basic[ \\t]([a-z0-9+/]{8,}={0,3})|(?:Bearer|(?:Api-)?Token)[ \\t]([\\w=~@.+/-]{8,})|([\\w=~@.+/-]{8,}))|(?:(?:X-(?:[a-z]+-)?)?(?:Api-?)?(?:Key|Token)):[ \\t]{0,5}([\\w=~@.+/-]{8,}))')(?:\\B|\\s|\\z)`,
868
+ group: 0,
869
+ entropy: 2.75,
870
+ allowlist: []
871
+ },
872
+ {
873
+ id: "curl-auth-user",
874
+ keywords: ["curl"],
875
+ pattern: `\\bcurl\\b(?:.*|.*(?:[\\r\\n]{1,2}.*){1,5})[ \\t\\n\\r](?:-u|--user)(?:=|[ \\t]{0,5})("(:[^"]{3,}|[^:"]{3,}:|[^:"]{3,}:[^"]{3,})"|'([^:']{3,}:[^']{3,})'|((?:"[^"]{3,}"|'[^']{3,}'|[\\w$@.-]+):(?:"[^"]{3,}"|'[^']{3,}'|[\\w\${}@.-]+)))(?:\\s|\\z)`,
876
+ group: 0,
877
+ entropy: 2,
878
+ allowlist: [
879
+ "[^:]+:(?:change(?:it|me)|pass(?:word)?|pwd|test|token|\\*+|x+)",
880
+ `['"]?<[^>]+>['"]?:['"]?<[^>]+>|<[^:]+:[^>]+>['"]?`,
881
+ "[^:]+:\\[[^]]+]",
882
+ `['"]?[^:]+['"]?:['"]?\\$(?:\\d|\\w+|\\{(?:\\d|\\w+)})['"]?`,
883
+ "\\$\\([^)]+\\):\\$\\([^)]+\\)",
884
+ `['"]?\\$?{{[^}]+}}['"]?:['"]?\\$?{{[^}]+}}['"]?`
885
+ ]
886
+ },
887
+ {
888
+ id: "databricks-api-token",
889
+ keywords: ["dapi"],
890
+ pattern: `\\b(dapi[a-f0-9]{32}(?:-\\d)?)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
891
+ group: 0,
892
+ entropy: 3,
893
+ allowlist: []
894
+ },
895
+ {
896
+ id: "datadog-access-token",
897
+ keywords: ["datadog"],
898
+ pattern: `(?i)[\\w.-]{0,50}?(?:datadog)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
899
+ group: 0,
900
+ entropy: 0,
901
+ allowlist: []
902
+ },
903
+ {
904
+ id: "defined-networking-api-token",
905
+ keywords: ["dnkey"],
906
+ pattern: `(?i)[\\w.-]{0,50}?(?:dnkey)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(dnkey-[a-z0-9=_\\-]{26}-[a-z0-9=_\\-]{52})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
907
+ group: 0,
908
+ entropy: 0,
909
+ allowlist: []
910
+ },
911
+ {
912
+ id: "digitalocean-access-token",
913
+ keywords: ["doo_v1_"],
914
+ pattern: `\\b(doo_v1_[a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
915
+ group: 0,
916
+ entropy: 3,
917
+ allowlist: []
918
+ },
919
+ {
920
+ id: "digitalocean-pat",
921
+ keywords: ["dop_v1_"],
922
+ pattern: `\\b(dop_v1_[a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
923
+ group: 0,
924
+ entropy: 3,
925
+ allowlist: []
926
+ },
927
+ {
928
+ id: "digitalocean-refresh-token",
929
+ keywords: ["dor_v1_"],
930
+ pattern: `(?i)\\b(dor_v1_[a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
931
+ group: 0,
932
+ entropy: 0,
933
+ allowlist: []
934
+ },
935
+ {
936
+ id: "discord-api-token",
937
+ keywords: ["discord"],
938
+ pattern: `(?i)[\\w.-]{0,50}?(?:discord)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
939
+ group: 0,
940
+ entropy: 0,
941
+ allowlist: []
942
+ },
943
+ {
944
+ id: "discord-client-id",
945
+ keywords: ["discord"],
946
+ pattern: `(?i)[\\w.-]{0,50}?(?:discord)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9]{18})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
947
+ group: 0,
948
+ entropy: 2,
949
+ allowlist: []
950
+ },
951
+ {
952
+ id: "discord-client-secret",
953
+ keywords: ["discord"],
954
+ pattern: `(?i)[\\w.-]{0,50}?(?:discord)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
955
+ group: 0,
956
+ entropy: 2,
957
+ allowlist: []
958
+ },
959
+ {
960
+ id: "doppler-api-token",
961
+ keywords: ["dp.pt."],
962
+ pattern: "dp\\.pt\\.(?i)[a-z0-9]{43}",
963
+ group: 0,
964
+ entropy: 2,
965
+ allowlist: []
966
+ },
967
+ {
968
+ id: "droneci-access-token",
969
+ keywords: ["droneci"],
970
+ pattern: `(?i)[\\w.-]{0,50}?(?:droneci)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
971
+ group: 0,
972
+ entropy: 0,
973
+ allowlist: []
974
+ },
975
+ {
976
+ id: "dropbox-api-token",
977
+ keywords: ["dropbox"],
978
+ pattern: `(?i)[\\w.-]{0,50}?(?:dropbox)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{15})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
979
+ group: 0,
980
+ entropy: 0,
981
+ allowlist: []
982
+ },
983
+ {
984
+ id: "dropbox-long-lived-api-token",
985
+ keywords: ["dropbox"],
986
+ pattern: `(?i)[\\w.-]{0,50}?(?:dropbox)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{11}(AAAAAAAAAA)[a-z0-9\\-_=]{43})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
987
+ group: 0,
988
+ entropy: 0,
989
+ allowlist: []
990
+ },
991
+ {
992
+ id: "dropbox-short-lived-api-token",
993
+ keywords: ["dropbox"],
994
+ pattern: `(?i)[\\w.-]{0,50}?(?:dropbox)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(sl\\.[a-z0-9\\-=_]{135})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
995
+ group: 0,
996
+ entropy: 0,
997
+ allowlist: []
998
+ },
999
+ {
1000
+ id: "duffel-api-token",
1001
+ keywords: ["duffel_"],
1002
+ pattern: "duffel_(?:test|live)_(?i)[a-z0-9_\\-=]{43}",
1003
+ group: 0,
1004
+ entropy: 2,
1005
+ allowlist: []
1006
+ },
1007
+ {
1008
+ id: "dynatrace-api-token",
1009
+ keywords: ["dt0c01."],
1010
+ pattern: "dt0c01\\.(?i)[a-z0-9]{24}\\.[a-z0-9]{64}",
1011
+ group: 0,
1012
+ entropy: 4,
1013
+ allowlist: []
1014
+ },
1015
+ {
1016
+ id: "easypost-api-token",
1017
+ keywords: ["ezak"],
1018
+ pattern: "\\bEZAK(?i)[a-z0-9]{54}\\b",
1019
+ group: 0,
1020
+ entropy: 2,
1021
+ allowlist: []
1022
+ },
1023
+ {
1024
+ id: "easypost-test-api-token",
1025
+ keywords: ["eztk"],
1026
+ pattern: "\\bEZTK(?i)[a-z0-9]{54}\\b",
1027
+ group: 0,
1028
+ entropy: 2,
1029
+ allowlist: []
1030
+ },
1031
+ {
1032
+ id: "etsy-access-token",
1033
+ keywords: ["etsy"],
1034
+ pattern: `(?i)[\\w.-]{0,50}?(?:(?-i:ETSY|[Ee]tsy))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{24})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1035
+ group: 0,
1036
+ entropy: 3,
1037
+ allowlist: []
1038
+ },
1039
+ {
1040
+ id: "facebook-access-token",
1041
+ keywords: ["facebook"],
1042
+ pattern: `(?i)\\b(\\d{15,16}(\\||%)[0-9a-z\\-_]{27,40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1043
+ group: 0,
1044
+ entropy: 3,
1045
+ allowlist: []
1046
+ },
1047
+ {
1048
+ id: "facebook-page-access-token",
1049
+ keywords: ["eaam", "eaac"],
1050
+ pattern: `\\b(EAA[MC](?i)[a-z0-9]{100,})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1051
+ group: 0,
1052
+ entropy: 4,
1053
+ allowlist: []
1054
+ },
1055
+ {
1056
+ id: "facebook-secret",
1057
+ keywords: ["facebook"],
1058
+ pattern: `(?i)[\\w.-]{0,50}?(?:facebook)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1059
+ group: 0,
1060
+ entropy: 3,
1061
+ allowlist: []
1062
+ },
1063
+ {
1064
+ id: "fastly-api-token",
1065
+ keywords: ["fastly"],
1066
+ pattern: `(?i)[\\w.-]{0,50}?(?:fastly)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1067
+ group: 0,
1068
+ entropy: 0,
1069
+ allowlist: []
1070
+ },
1071
+ {
1072
+ id: "finicity-api-token",
1073
+ keywords: ["finicity"],
1074
+ pattern: `(?i)[\\w.-]{0,50}?(?:finicity)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1075
+ group: 0,
1076
+ entropy: 0,
1077
+ allowlist: []
1078
+ },
1079
+ {
1080
+ id: "finicity-client-secret",
1081
+ keywords: ["finicity"],
1082
+ pattern: `(?i)[\\w.-]{0,50}?(?:finicity)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{20})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1083
+ group: 0,
1084
+ entropy: 0,
1085
+ allowlist: []
1086
+ },
1087
+ {
1088
+ id: "finnhub-access-token",
1089
+ keywords: ["finnhub"],
1090
+ pattern: `(?i)[\\w.-]{0,50}?(?:finnhub)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{20})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1091
+ group: 0,
1092
+ entropy: 0,
1093
+ allowlist: []
1094
+ },
1095
+ {
1096
+ id: "flickr-access-token",
1097
+ keywords: ["flickr"],
1098
+ pattern: `(?i)[\\w.-]{0,50}?(?:flickr)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1099
+ group: 0,
1100
+ entropy: 0,
1101
+ allowlist: []
1102
+ },
1103
+ {
1104
+ id: "flutterwave-encryption-key",
1105
+ keywords: ["flwseck_test"],
1106
+ pattern: "FLWSECK_TEST-(?i)[a-h0-9]{12}",
1107
+ group: 0,
1108
+ entropy: 2,
1109
+ allowlist: []
1110
+ },
1111
+ {
1112
+ id: "flutterwave-public-key",
1113
+ keywords: ["flwpubk_test"],
1114
+ pattern: "FLWPUBK_TEST-(?i)[a-h0-9]{32}-X",
1115
+ group: 0,
1116
+ entropy: 2,
1117
+ allowlist: []
1118
+ },
1119
+ {
1120
+ id: "flutterwave-secret-key",
1121
+ keywords: ["flwseck_test"],
1122
+ pattern: "FLWSECK_TEST-(?i)[a-h0-9]{32}-X",
1123
+ group: 0,
1124
+ entropy: 2,
1125
+ allowlist: []
1126
+ },
1127
+ {
1128
+ id: "flyio-access-token",
1129
+ keywords: ["fo1_", "fm1", "fm2_"],
1130
+ pattern: `\\b((?:fo1_[\\w-]{43}|fm1[ar]_[a-zA-Z0-9+\\/]{100,}={0,3}|fm2_[a-zA-Z0-9+\\/]{100,}={0,3}))(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1131
+ group: 0,
1132
+ entropy: 4,
1133
+ allowlist: []
1134
+ },
1135
+ {
1136
+ id: "frameio-api-token",
1137
+ keywords: ["fio-u-"],
1138
+ pattern: "fio-u-(?i)[a-z0-9\\-_=]{64}",
1139
+ group: 0,
1140
+ entropy: 0,
1141
+ allowlist: []
1142
+ },
1143
+ {
1144
+ id: "freemius-secret-key",
1145
+ keywords: ["secret_key"],
1146
+ pattern: `(?i)["']secret_key["']\\s*=>\\s*["'](sk_[\\S]{29})["']`,
1147
+ group: 0,
1148
+ entropy: 0,
1149
+ allowlist: []
1150
+ },
1151
+ {
1152
+ id: "freshbooks-access-token",
1153
+ keywords: ["freshbooks"],
1154
+ pattern: `(?i)[\\w.-]{0,50}?(?:freshbooks)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1155
+ group: 0,
1156
+ entropy: 0,
1157
+ allowlist: []
1158
+ },
1159
+ {
1160
+ id: "gcp-api-key",
1161
+ keywords: ["aiza"],
1162
+ pattern: `\\b(AIza[\\w-]{35})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1163
+ group: 0,
1164
+ entropy: 4,
1165
+ allowlist: [
1166
+ "AIzaSyabcdefghijklmnopqrstuvwxyz1234567",
1167
+ "AIzaSyAnLA7NfeLquW1tJFpx_eQCxoX-oo6YyIs",
1168
+ "AIzaSyCkEhVjf3pduRDt6d1yKOMitrUEke8agEM",
1169
+ "AIzaSyDMAScliyLx7F0NPDEJi1QmyCgHIAODrlU",
1170
+ "AIzaSyD3asb-2pEZVqMkmL6M9N6nHZRR_znhrh0",
1171
+ "AIzayDNSXIbFmlXbIE6mCzDLQAqITYefhixbX4A",
1172
+ "AIzaSyAdOS2zB6NCsk1pCdZ4-P6GBdi_UUPwX7c",
1173
+ "AIzaSyASWm6HmTMdYWpgMnjRBjxcQ9CKctWmLd4",
1174
+ "AIzaSyANUvH9H9BsUccjsu2pCmEkOPjjaXeDQgY",
1175
+ "AIzaSyA5_iVawFQ8ABuTZNUdcwERLJv_a_p4wtM",
1176
+ "AIzaSyA4UrcGxgwQFTfaI3no3t7Lt1sjmdnP5sQ",
1177
+ "AIzaSyDSb51JiIcB6OJpwwMicseKRhhrOq1cS7g",
1178
+ "AIzaSyBF2RrAIm4a0mO64EShQfqfd2AFnzAvvuU",
1179
+ "AIzaSyBcE-OOIbhjyR83gm4r2MFCu4MJmprNXsw",
1180
+ "AIzaSyB8qGxt4ec15vitgn44duC5ucxaOi4FmqE",
1181
+ "AIzaSyA8vmApnrHNFE0bApF4hoZ11srVL_n0nvY"
1182
+ ]
1183
+ },
1184
+ {
1185
+ id: "github-app-token",
1186
+ keywords: ["ghu_", "ghs_"],
1187
+ pattern: "(?:ghu|ghs)_[0-9a-zA-Z]{36}",
1188
+ group: 0,
1189
+ entropy: 3,
1190
+ allowlist: []
1191
+ },
1192
+ {
1193
+ id: "github-fine-grained-pat",
1194
+ keywords: ["github_pat_"],
1195
+ pattern: "github_pat_\\w{82}",
1196
+ group: 0,
1197
+ entropy: 3,
1198
+ allowlist: []
1199
+ },
1200
+ {
1201
+ id: "github-oauth",
1202
+ keywords: ["gho_"],
1203
+ pattern: "gho_[0-9a-zA-Z]{36}",
1204
+ group: 0,
1205
+ entropy: 3,
1206
+ allowlist: []
1207
+ },
1208
+ {
1209
+ id: "github-pat",
1210
+ keywords: ["ghp_"],
1211
+ pattern: "ghp_[0-9a-zA-Z]{36}",
1212
+ group: 0,
1213
+ entropy: 3,
1214
+ allowlist: []
1215
+ },
1216
+ {
1217
+ id: "github-refresh-token",
1218
+ keywords: ["ghr_"],
1219
+ pattern: "ghr_[0-9a-zA-Z]{36}",
1220
+ group: 0,
1221
+ entropy: 3,
1222
+ allowlist: []
1223
+ },
1224
+ {
1225
+ id: "gitlab-cicd-job-token",
1226
+ keywords: ["glcbt-"],
1227
+ pattern: "glcbt-[0-9a-zA-Z]{1,5}_[0-9a-zA-Z_-]{20}",
1228
+ group: 0,
1229
+ entropy: 3,
1230
+ allowlist: []
1231
+ },
1232
+ {
1233
+ id: "gitlab-deploy-token",
1234
+ keywords: ["gldt-"],
1235
+ pattern: "gldt-[0-9a-zA-Z_\\-]{20}",
1236
+ group: 0,
1237
+ entropy: 3,
1238
+ allowlist: []
1239
+ },
1240
+ {
1241
+ id: "gitlab-feature-flag-client-token",
1242
+ keywords: ["glffct-"],
1243
+ pattern: "glffct-[0-9a-zA-Z_\\-]{20}",
1244
+ group: 0,
1245
+ entropy: 3,
1246
+ allowlist: []
1247
+ },
1248
+ {
1249
+ id: "gitlab-feed-token",
1250
+ keywords: ["glft-"],
1251
+ pattern: "glft-[0-9a-zA-Z_\\-]{20}",
1252
+ group: 0,
1253
+ entropy: 3,
1254
+ allowlist: []
1255
+ },
1256
+ {
1257
+ id: "gitlab-incoming-mail-token",
1258
+ keywords: ["glimt-"],
1259
+ pattern: "glimt-[0-9a-zA-Z_\\-]{25}",
1260
+ group: 0,
1261
+ entropy: 3,
1262
+ allowlist: []
1263
+ },
1264
+ {
1265
+ id: "gitlab-kubernetes-agent-token",
1266
+ keywords: ["glagent-"],
1267
+ pattern: "glagent-[0-9a-zA-Z_\\-]{50}",
1268
+ group: 0,
1269
+ entropy: 3,
1270
+ allowlist: []
1271
+ },
1272
+ {
1273
+ id: "gitlab-oauth-app-secret",
1274
+ keywords: ["gloas-"],
1275
+ pattern: "gloas-[0-9a-zA-Z_\\-]{64}",
1276
+ group: 0,
1277
+ entropy: 3,
1278
+ allowlist: []
1279
+ },
1280
+ {
1281
+ id: "gitlab-pat",
1282
+ keywords: ["glpat-"],
1283
+ pattern: "glpat-[\\w-]{20}",
1284
+ group: 0,
1285
+ entropy: 3,
1286
+ allowlist: []
1287
+ },
1288
+ {
1289
+ id: "gitlab-pat-routable",
1290
+ keywords: ["glpat-"],
1291
+ pattern: "\\bglpat-[0-9a-zA-Z_-]{27,300}\\.[0-9a-z]{2}[0-9a-z]{7}\\b",
1292
+ group: 0,
1293
+ entropy: 4,
1294
+ allowlist: []
1295
+ },
1296
+ {
1297
+ id: "gitlab-ptt",
1298
+ keywords: ["glptt-"],
1299
+ pattern: "glptt-[0-9a-f]{40}",
1300
+ group: 0,
1301
+ entropy: 3,
1302
+ allowlist: []
1303
+ },
1304
+ {
1305
+ id: "gitlab-rrt",
1306
+ keywords: ["gr1348941"],
1307
+ pattern: "GR1348941[\\w-]{20}",
1308
+ group: 0,
1309
+ entropy: 3,
1310
+ allowlist: []
1311
+ },
1312
+ {
1313
+ id: "gitlab-runner-authentication-token",
1314
+ keywords: ["glrt-"],
1315
+ pattern: "glrt-[0-9a-zA-Z_\\-]{20}",
1316
+ group: 0,
1317
+ entropy: 3,
1318
+ allowlist: []
1319
+ },
1320
+ {
1321
+ id: "gitlab-runner-authentication-token-routable",
1322
+ keywords: ["glrt-"],
1323
+ pattern: "\\bglrt-t\\d_[0-9a-zA-Z_\\-]{27,300}\\.[0-9a-z]{2}[0-9a-z]{7}\\b",
1324
+ group: 0,
1325
+ entropy: 4,
1326
+ allowlist: []
1327
+ },
1328
+ {
1329
+ id: "gitlab-scim-token",
1330
+ keywords: ["glsoat-"],
1331
+ pattern: "glsoat-[0-9a-zA-Z_\\-]{20}",
1332
+ group: 0,
1333
+ entropy: 3,
1334
+ allowlist: []
1335
+ },
1336
+ {
1337
+ id: "gitlab-session-cookie",
1338
+ keywords: ["_gitlab_session="],
1339
+ pattern: "_gitlab_session=[0-9a-z]{32}",
1340
+ group: 0,
1341
+ entropy: 3,
1342
+ allowlist: []
1343
+ },
1344
+ {
1345
+ id: "gitter-access-token",
1346
+ keywords: ["gitter"],
1347
+ pattern: `(?i)[\\w.-]{0,50}?(?:gitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9_-]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1348
+ group: 0,
1349
+ entropy: 0,
1350
+ allowlist: []
1351
+ },
1352
+ {
1353
+ id: "gocardless-api-token",
1354
+ keywords: ["live_", "gocardless"],
1355
+ pattern: `(?i)[\\w.-]{0,50}?(?:gocardless)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(live_(?i)[a-z0-9\\-_=]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1356
+ group: 0,
1357
+ entropy: 0,
1358
+ allowlist: []
1359
+ },
1360
+ {
1361
+ id: "grafana-api-key",
1362
+ keywords: ["eyjrijoi"],
1363
+ pattern: `(?i)\\b(eyJrIjoi[A-Za-z0-9]{70,400}={0,3})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1364
+ group: 0,
1365
+ entropy: 3,
1366
+ allowlist: []
1367
+ },
1368
+ {
1369
+ id: "grafana-cloud-api-token",
1370
+ keywords: ["glc_"],
1371
+ pattern: `(?i)\\b(glc_[A-Za-z0-9+/]{32,400}={0,3})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1372
+ group: 0,
1373
+ entropy: 3,
1374
+ allowlist: []
1375
+ },
1376
+ {
1377
+ id: "grafana-service-account-token",
1378
+ keywords: ["glsa_"],
1379
+ pattern: `(?i)\\b(glsa_[A-Za-z0-9]{32}_[A-Fa-f0-9]{8})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1380
+ group: 0,
1381
+ entropy: 3,
1382
+ allowlist: []
1383
+ },
1384
+ {
1385
+ id: "harness-api-key",
1386
+ keywords: ["pat.", "sat."],
1387
+ pattern: "(?:pat|sat)\\.[a-zA-Z0-9_-]{22}\\.[a-zA-Z0-9]{24}\\.[a-zA-Z0-9]{20}",
1388
+ group: 0,
1389
+ entropy: 0,
1390
+ allowlist: []
1391
+ },
1392
+ {
1393
+ id: "hashicorp-tf-api-token",
1394
+ keywords: ["atlasv1"],
1395
+ pattern: "(?i)[a-z0-9]{14}\\.(?-i:atlasv1)\\.[a-z0-9\\-_=]{60,70}",
1396
+ group: 0,
1397
+ entropy: 3.5,
1398
+ allowlist: []
1399
+ },
1400
+ {
1401
+ id: "hashicorp-tf-password",
1402
+ keywords: ["administrator_login_password", "password"],
1403
+ pattern: `(?i)[\\w.-]{0,50}?(?:administrator_login_password|password)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}("[a-z0-9=_\\-]{8,20}")(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1404
+ group: 0,
1405
+ entropy: 2,
1406
+ allowlist: []
1407
+ },
1408
+ {
1409
+ id: "heroku-api-key",
1410
+ keywords: ["heroku"],
1411
+ pattern: `(?i)[\\w.-]{0,50}?(?:heroku)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1412
+ group: 0,
1413
+ entropy: 0,
1414
+ allowlist: []
1415
+ },
1416
+ {
1417
+ id: "heroku-api-key-v2",
1418
+ keywords: ["hrku-aa"],
1419
+ pattern: `\\b((HRKU-AA[0-9a-zA-Z_-]{58}))(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1420
+ group: 0,
1421
+ entropy: 4,
1422
+ allowlist: []
1423
+ },
1424
+ {
1425
+ id: "hubspot-api-key",
1426
+ keywords: ["hubspot"],
1427
+ pattern: `(?i)[\\w.-]{0,50}?(?:hubspot)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1428
+ group: 0,
1429
+ entropy: 0,
1430
+ allowlist: []
1431
+ },
1432
+ {
1433
+ id: "huggingface-access-token",
1434
+ keywords: ["hf_"],
1435
+ pattern: `\\b(hf_(?i:[a-z]{34}))(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1436
+ group: 0,
1437
+ entropy: 2,
1438
+ allowlist: []
1439
+ },
1440
+ {
1441
+ id: "huggingface-organization-api-token",
1442
+ keywords: ["api_org_"],
1443
+ pattern: `\\b(api_org_(?i:[a-z]{34}))(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1444
+ group: 0,
1445
+ entropy: 2,
1446
+ allowlist: []
1447
+ },
1448
+ {
1449
+ id: "infracost-api-token",
1450
+ keywords: ["ico-"],
1451
+ pattern: `\\b(ico-[a-zA-Z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1452
+ group: 0,
1453
+ entropy: 3,
1454
+ allowlist: []
1455
+ },
1456
+ {
1457
+ id: "intercom-api-key",
1458
+ keywords: ["intercom"],
1459
+ pattern: `(?i)[\\w.-]{0,50}?(?:intercom)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{60})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1460
+ group: 0,
1461
+ entropy: 0,
1462
+ allowlist: []
1463
+ },
1464
+ {
1465
+ id: "intra42-client-secret",
1466
+ keywords: ["intra", "s-s4t2ud-", "s-s4t2af-"],
1467
+ pattern: `\\b(s-s4t2(?:ud|af)-(?i)[abcdef0123456789]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1468
+ group: 0,
1469
+ entropy: 3,
1470
+ allowlist: []
1471
+ },
1472
+ {
1473
+ id: "jfrog-api-key",
1474
+ keywords: ["jfrog", "artifactory", "bintray", "xray"],
1475
+ pattern: `(?i)[\\w.-]{0,50}?(?:jfrog|artifactory|bintray|xray)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{73})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1476
+ group: 0,
1477
+ entropy: 0,
1478
+ allowlist: []
1479
+ },
1480
+ {
1481
+ id: "jfrog-identity-token",
1482
+ keywords: ["jfrog", "artifactory", "bintray", "xray"],
1483
+ pattern: `(?i)[\\w.-]{0,50}?(?:jfrog|artifactory|bintray|xray)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1484
+ group: 0,
1485
+ entropy: 0,
1486
+ allowlist: []
1487
+ },
1488
+ {
1489
+ id: "jwt",
1490
+ keywords: ["ey"],
1491
+ pattern: `\\b(ey[a-zA-Z0-9]{17,}\\.ey[a-zA-Z0-9\\/\\\\_-]{17,}\\.(?:[a-zA-Z0-9\\/\\\\_-]{10,}={0,2})?)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1492
+ group: 0,
1493
+ entropy: 3,
1494
+ allowlist: []
1495
+ },
1496
+ {
1497
+ id: "jwt-base64",
1498
+ keywords: ["zxlk"],
1499
+ pattern: "\\bZXlK(?:(?P<alg>aGJHY2lPaU)|(?P<apu>aGNIVWlPaU)|(?P<apv>aGNIWWlPaU)|(?P<aud>aGRXUWlPaU)|(?P<b64>aU5qUWlP)|(?P<crit>amNtbDBJanBi)|(?P<cty>amRIa2lPaU)|(?P<epk>bGNHc2lPbn)|(?P<enc>bGJtTWlPaU)|(?P<jku>cWEzVWlPaU)|(?P<jwk>cWQyc2lPb)|(?P<iss>cGMzTWlPaU)|(?P<iv>cGRpSTZJ)|(?P<kid>cmFXUWlP)|(?P<key_ops>clpYbGZiM0J6SWpwY)|(?P<kty>cmRIa2lPaUp)|(?P<nonce>dWIyNWpaU0k2)|(?P<p2c>d01tTWlP)|(?P<p2s>d01uTWlPaU)|(?P<ppt>d2NIUWlPaU)|(?P<sub>emRXSWlPaU)|(?P<svt>emRuUWlP)|(?P<tag>MFlXY2lPaU)|(?P<typ>MGVYQWlPaUp)|(?P<url>MWNtd2l)|(?P<use>MWMyVWlPaUp)|(?P<ver>MlpYSWlPaU)|(?P<version>MlpYSnphVzl1SWpv)|(?P<x>NElqb2)|(?P<x5c>NE5XTWlP)|(?P<x5t>NE5YUWlPaU)|(?P<x5ts256>NE5YUWpVekkxTmlJNkl)|(?P<x5u>NE5YVWlPaU)|(?P<zip>NmFYQWlPaU))[a-zA-Z0-9\\/\\\\_+\\-\\r\\n]{40,}={0,2}",
1500
+ group: 0,
1501
+ entropy: 2,
1502
+ allowlist: []
1503
+ },
1504
+ {
1505
+ id: "kraken-access-token",
1506
+ keywords: ["kraken"],
1507
+ pattern: `(?i)[\\w.-]{0,50}?(?:kraken)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9\\/=_\\+\\-]{80,90})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1508
+ group: 0,
1509
+ entropy: 0,
1510
+ allowlist: []
1511
+ },
1512
+ {
1513
+ id: "kucoin-access-token",
1514
+ keywords: ["kucoin"],
1515
+ pattern: `(?i)[\\w.-]{0,50}?(?:kucoin)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{24})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1516
+ group: 0,
1517
+ entropy: 0,
1518
+ allowlist: []
1519
+ },
1520
+ {
1521
+ id: "kucoin-secret-key",
1522
+ keywords: ["kucoin"],
1523
+ pattern: `(?i)[\\w.-]{0,50}?(?:kucoin)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1524
+ group: 0,
1525
+ entropy: 0,
1526
+ allowlist: []
1527
+ },
1528
+ {
1529
+ id: "launchdarkly-access-token",
1530
+ keywords: ["launchdarkly"],
1531
+ pattern: `(?i)[\\w.-]{0,50}?(?:launchdarkly)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1532
+ group: 0,
1533
+ entropy: 0,
1534
+ allowlist: []
1535
+ },
1536
+ {
1537
+ id: "linear-api-key",
1538
+ keywords: ["lin_api_"],
1539
+ pattern: "lin_api_(?i)[a-z0-9]{40}",
1540
+ group: 0,
1541
+ entropy: 2,
1542
+ allowlist: []
1543
+ },
1544
+ {
1545
+ id: "linear-client-secret",
1546
+ keywords: ["linear"],
1547
+ pattern: `(?i)[\\w.-]{0,50}?(?:linear)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1548
+ group: 0,
1549
+ entropy: 2,
1550
+ allowlist: []
1551
+ },
1552
+ {
1553
+ id: "linkedin-client-id",
1554
+ keywords: ["linkedin", "linked_in", "linked-in"],
1555
+ pattern: `(?i)[\\w.-]{0,50}?(?:linked[_-]?in)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{14})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1556
+ group: 0,
1557
+ entropy: 2,
1558
+ allowlist: []
1559
+ },
1560
+ {
1561
+ id: "linkedin-client-secret",
1562
+ keywords: ["linkedin", "linked_in", "linked-in"],
1563
+ pattern: `(?i)[\\w.-]{0,50}?(?:linked[_-]?in)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1564
+ group: 0,
1565
+ entropy: 2,
1566
+ allowlist: []
1567
+ },
1568
+ {
1569
+ id: "lob-api-key",
1570
+ keywords: ["test_", "live_"],
1571
+ pattern: `(?i)[\\w.-]{0,50}?(?:lob)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}((live|test)_[a-f0-9]{35})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1572
+ group: 0,
1573
+ entropy: 0,
1574
+ allowlist: []
1575
+ },
1576
+ {
1577
+ id: "lob-pub-api-key",
1578
+ keywords: ["test_pub", "live_pub", "_pub"],
1579
+ pattern: `(?i)[\\w.-]{0,50}?(?:lob)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}((test|live)_pub_[a-f0-9]{31})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1580
+ group: 0,
1581
+ entropy: 0,
1582
+ allowlist: []
1583
+ },
1584
+ {
1585
+ id: "looker-client-id",
1586
+ keywords: ["looker"],
1587
+ pattern: `(?i)[\\w.-]{0,50}?(?:looker)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{20})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1588
+ group: 0,
1589
+ entropy: 0,
1590
+ allowlist: []
1591
+ },
1592
+ {
1593
+ id: "looker-client-secret",
1594
+ keywords: ["looker"],
1595
+ pattern: `(?i)[\\w.-]{0,50}?(?:looker)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{24})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1596
+ group: 0,
1597
+ entropy: 0,
1598
+ allowlist: []
1599
+ },
1600
+ {
1601
+ id: "mailchimp-api-key",
1602
+ keywords: ["mailchimp"],
1603
+ pattern: `(?i)[\\w.-]{0,50}?(?:MailchimpSDK.initialize|mailchimp)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{32}-us\\d\\d)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1604
+ group: 0,
1605
+ entropy: 0,
1606
+ allowlist: []
1607
+ },
1608
+ {
1609
+ id: "mailgun-private-api-token",
1610
+ keywords: ["mailgun"],
1611
+ pattern: `(?i)[\\w.-]{0,50}?(?:mailgun)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(key-[a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1612
+ group: 0,
1613
+ entropy: 0,
1614
+ allowlist: []
1615
+ },
1616
+ {
1617
+ id: "mailgun-pub-key",
1618
+ keywords: ["mailgun"],
1619
+ pattern: `(?i)[\\w.-]{0,50}?(?:mailgun)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(pubkey-[a-f0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1620
+ group: 0,
1621
+ entropy: 0,
1622
+ allowlist: []
1623
+ },
1624
+ {
1625
+ id: "mailgun-signing-key",
1626
+ keywords: ["mailgun"],
1627
+ pattern: `(?i)[\\w.-]{0,50}?(?:mailgun)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-h0-9]{32}-[a-h0-9]{8}-[a-h0-9]{8})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1628
+ group: 0,
1629
+ entropy: 0,
1630
+ allowlist: []
1631
+ },
1632
+ {
1633
+ id: "mapbox-api-token",
1634
+ keywords: ["mapbox"],
1635
+ pattern: `(?i)[\\w.-]{0,50}?(?:mapbox)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(pk\\.[a-z0-9]{60}\\.[a-z0-9]{22})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1636
+ group: 0,
1637
+ entropy: 0,
1638
+ allowlist: []
1639
+ },
1640
+ {
1641
+ id: "mattermost-access-token",
1642
+ keywords: ["mattermost"],
1643
+ pattern: `(?i)[\\w.-]{0,50}?(?:mattermost)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{26})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1644
+ group: 0,
1645
+ entropy: 0,
1646
+ allowlist: []
1647
+ },
1648
+ {
1649
+ id: "maxmind-license-key",
1650
+ keywords: ["_mmk"],
1651
+ pattern: `\\b([A-Za-z0-9]{6}_[A-Za-z0-9]{29}_mmk)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1652
+ group: 0,
1653
+ entropy: 4,
1654
+ allowlist: []
1655
+ },
1656
+ {
1657
+ id: "messagebird-api-token",
1658
+ keywords: ["messagebird", "message-bird", "message_bird"],
1659
+ pattern: `(?i)[\\w.-]{0,50}?(?:message[_-]?bird)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{25})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1660
+ group: 0,
1661
+ entropy: 0,
1662
+ allowlist: []
1663
+ },
1664
+ {
1665
+ id: "messagebird-client-id",
1666
+ keywords: ["messagebird", "message-bird", "message_bird"],
1667
+ pattern: `(?i)[\\w.-]{0,50}?(?:message[_-]?bird)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1668
+ group: 0,
1669
+ entropy: 0,
1670
+ allowlist: []
1671
+ },
1672
+ {
1673
+ id: "microsoft-teams-webhook",
1674
+ keywords: ["webhook.office.com", "webhookb2", "incomingwebhook"],
1675
+ pattern: "https://[a-z0-9]+\\.webhook\\.office\\.com/webhookb2/[a-z0-9]{8}-([a-z0-9]{4}-){3}[a-z0-9]{12}@[a-z0-9]{8}-([a-z0-9]{4}-){3}[a-z0-9]{12}/IncomingWebhook/[a-z0-9]{32}/[a-z0-9]{8}-([a-z0-9]{4}-){3}[a-z0-9]{12}",
1676
+ group: 0,
1677
+ entropy: 0,
1678
+ allowlist: []
1679
+ },
1680
+ {
1681
+ id: "netlify-access-token",
1682
+ keywords: ["netlify"],
1683
+ pattern: `(?i)[\\w.-]{0,50}?(?:netlify)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{40,46})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1684
+ group: 0,
1685
+ entropy: 0,
1686
+ allowlist: []
1687
+ },
1688
+ {
1689
+ id: "new-relic-browser-api-token",
1690
+ keywords: ["nrjs-"],
1691
+ pattern: `(?i)[\\w.-]{0,50}?(?:new-relic|newrelic|new_relic)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(NRJS-[a-f0-9]{19})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1692
+ group: 0,
1693
+ entropy: 0,
1694
+ allowlist: []
1695
+ },
1696
+ {
1697
+ id: "new-relic-insert-key",
1698
+ keywords: ["nrii-"],
1699
+ pattern: `(?i)[\\w.-]{0,50}?(?:new-relic|newrelic|new_relic)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(NRII-[a-z0-9-]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1700
+ group: 0,
1701
+ entropy: 0,
1702
+ allowlist: []
1703
+ },
1704
+ {
1705
+ id: "new-relic-user-api-id",
1706
+ keywords: ["new-relic", "newrelic", "new_relic"],
1707
+ pattern: `(?i)[\\w.-]{0,50}?(?:new-relic|newrelic|new_relic)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1708
+ group: 0,
1709
+ entropy: 0,
1710
+ allowlist: []
1711
+ },
1712
+ {
1713
+ id: "new-relic-user-api-key",
1714
+ keywords: ["nrak"],
1715
+ pattern: `(?i)[\\w.-]{0,50}?(?:new-relic|newrelic|new_relic)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(NRAK-[a-z0-9]{27})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1716
+ group: 0,
1717
+ entropy: 0,
1718
+ allowlist: []
1719
+ },
1720
+ {
1721
+ id: "notion-api-token",
1722
+ keywords: ["ntn_"],
1723
+ pattern: `\\b(ntn_[0-9]{11}[A-Za-z0-9]{32}[A-Za-z0-9]{3})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1724
+ group: 0,
1725
+ entropy: 4,
1726
+ allowlist: []
1727
+ },
1728
+ {
1729
+ id: "npm-access-token",
1730
+ keywords: ["npm_"],
1731
+ pattern: `(?i)\\b(npm_[a-z0-9]{36})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1732
+ group: 0,
1733
+ entropy: 2,
1734
+ allowlist: []
1735
+ },
1736
+ {
1737
+ id: "nuget-config-password",
1738
+ keywords: ["<add key="],
1739
+ pattern: '(?i)<add key=\\"(?:(?:ClearText)?Password)\\"\\s*value=\\"(.{8,})\\"\\s*/>',
1740
+ group: 0,
1741
+ entropy: 1,
1742
+ allowlist: ["33f!!lloppa", "hal\\+9ooo_da!sY", "^\\%\\S.*\\%$"]
1743
+ },
1744
+ {
1745
+ id: "nytimes-access-token",
1746
+ keywords: ["nytimes", "new-york-times", "newyorktimes"],
1747
+ pattern: `(?i)[\\w.-]{0,50}?(?:nytimes|new-york-times,|newyorktimes)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9=_\\-]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1748
+ group: 0,
1749
+ entropy: 0,
1750
+ allowlist: []
1751
+ },
1752
+ {
1753
+ id: "octopus-deploy-api-key",
1754
+ keywords: ["api-"],
1755
+ pattern: `\\b(API-[A-Z0-9]{26})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1756
+ group: 0,
1757
+ entropy: 3,
1758
+ allowlist: []
1759
+ },
1760
+ {
1761
+ id: "okta-access-token",
1762
+ keywords: ["okta"],
1763
+ pattern: `[\\w.-]{0,50}?(?i:[\\w.-]{0,50}?(?:(?-i:[Oo]kta|OKTA))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3})(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(00[\\w=\\-]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1764
+ group: 0,
1765
+ entropy: 4,
1766
+ allowlist: []
1767
+ },
1768
+ {
1769
+ id: "openai-api-key",
1770
+ keywords: ["t3blbkfj"],
1771
+ pattern: `\\b(sk-(?:proj|svcacct|admin)-(?:[A-Za-z0-9_-]{74}|[A-Za-z0-9_-]{58})T3BlbkFJ(?:[A-Za-z0-9_-]{74}|[A-Za-z0-9_-]{58})\\b|sk-[a-zA-Z0-9]{20}T3BlbkFJ[a-zA-Z0-9]{20})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1772
+ group: 0,
1773
+ entropy: 3,
1774
+ allowlist: []
1775
+ },
1776
+ {
1777
+ id: "openshift-user-token",
1778
+ keywords: ["sha256~"],
1779
+ pattern: "\\b(sha256~[\\w-]{43})(?:[^\\w-]|\\z)",
1780
+ group: 0,
1781
+ entropy: 3.5,
1782
+ allowlist: []
1783
+ },
1784
+ {
1785
+ id: "perplexity-api-key",
1786
+ keywords: ["pplx-"],
1787
+ pattern: `\\b(pplx-[a-zA-Z0-9]{48})(?:[\\x60'"\\s;]|\\\\[nr]|$|\\b)`,
1788
+ group: 0,
1789
+ entropy: 4,
1790
+ allowlist: []
1791
+ },
1792
+ {
1793
+ id: "plaid-api-token",
1794
+ keywords: ["plaid"],
1795
+ pattern: `(?i)[\\w.-]{0,50}?(?:plaid)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(access-(?:sandbox|development|production)-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1796
+ group: 0,
1797
+ entropy: 0,
1798
+ allowlist: []
1799
+ },
1800
+ {
1801
+ id: "plaid-client-id",
1802
+ keywords: ["plaid"],
1803
+ pattern: `(?i)[\\w.-]{0,50}?(?:plaid)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{24})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1804
+ group: 0,
1805
+ entropy: 3.5,
1806
+ allowlist: []
1807
+ },
1808
+ {
1809
+ id: "plaid-secret-key",
1810
+ keywords: ["plaid"],
1811
+ pattern: `(?i)[\\w.-]{0,50}?(?:plaid)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{30})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1812
+ group: 0,
1813
+ entropy: 3.5,
1814
+ allowlist: []
1815
+ },
1816
+ {
1817
+ id: "planetscale-api-token",
1818
+ keywords: ["pscale_tkn_"],
1819
+ pattern: `\\b(pscale_tkn_(?i)[\\w=\\.-]{32,64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1820
+ group: 0,
1821
+ entropy: 3,
1822
+ allowlist: []
1823
+ },
1824
+ {
1825
+ id: "planetscale-oauth-token",
1826
+ keywords: ["pscale_oauth_"],
1827
+ pattern: `\\b(pscale_oauth_[\\w=\\.-]{32,64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1828
+ group: 0,
1829
+ entropy: 3,
1830
+ allowlist: []
1831
+ },
1832
+ {
1833
+ id: "planetscale-password",
1834
+ keywords: ["pscale_pw_"],
1835
+ pattern: `(?i)\\b(pscale_pw_(?i)[\\w=\\.-]{32,64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1836
+ group: 0,
1837
+ entropy: 3,
1838
+ allowlist: []
1839
+ },
1840
+ {
1841
+ id: "postman-api-token",
1842
+ keywords: ["pmak-"],
1843
+ pattern: `\\b(PMAK-(?i)[a-f0-9]{24}\\-[a-f0-9]{34})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1844
+ group: 0,
1845
+ entropy: 3,
1846
+ allowlist: []
1847
+ },
1848
+ {
1849
+ id: "prefect-api-token",
1850
+ keywords: ["pnu_"],
1851
+ pattern: `\\b(pnu_[a-zA-Z0-9]{36})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1852
+ group: 0,
1853
+ entropy: 2,
1854
+ allowlist: []
1855
+ },
1856
+ {
1857
+ id: "private-key",
1858
+ keywords: ["-----begin"],
1859
+ pattern: "(?i)-----BEGIN[ A-Z0-9_-]{0,100}PRIVATE KEY(?: BLOCK)?-----[\\s\\S-]{64,}?KEY(?: BLOCK)?-----",
1860
+ group: 0,
1861
+ entropy: 0,
1862
+ allowlist: []
1863
+ },
1864
+ {
1865
+ id: "privateai-api-token",
1866
+ keywords: ["privateai", "private_ai", "private-ai"],
1867
+ pattern: `[\\w.-]{0,50}?(?i:[\\w.-]{0,50}?(?:private[_-]?ai)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3})(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{32})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1868
+ group: 0,
1869
+ entropy: 3,
1870
+ allowlist: []
1871
+ },
1872
+ {
1873
+ id: "pulumi-api-token",
1874
+ keywords: ["pul-"],
1875
+ pattern: `\\b(pul-[a-f0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1876
+ group: 0,
1877
+ entropy: 2,
1878
+ allowlist: []
1879
+ },
1880
+ {
1881
+ id: "pypi-upload-token",
1882
+ keywords: ["pypi-ageichlwas5vcmc"],
1883
+ pattern: "pypi-AgEIcHlwaS5vcmc[\\w-]{50,1000}",
1884
+ group: 0,
1885
+ entropy: 3,
1886
+ allowlist: []
1887
+ },
1888
+ {
1889
+ id: "rapidapi-access-token",
1890
+ keywords: ["rapidapi"],
1891
+ pattern: `(?i)[\\w.-]{0,50}?(?:rapidapi)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9_-]{50})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1892
+ group: 0,
1893
+ entropy: 0,
1894
+ allowlist: []
1895
+ },
1896
+ {
1897
+ id: "readme-api-token",
1898
+ keywords: ["rdme_"],
1899
+ pattern: `\\b(rdme_[a-z0-9]{70})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1900
+ group: 0,
1901
+ entropy: 2,
1902
+ allowlist: []
1903
+ },
1904
+ {
1905
+ id: "rubygems-api-token",
1906
+ keywords: ["rubygems_"],
1907
+ pattern: `\\b(rubygems_[a-f0-9]{48})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1908
+ group: 0,
1909
+ entropy: 2,
1910
+ allowlist: []
1911
+ },
1912
+ {
1913
+ id: "scalingo-api-token",
1914
+ keywords: ["tk-us-"],
1915
+ pattern: `\\b(tk-us-[\\w-]{48})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1916
+ group: 0,
1917
+ entropy: 2,
1918
+ allowlist: []
1919
+ },
1920
+ {
1921
+ id: "sendbird-access-id",
1922
+ keywords: ["sendbird"],
1923
+ pattern: `(?i)[\\w.-]{0,50}?(?:sendbird)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1924
+ group: 0,
1925
+ entropy: 0,
1926
+ allowlist: []
1927
+ },
1928
+ {
1929
+ id: "sendbird-access-token",
1930
+ keywords: ["sendbird"],
1931
+ pattern: `(?i)[\\w.-]{0,50}?(?:sendbird)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1932
+ group: 0,
1933
+ entropy: 0,
1934
+ allowlist: []
1935
+ },
1936
+ {
1937
+ id: "sendgrid-api-token",
1938
+ keywords: ["sg."],
1939
+ pattern: `\\b(SG\\.(?i)[a-z0-9=_\\-\\.]{66})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1940
+ group: 0,
1941
+ entropy: 2,
1942
+ allowlist: []
1943
+ },
1944
+ {
1945
+ id: "sendinblue-api-token",
1946
+ keywords: ["xkeysib-"],
1947
+ pattern: `\\b(xkeysib-[a-f0-9]{64}\\-(?i)[a-z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1948
+ group: 0,
1949
+ entropy: 2,
1950
+ allowlist: []
1951
+ },
1952
+ {
1953
+ id: "sentry-access-token",
1954
+ keywords: ["sentry"],
1955
+ pattern: `(?i)[\\w.-]{0,50}?(?:sentry)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1956
+ group: 0,
1957
+ entropy: 3,
1958
+ allowlist: []
1959
+ },
1960
+ {
1961
+ id: "sentry-org-token",
1962
+ keywords: ["sntrys_eyjpyxqio"],
1963
+ pattern: "\\bsntrys_eyJpYXQiO[a-zA-Z0-9+/]{10,200}(?:LCJyZWdpb25fdXJs|InJlZ2lvbl91cmwi|cmVnaW9uX3VybCI6)[a-zA-Z0-9+/]{10,200}={0,2}_[a-zA-Z0-9+/]{43}(?:[^a-zA-Z0-9+/]|\\z)",
1964
+ group: 0,
1965
+ entropy: 4.5,
1966
+ allowlist: []
1967
+ },
1968
+ {
1969
+ id: "sentry-user-token",
1970
+ keywords: ["sntryu_"],
1971
+ pattern: `\\b(sntryu_[a-f0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1972
+ group: 0,
1973
+ entropy: 3.5,
1974
+ allowlist: []
1975
+ },
1976
+ {
1977
+ id: "settlemint-application-access-token",
1978
+ keywords: ["sm_aat"],
1979
+ pattern: `\\b(sm_aat_[a-zA-Z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1980
+ group: 0,
1981
+ entropy: 3,
1982
+ allowlist: []
1983
+ },
1984
+ {
1985
+ id: "settlemint-personal-access-token",
1986
+ keywords: ["sm_pat"],
1987
+ pattern: `\\b(sm_pat_[a-zA-Z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1988
+ group: 0,
1989
+ entropy: 3,
1990
+ allowlist: []
1991
+ },
1992
+ {
1993
+ id: "settlemint-service-access-token",
1994
+ keywords: ["sm_sat"],
1995
+ pattern: `\\b(sm_sat_[a-zA-Z0-9]{16})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
1996
+ group: 0,
1997
+ entropy: 3,
1998
+ allowlist: []
1999
+ },
2000
+ {
2001
+ id: "shippo-api-token",
2002
+ keywords: ["shippo_"],
2003
+ pattern: `\\b(shippo_(?:live|test)_[a-fA-F0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2004
+ group: 0,
2005
+ entropy: 2,
2006
+ allowlist: []
2007
+ },
2008
+ {
2009
+ id: "shopify-access-token",
2010
+ keywords: ["shpat_"],
2011
+ pattern: "shpat_[a-fA-F0-9]{32}",
2012
+ group: 0,
2013
+ entropy: 2,
2014
+ allowlist: []
2015
+ },
2016
+ {
2017
+ id: "shopify-custom-access-token",
2018
+ keywords: ["shpca_"],
2019
+ pattern: "shpca_[a-fA-F0-9]{32}",
2020
+ group: 0,
2021
+ entropy: 2,
2022
+ allowlist: []
2023
+ },
2024
+ {
2025
+ id: "shopify-private-app-access-token",
2026
+ keywords: ["shppa_"],
2027
+ pattern: "shppa_[a-fA-F0-9]{32}",
2028
+ group: 0,
2029
+ entropy: 2,
2030
+ allowlist: []
2031
+ },
2032
+ {
2033
+ id: "shopify-shared-secret",
2034
+ keywords: ["shpss_"],
2035
+ pattern: "shpss_[a-fA-F0-9]{32}",
2036
+ group: 0,
2037
+ entropy: 2,
2038
+ allowlist: []
2039
+ },
2040
+ {
2041
+ id: "sidekiq-secret",
2042
+ keywords: ["bundle_enterprise__contribsys__com", "bundle_gems__contribsys__com"],
2043
+ pattern: `(?i)[\\w.-]{0,50}?(?:BUNDLE_ENTERPRISE__CONTRIBSYS__COM|BUNDLE_GEMS__CONTRIBSYS__COM)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-f0-9]{8}:[a-f0-9]{8})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2044
+ group: 0,
2045
+ entropy: 0,
2046
+ allowlist: []
2047
+ },
2048
+ {
2049
+ id: "sidekiq-sensitive-url",
2050
+ keywords: ["gems.contribsys.com", "enterprise.contribsys.com"],
2051
+ pattern: "(?i)\\bhttps?://([a-f0-9]{8}:[a-f0-9]{8})@(?:gems.contribsys.com|enterprise.contribsys.com)(?:[\\/|\\#|\\?|:]|$)",
2052
+ group: 0,
2053
+ entropy: 0,
2054
+ allowlist: []
2055
+ },
2056
+ {
2057
+ id: "slack-app-token",
2058
+ keywords: ["xapp"],
2059
+ pattern: "(?i)xapp-\\d-[A-Z0-9]+-\\d+-[a-z0-9]+",
2060
+ group: 0,
2061
+ entropy: 2,
2062
+ allowlist: []
2063
+ },
2064
+ {
2065
+ id: "slack-bot-token",
2066
+ keywords: ["xoxb"],
2067
+ pattern: "xoxb-[0-9]{10,13}-[0-9]{10,13}[a-zA-Z0-9-]*",
2068
+ group: 0,
2069
+ entropy: 3,
2070
+ allowlist: []
2071
+ },
2072
+ {
2073
+ id: "slack-config-access-token",
2074
+ keywords: ["xoxe.xoxb-", "xoxe.xoxp-"],
2075
+ pattern: "(?i)xoxe.xox[bp]-\\d-[A-Z0-9]{163,166}",
2076
+ group: 0,
2077
+ entropy: 2,
2078
+ allowlist: []
2079
+ },
2080
+ {
2081
+ id: "slack-config-refresh-token",
2082
+ keywords: ["xoxe-"],
2083
+ pattern: "(?i)xoxe-\\d-[A-Z0-9]{146}",
2084
+ group: 0,
2085
+ entropy: 2,
2086
+ allowlist: []
2087
+ },
2088
+ {
2089
+ id: "slack-legacy-bot-token",
2090
+ keywords: ["xoxb"],
2091
+ pattern: "xoxb-[0-9]{8,14}-[a-zA-Z0-9]{18,26}",
2092
+ group: 0,
2093
+ entropy: 2,
2094
+ allowlist: []
2095
+ },
2096
+ {
2097
+ id: "slack-legacy-token",
2098
+ keywords: ["xoxo", "xoxs"],
2099
+ pattern: "xox[os]-\\d+-\\d+-\\d+-[a-fA-F\\d]+",
2100
+ group: 0,
2101
+ entropy: 2,
2102
+ allowlist: []
2103
+ },
2104
+ {
2105
+ id: "slack-legacy-workspace-token",
2106
+ keywords: ["xoxa", "xoxr"],
2107
+ pattern: "xox[ar]-(?:\\d-)?[0-9a-zA-Z]{8,48}",
2108
+ group: 0,
2109
+ entropy: 2,
2110
+ allowlist: []
2111
+ },
2112
+ {
2113
+ id: "slack-user-token",
2114
+ keywords: ["xoxp-", "xoxe-"],
2115
+ pattern: "xox[pe](?:-[0-9]{10,13}){3}-[a-zA-Z0-9-]{28,34}",
2116
+ group: 0,
2117
+ entropy: 2,
2118
+ allowlist: []
2119
+ },
2120
+ {
2121
+ id: "slack-webhook-url",
2122
+ keywords: ["hooks.slack.com"],
2123
+ pattern: "(?:https?://)?hooks.slack.com/(?:services|workflows|triggers)/[A-Za-z0-9+/]{43,56}",
2124
+ group: 0,
2125
+ entropy: 0,
2126
+ allowlist: []
2127
+ },
2128
+ {
2129
+ id: "snyk-api-token",
2130
+ keywords: ["snyk"],
2131
+ pattern: `(?i)[\\w.-]{0,50}?(?:snyk[_.-]?(?:(?:api|oauth)[_.-]?)?(?:key|token))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2132
+ group: 0,
2133
+ entropy: 0,
2134
+ allowlist: []
2135
+ },
2136
+ {
2137
+ id: "sonar-api-token",
2138
+ keywords: ["sonar"],
2139
+ pattern: `(?i)[\\w.-]{0,50}?(?:sonar[_.-]?(login|token))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}((?:squ_|sqp_|sqa_)?[a-z0-9=_\\-]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2140
+ group: 2,
2141
+ entropy: 0,
2142
+ allowlist: []
2143
+ },
2144
+ {
2145
+ id: "sourcegraph-access-token",
2146
+ keywords: ["sgp_", "sourcegraph"],
2147
+ pattern: `(?i)\\b(\\b(sgp_(?:[a-fA-F0-9]{16}|local)_[a-fA-F0-9]{40}|sgp_[a-fA-F0-9]{40}|[a-fA-F0-9]{40})\\b)(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2148
+ group: 0,
2149
+ entropy: 3,
2150
+ allowlist: []
2151
+ },
2152
+ {
2153
+ id: "square-access-token",
2154
+ keywords: ["sq0atp-", "eaaa"],
2155
+ pattern: `\\b((?:EAAA|sq0atp-)[\\w-]{22,60})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2156
+ group: 0,
2157
+ entropy: 2,
2158
+ allowlist: []
2159
+ },
2160
+ {
2161
+ id: "squarespace-access-token",
2162
+ keywords: ["squarespace"],
2163
+ pattern: `(?i)[\\w.-]{0,50}?(?:squarespace)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2164
+ group: 0,
2165
+ entropy: 0,
2166
+ allowlist: []
2167
+ },
2168
+ {
2169
+ id: "stripe-access-token",
2170
+ keywords: ["sk_test", "sk_live", "sk_prod", "rk_test", "rk_live", "rk_prod"],
2171
+ pattern: `\\b((?:sk|rk)_(?:test|live|prod)_[a-zA-Z0-9]{10,99})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2172
+ group: 0,
2173
+ entropy: 2,
2174
+ allowlist: []
2175
+ },
2176
+ {
2177
+ id: "sumologic-access-id",
2178
+ keywords: ["sumo"],
2179
+ pattern: `[\\w.-]{0,50}?(?i:[\\w.-]{0,50}?(?:(?-i:[Ss]umo|SUMO))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3})(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(su[a-zA-Z0-9]{12})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2180
+ group: 0,
2181
+ entropy: 3,
2182
+ allowlist: []
2183
+ },
2184
+ {
2185
+ id: "sumologic-access-token",
2186
+ keywords: ["sumo"],
2187
+ pattern: `(?i)[\\w.-]{0,50}?(?:(?-i:[Ss]umo|SUMO))(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{64})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2188
+ group: 0,
2189
+ entropy: 3,
2190
+ allowlist: []
2191
+ },
2192
+ {
2193
+ id: "telegram-bot-api-token",
2194
+ keywords: ["telegr"],
2195
+ pattern: `(?i)[\\w.-]{0,50}?(?:telegr)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9]{5,16}:(?-i:A)[a-z0-9_\\-]{34})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2196
+ group: 0,
2197
+ entropy: 0,
2198
+ allowlist: []
2199
+ },
2200
+ {
2201
+ id: "travisci-access-token",
2202
+ keywords: ["travis"],
2203
+ pattern: `(?i)[\\w.-]{0,50}?(?:travis)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{22})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2204
+ group: 0,
2205
+ entropy: 0,
2206
+ allowlist: []
2207
+ },
2208
+ {
2209
+ id: "twilio-api-key",
2210
+ keywords: ["sk"],
2211
+ pattern: "SK[0-9a-fA-F]{32}",
2212
+ group: 0,
2213
+ entropy: 3,
2214
+ allowlist: []
2215
+ },
2216
+ {
2217
+ id: "twitch-api-token",
2218
+ keywords: ["twitch"],
2219
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitch)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{30})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2220
+ group: 0,
2221
+ entropy: 0,
2222
+ allowlist: []
2223
+ },
2224
+ {
2225
+ id: "twitter-access-secret",
2226
+ keywords: ["twitter"],
2227
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{45})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2228
+ group: 0,
2229
+ entropy: 0,
2230
+ allowlist: []
2231
+ },
2232
+ {
2233
+ id: "twitter-access-token",
2234
+ keywords: ["twitter"],
2235
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([0-9]{15,25}-[a-zA-Z0-9]{20,40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2236
+ group: 0,
2237
+ entropy: 0,
2238
+ allowlist: []
2239
+ },
2240
+ {
2241
+ id: "twitter-api-key",
2242
+ keywords: ["twitter"],
2243
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{25})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2244
+ group: 0,
2245
+ entropy: 0,
2246
+ allowlist: []
2247
+ },
2248
+ {
2249
+ id: "twitter-api-secret",
2250
+ keywords: ["twitter"],
2251
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{50})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2252
+ group: 0,
2253
+ entropy: 0,
2254
+ allowlist: []
2255
+ },
2256
+ {
2257
+ id: "twitter-bearer-token",
2258
+ keywords: ["twitter"],
2259
+ pattern: `(?i)[\\w.-]{0,50}?(?:twitter)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(A{22}[a-zA-Z0-9%]{80,100})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2260
+ group: 0,
2261
+ entropy: 0,
2262
+ allowlist: []
2263
+ },
2264
+ {
2265
+ id: "typeform-api-token",
2266
+ keywords: ["tfp_"],
2267
+ pattern: `(?i)[\\w.-]{0,50}?(?:typeform)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(tfp_[a-z0-9\\-_\\.=]{59})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2268
+ group: 0,
2269
+ entropy: 0,
2270
+ allowlist: []
2271
+ },
2272
+ {
2273
+ id: "vault-batch-token",
2274
+ keywords: ["hvb."],
2275
+ pattern: `\\b(hvb\\.[\\w-]{138,300})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2276
+ group: 0,
2277
+ entropy: 4,
2278
+ allowlist: []
2279
+ },
2280
+ {
2281
+ id: "vault-service-token",
2282
+ keywords: ["hvs.", "s."],
2283
+ pattern: `\\b((?:hvs\\.[\\w-]{90,120}|s\\.(?i:[a-z0-9]{24})))(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2284
+ group: 0,
2285
+ entropy: 3.5,
2286
+ allowlist: ["s\\.[A-Za-z]{24}"]
2287
+ },
2288
+ {
2289
+ id: "yandex-access-token",
2290
+ keywords: ["yandex"],
2291
+ pattern: `(?i)[\\w.-]{0,50}?(?:yandex)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(t1\\.[A-Z0-9a-z_-]+[=]{0,2}\\.[A-Z0-9a-z_-]{86}[=]{0,2})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2292
+ group: 0,
2293
+ entropy: 0,
2294
+ allowlist: []
2295
+ },
2296
+ {
2297
+ id: "yandex-api-key",
2298
+ keywords: ["yandex"],
2299
+ pattern: `(?i)[\\w.-]{0,50}?(?:yandex)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(AQVN[A-Za-z0-9_\\-]{35,38})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2300
+ group: 0,
2301
+ entropy: 0,
2302
+ allowlist: []
2303
+ },
2304
+ {
2305
+ id: "yandex-aws-access-token",
2306
+ keywords: ["yandex"],
2307
+ pattern: `(?i)[\\w.-]{0,50}?(?:yandex)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}(YC[a-zA-Z0-9_\\-]{38})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2308
+ group: 0,
2309
+ entropy: 0,
2310
+ allowlist: []
2311
+ },
2312
+ {
2313
+ id: "zendesk-secret-key",
2314
+ keywords: ["zendesk"],
2315
+ pattern: `(?i)[\\w.-]{0,50}?(?:zendesk)(?:[ \\t\\w.-]{0,20})[\\s'"]{0,3}(?:=|>|:{1,3}=|\\|\\||:|=>|\\?=|,)[\\x60'"\\s=]{0,5}([a-z0-9]{40})(?:[\\x60'"\\s;]|\\\\[nr]|$)`,
2316
+ group: 0,
2317
+ entropy: 0,
2318
+ allowlist: []
2319
+ }
2320
+ ];
2321
+
2322
+ // src/transcript/reader.ts
2323
+ import { createReadStream } from "fs";
2324
+ import { createInterface } from "readline";
2325
+ var TranscriptReader = class {
2326
+ stats = { entries: 0, skipped: 0 };
2327
+ async *read(path) {
2328
+ const stream = createReadStream(path, "utf8");
2329
+ stream.on("error", () => {
2330
+ });
2331
+ const lines = createInterface({ input: stream, crlfDelay: Number.POSITIVE_INFINITY });
2332
+ let index = -1;
2333
+ try {
2334
+ for await (const line of lines) {
2335
+ index++;
2336
+ if (line.trim().length === 0) continue;
2337
+ let payload;
2338
+ try {
2339
+ payload = JSON.parse(line);
2340
+ } catch {
2341
+ this.stats.skipped++;
2342
+ continue;
2343
+ }
2344
+ this.stats.entries++;
2345
+ yield { index, payload, line };
2346
+ }
2347
+ } catch {
2348
+ return;
2349
+ }
2350
+ }
2351
+ };
2352
+
2353
+ // src/scan-run.ts
2354
+ var ScanRun = class {
2355
+ #sources;
2356
+ #scanner;
2357
+ #reporter;
2358
+ #progress;
2359
+ constructor(sources, scanner, reporter, progress) {
2360
+ this.#sources = sources;
2361
+ this.#scanner = scanner;
2362
+ this.#reporter = reporter;
2363
+ this.#progress = progress;
2364
+ }
2365
+ /** Returns the finding count so the CLI can pick an exit code without
2366
+ * re-deriving it from the reporter's output. */
2367
+ async run() {
2368
+ const findings = [];
2369
+ const stats = { transcripts: 0, entries: 0, skipped: 0, unscannable: 0 };
2370
+ for (const source of this.#sources) {
2371
+ for await (const file of source.discover()) {
2372
+ stats.transcripts++;
2373
+ this.#progress.advance(stats.transcripts, file.project);
2374
+ const reader = new TranscriptReader();
2375
+ for await (const entry of reader.read(file.path)) {
2376
+ let matches = [];
2377
+ try {
2378
+ matches = this.#scanner.scan(entry.line);
2379
+ } catch {
2380
+ stats.unscannable++;
2381
+ continue;
2382
+ }
2383
+ for (const match of matches) {
2384
+ findings.push({
2385
+ rule: match.rule,
2386
+ fingerprint: match.fingerprint,
2387
+ context: match.context,
2388
+ source: file.source,
2389
+ project: file.project,
2390
+ sessionId: file.sessionId,
2391
+ file: file.path,
2392
+ entryIndex: entry.index
2393
+ });
2394
+ }
2395
+ }
2396
+ stats.entries += reader.stats.entries;
2397
+ stats.skipped += reader.stats.skipped;
2398
+ }
2399
+ }
2400
+ this.#progress.done();
2401
+ this.#reporter.report(findings, stats);
2402
+ return findings.length;
2403
+ }
2404
+ };
2405
+
2406
+ // src/sources/claude-code-source.ts
2407
+ import { basename, join as join2 } from "path";
2408
+
2409
+ // src/sources/listing.ts
2410
+ import { readdir } from "fs/promises";
2411
+ import { join } from "path";
2412
+ async function listDirectories(root) {
2413
+ try {
2414
+ const entries = await readdir(root, { withFileTypes: true });
2415
+ return entries.filter((entry) => entry.isDirectory()).map((entry) => entry.name);
2416
+ } catch {
2417
+ return [];
2418
+ }
2419
+ }
2420
+ async function listJsonl(dir) {
2421
+ try {
2422
+ const entries = await readdir(dir, { withFileTypes: true });
2423
+ return entries.filter((entry) => entry.isFile() && entry.name.endsWith(".jsonl")).map((entry) => entry.name);
2424
+ } catch {
2425
+ return [];
2426
+ }
2427
+ }
2428
+ async function walkDirectories(root) {
2429
+ const found = [root];
2430
+ for (const name of await listDirectories(root)) {
2431
+ found.push(...await walkDirectories(join(root, name)));
2432
+ }
2433
+ return found;
2434
+ }
2435
+
2436
+ // src/transcript/entry.ts
2437
+ var SourceName = {
2438
+ "claude-code": "claude-code",
2439
+ codex: "codex"
2440
+ };
2441
+
2442
+ // src/transcript/shape.ts
2443
+ function isRecord(value) {
2444
+ return typeof value === "object" && value !== null && !Array.isArray(value);
2445
+ }
2446
+ function stringField(source, key) {
2447
+ if (!isRecord(source)) return null;
2448
+ const value = source[key];
2449
+ return typeof value === "string" ? value : null;
2450
+ }
2451
+ function objectField(source, key) {
2452
+ return isRecord(source) ? source[key] : null;
2453
+ }
2454
+
2455
+ // src/sources/claude-code-source.ts
2456
+ var ClaudeCodeSource = class {
2457
+ name = SourceName["claude-code"];
2458
+ #home;
2459
+ constructor(home2) {
2460
+ this.#home = home2;
2461
+ }
2462
+ async *discover() {
2463
+ const root = join2(this.#home, ".claude", "projects");
2464
+ for (const slug of await listDirectories(root)) {
2465
+ const dir = join2(root, slug);
2466
+ for (const file of await listJsonl(dir)) {
2467
+ const path = join2(dir, file);
2468
+ const meta = await firstMeta(path);
2469
+ yield {
2470
+ source: this.name,
2471
+ path,
2472
+ sessionId: meta === null ? basename(file, ".jsonl") : meta.sessionId,
2473
+ project: meta === null ? slug : basename(meta.cwd)
2474
+ };
2475
+ }
2476
+ }
2477
+ }
2478
+ };
2479
+ async function firstMeta(path) {
2480
+ const reader = new TranscriptReader();
2481
+ for await (const entry of reader.read(path)) {
2482
+ const sessionId = stringField(entry.payload, "sessionId");
2483
+ const cwd = stringField(entry.payload, "cwd");
2484
+ if (sessionId !== null && cwd !== null) return { sessionId, cwd };
2485
+ }
2486
+ return null;
2487
+ }
2488
+
2489
+ // src/sources/codex-source.ts
2490
+ import { basename as basename2, join as join3 } from "path";
2491
+ var CodexSource = class {
2492
+ name = SourceName.codex;
2493
+ #home;
2494
+ constructor(home2) {
2495
+ this.#home = home2;
2496
+ }
2497
+ async *discover() {
2498
+ const root = join3(this.#home, ".codex", "sessions");
2499
+ for (const dir of await walkDirectories(root)) {
2500
+ for (const file of await listJsonl(dir)) {
2501
+ const path = join3(dir, file);
2502
+ const meta = await firstMeta2(path);
2503
+ yield {
2504
+ source: this.name,
2505
+ path,
2506
+ sessionId: meta === null ? basename2(file, ".jsonl") : meta.id,
2507
+ project: meta === null ? basename2(dir) : basename2(meta.cwd)
2508
+ };
2509
+ }
2510
+ }
2511
+ }
2512
+ };
2513
+ async function firstMeta2(path) {
2514
+ const reader = new TranscriptReader();
2515
+ for await (const entry of reader.read(path)) {
2516
+ if (stringField(entry.payload, "type") !== "session_meta") continue;
2517
+ const payload = objectField(entry.payload, "payload");
2518
+ const id = stringField(payload, "id");
2519
+ const cwd = stringField(payload, "cwd");
2520
+ if (id !== null && cwd !== null) return { id, cwd };
2521
+ }
2522
+ return null;
2523
+ }
2524
+
2525
+ // src/wipe/confirm.ts
2526
+ import { createInterface as createInterface2 } from "readline/promises";
2527
+ var CONFIRMATION = "wipe";
2528
+ var TerminalPrompt = class {
2529
+ async ask(question) {
2530
+ if (process.stdin.isTTY !== true) return "";
2531
+ const readline = createInterface2({ input: process.stdin, output: process.stdout });
2532
+ try {
2533
+ return (await readline.question(question)).trim();
2534
+ } finally {
2535
+ readline.close();
2536
+ }
2537
+ }
2538
+ };
2539
+
2540
+ // src/wipe/wipe-run.ts
2541
+ import { readFile, rename, writeFile } from "fs/promises";
2542
+
2543
+ // src/wipe/redact.ts
2544
+ function placeholder(rule) {
2545
+ return `[REDACTED BY whatileaked: ${rule}]`;
2546
+ }
2547
+ function redactLine(line, secrets) {
2548
+ let redacted = line;
2549
+ for (const [secret, rule] of secrets) {
2550
+ redacted = redacted.split(secret).join(placeholder(rule));
2551
+ }
2552
+ return redacted;
2553
+ }
2554
+
2555
+ // src/wipe/wipe-run.ts
2556
+ var WipeRun = class {
2557
+ #sources;
2558
+ #scanner;
2559
+ #prompt;
2560
+ #write;
2561
+ constructor(sources, scanner, prompt, write) {
2562
+ this.#sources = sources;
2563
+ this.#scanner = scanner;
2564
+ this.#prompt = prompt;
2565
+ this.#write = write;
2566
+ }
2567
+ async run() {
2568
+ const plans = await this.#plan();
2569
+ if (plans.length === 0) {
2570
+ return { planned: [], filesRewritten: 0, secretsRedacted: 0, confirmed: false };
2571
+ }
2572
+ this.#preview(plans);
2573
+ const answer = await this.#prompt.ask(
2574
+ ` Type ${bold(red(CONFIRMATION))} to rewrite these files, or anything else to stop: `
2575
+ );
2576
+ if (answer !== CONFIRMATION) {
2577
+ return { planned: plans, filesRewritten: 0, secretsRedacted: 0, confirmed: false };
2578
+ }
2579
+ let filesRewritten = 0;
2580
+ let secretsRedacted = 0;
2581
+ for (const plan of plans) {
2582
+ secretsRedacted += await this.#rewrite(plan.file);
2583
+ filesRewritten++;
2584
+ }
2585
+ return { planned: plans, filesRewritten, secretsRedacted, confirmed: true };
2586
+ }
2587
+ async #plan() {
2588
+ const plans = [];
2589
+ for (const source of this.#sources) {
2590
+ for await (const file of source.discover()) {
2591
+ const reader = new TranscriptReader();
2592
+ let lines = 0;
2593
+ let secrets = 0;
2594
+ for await (const entry of reader.read(file.path)) {
2595
+ const found = this.#scanner.secretsOf(entry.line);
2596
+ if (found.size === 0) continue;
2597
+ lines++;
2598
+ secrets += found.size;
2599
+ }
2600
+ if (lines > 0) plans.push({ file: file.path, project: file.project, lines, secrets });
2601
+ }
2602
+ }
2603
+ return plans;
2604
+ }
2605
+ /** Rewrites through a temporary file and a rename, so an interrupted run
2606
+ * leaves the original intact rather than half a transcript. */
2607
+ async #rewrite(file) {
2608
+ const original = await readFile(file, "utf8");
2609
+ const lines = original.split("\n");
2610
+ let redacted = 0;
2611
+ const rewritten = lines.map((line) => {
2612
+ if (line.trim().length === 0) return line;
2613
+ const secrets = this.#scanner.secretsOf(line);
2614
+ if (secrets.size === 0) return line;
2615
+ redacted += secrets.size;
2616
+ return redactLine(line, secrets);
2617
+ });
2618
+ const temporary = `${file}.whatileaked-tmp`;
2619
+ await writeFile(temporary, rewritten.join("\n"), "utf8");
2620
+ await rename(temporary, file);
2621
+ return redacted;
2622
+ }
2623
+ #preview(plans) {
2624
+ const secrets = plans.reduce((sum, plan) => sum + plan.secrets, 0);
2625
+ const project = Math.max(...plans.map((plan) => plan.project.length));
2626
+ this.#write(dim(` ${plural(secrets, "secret")} across ${plural(plans.length, "file")}`));
2627
+ this.#write("");
2628
+ for (const plan of plans) {
2629
+ this.#write(
2630
+ ` ${yellow("*")} ${bold(plan.project.padEnd(project))} ${dim(`${plural(plan.secrets, "secret")} in ${plural(plan.lines, "message")}`)}`
2631
+ );
2632
+ this.#write(` ${dim(shorten(plan.file))}`);
2633
+ }
2634
+ this.#write("");
2635
+ this.#write(bold(red(` Every secret above will be replaced with a placeholder.`)));
2636
+ this.#write(red(" This rewrites the files and cannot be undone."));
2637
+ this.#write("");
2638
+ this.#write(dim(" It does not un-send anything \u2014 all of these already reached a model"));
2639
+ this.#write(dim(" provider. Rotate them whether or not you wipe."));
2640
+ this.#write("");
2641
+ }
2642
+ };
2643
+
2644
+ // src/main.ts
2645
+ async function main(argv) {
2646
+ const command = parseCommand(argv);
2647
+ if (command === null) throw new UnknownCommandError(argv[0] ?? "");
2648
+ const write = (line) => {
2649
+ process.stdout.write(`${line}
2650
+ `);
2651
+ };
2652
+ if (command === Command.home) {
2653
+ for (const line of home()) write(line);
2654
+ return 0;
2655
+ }
2656
+ const sources = [new ClaudeCodeSource(homedir()), new CodexSource(homedir())];
2657
+ const scanner = new Scanner(new KeywordIndex(compileRules(SECRET_RULE_SOURCES)));
2658
+ return command === Command.wipe ? await wipe(sources, scanner, write) : await scan(sources, scanner, write);
2659
+ }
2660
+ function colorful() {
2661
+ return process.stdout.isTTY === true && process.env.NO_COLOR === void 0;
2662
+ }
2663
+ async function scan(sources, scanner, write) {
2664
+ const progress = new Progress((text) => process.stderr.write(text), colorful());
2665
+ return await new ScanRun(sources, scanner, new TerminalReporter(write), progress).run();
2666
+ }
2667
+ async function wipe(sources, scanner, write) {
2668
+ write(dim(" replacing credentials in your local transcripts with a placeholder"));
2669
+ write("");
2670
+ const outcome = await new WipeRun(sources, scanner, new TerminalPrompt(), write).run();
2671
+ if (outcome.planned.length === 0) {
2672
+ write(green(" No credentials found. Nothing to wipe."));
2673
+ return 0;
2674
+ }
2675
+ if (!outcome.confirmed) {
2676
+ write("");
2677
+ write(yellow(" Not confirmed. Nothing was changed."));
2678
+ return 1;
2679
+ }
2680
+ write("");
2681
+ write(
2682
+ green(
2683
+ ` Replaced ${plural(outcome.secretsRedacted, "secret")} across ${plural(outcome.filesRewritten, "file")}.`
2684
+ )
2685
+ );
2686
+ write(bold(red(" Rotate every one of them \u2014 wiping your disk does not un-send them.")));
2687
+ return 0;
2688
+ }
2689
+
2690
+ // src/cli.ts
2691
+ try {
2692
+ const findings = await main(process.argv.slice(2));
2693
+ process.exit(findings > 0 ? 1 : 0);
2694
+ } catch (error) {
2695
+ process.stderr.write(`whatileaked: ${error instanceof Error ? error.message : String(error)}
2696
+ `);
2697
+ process.exit(2);
2698
+ }