@guardbee/guard-core 0.1.0 → 0.2.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.
- package/README.md +12 -4
- package/dist/cjs/index.d.ts +5 -3
- package/dist/cjs/index.d.ts.map +1 -1
- package/dist/cjs/index.js +7 -1
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/injection.d.ts +46 -1
- package/dist/cjs/injection.d.ts.map +1 -1
- package/dist/cjs/injection.js +322 -34
- package/dist/cjs/injection.js.map +1 -1
- package/dist/cjs/pii.d.ts.map +1 -1
- package/dist/cjs/pii.js +54 -11
- package/dist/cjs/pii.js.map +1 -1
- package/dist/cjs/secrets.d.ts +18 -0
- package/dist/cjs/secrets.d.ts.map +1 -0
- package/dist/cjs/secrets.js +278 -0
- package/dist/cjs/secrets.js.map +1 -0
- package/dist/cjs/validators.d.ts +8 -0
- package/dist/cjs/validators.d.ts.map +1 -1
- package/dist/cjs/validators.js +30 -0
- package/dist/cjs/validators.js.map +1 -1
- package/dist/index.d.ts +5 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/injection.d.ts +46 -1
- package/dist/injection.d.ts.map +1 -1
- package/dist/injection.js +320 -33
- package/dist/injection.js.map +1 -1
- package/dist/pii.d.ts.map +1 -1
- package/dist/pii.js +55 -12
- package/dist/pii.js.map +1 -1
- package/dist/secrets.d.ts +18 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +275 -0
- package/dist/secrets.js.map +1 -0
- package/dist/validators.d.ts +8 -0
- package/dist/validators.d.ts.map +1 -1
- package/dist/validators.js +28 -0
- package/dist/validators.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/pii.js
CHANGED
|
@@ -3,15 +3,64 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.PII_PATTERNS = void 0;
|
|
4
4
|
exports.maskPiiInText = maskPiiInText;
|
|
5
5
|
exports.maskPiiInValue = maskPiiInValue;
|
|
6
|
+
const secrets_js_1 = require("./secrets.js");
|
|
6
7
|
const validators_js_1 = require("./validators.js");
|
|
8
|
+
const REPLACEMENT_BY_SECRET = {
|
|
9
|
+
jwt: "[JWT-TOKEN]",
|
|
10
|
+
db_url_postgres: "[CONNECTION-STRING]",
|
|
11
|
+
db_url_mysql: "[CONNECTION-STRING]",
|
|
12
|
+
db_url_mongodb: "[CONNECTION-STRING]",
|
|
13
|
+
db_url_redis: "[CONNECTION-STRING]",
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Masking must cover the whole secret, where detection only needs a prefix:
|
|
17
|
+
* the scanner's Slack rule stops at the first `-`, which would leave the rest
|
|
18
|
+
* of `xoxb-<team>-<bot>-<secret>` in the output.
|
|
19
|
+
*/
|
|
20
|
+
const MASK_PATTERN_BY_SECRET = {
|
|
21
|
+
slack_token: /xox[baprs]-[0-9A-Za-z-]{10,}/g,
|
|
22
|
+
};
|
|
23
|
+
/** Provider formats from the secret scanner, minus the broad ones; each keeps its allowlist. */
|
|
24
|
+
const SECRET_PATTERNS = secrets_js_1.SECRET_RULES.filter((rule) => !rule.broad).map((rule) => ({
|
|
25
|
+
name: rule.id,
|
|
26
|
+
pattern: MASK_PATTERN_BY_SECRET[rule.id] ?? rule.pattern,
|
|
27
|
+
replacement: REPLACEMENT_BY_SECRET[rule.id] ?? "[API-KEY]",
|
|
28
|
+
...(rule.allowlist ? { validate: (match) => !rule.allowlist.some((allow) => allow.test(match)) } : {}),
|
|
29
|
+
}));
|
|
7
30
|
// Order matters: earlier patterns mask first, so later ones never see their digits.
|
|
31
|
+
// Secrets run first — a key or connection string holds digit runs that would
|
|
32
|
+
// otherwise be half-masked as a phone or card number.
|
|
8
33
|
exports.PII_PATTERNS = [
|
|
34
|
+
{
|
|
35
|
+
// The whole block, not just the BEGIN line the code scanner reports.
|
|
36
|
+
name: "private_key",
|
|
37
|
+
pattern: /-----BEGIN (?:[A-Z]+ )*PRIVATE KEY(?: BLOCK)?-----[\s\S]*?-----END (?:[A-Z]+ )*PRIVATE KEY(?: BLOCK)?-----/g,
|
|
38
|
+
replacement: "[PRIVATE-KEY]",
|
|
39
|
+
},
|
|
40
|
+
...SECRET_PATTERNS,
|
|
41
|
+
{
|
|
42
|
+
// Unknown providers: a key-like prefix, a separator, then a run with both letters and digits.
|
|
43
|
+
name: "api_key",
|
|
44
|
+
pattern: /\b(?:sk|pk|api|key|token|secret)[-_][A-Za-z0-9]{16,}\b/gi,
|
|
45
|
+
replacement: "[API-KEY]",
|
|
46
|
+
validate: (match) => {
|
|
47
|
+
const value = match.replace(/^[A-Za-z]+[-_]/, "");
|
|
48
|
+
return /[A-Za-z]/.test(value) && /\d/.test(value);
|
|
49
|
+
},
|
|
50
|
+
},
|
|
9
51
|
{
|
|
10
52
|
name: "tc_kimlik",
|
|
11
53
|
pattern: /\b[1-9]\d{10}\b/g,
|
|
12
54
|
replacement: "[TC-KİMLİK]",
|
|
13
55
|
validate: validators_js_1.isValidTcKimlik,
|
|
14
56
|
},
|
|
57
|
+
{
|
|
58
|
+
// A bare 10-digit number is too common to call a tax number; require the label.
|
|
59
|
+
name: "vkn",
|
|
60
|
+
pattern: /(?<=\b(?:VKN|V\.K\.N\.?|[Vv]ergi\s+(?:[Kk]imlik\s+)?[Nn](?:o|umaras[ıi])\.?)\s*[:#]?\s*)\d{10}(?!\d)/g,
|
|
61
|
+
replacement: "[VKN]",
|
|
62
|
+
validate: validators_js_1.isValidVkn,
|
|
63
|
+
},
|
|
15
64
|
{
|
|
16
65
|
name: "iban",
|
|
17
66
|
pattern: /\bTR\d{2}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{2}\b/gi,
|
|
@@ -31,18 +80,12 @@ exports.PII_PATTERNS = [
|
|
|
31
80
|
},
|
|
32
81
|
{
|
|
33
82
|
name: "phone_tr",
|
|
34
|
-
|
|
83
|
+
// Not glued to letters, `/` or `-` (ids in URLs), and either written with a
|
|
84
|
+
// +90 / 0 prefix or grouped with spaces/dashes: a bare 10-digit run is more
|
|
85
|
+
// often an id or an integer IP (2130706433) than a phone number.
|
|
86
|
+
pattern: /(?<![\w+/.#-])(?:(?:\+90|0090|0)[\s-]?)?\d{3}[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}(?![\w/-])/g,
|
|
35
87
|
replacement: "+90-***-***-**[TELEFON]",
|
|
36
|
-
|
|
37
|
-
{
|
|
38
|
-
name: "api_key",
|
|
39
|
-
pattern: /\b(?:sk|pk|api|key|token|secret)[-_]?[A-Za-z0-9]{16,}\b/gi,
|
|
40
|
-
replacement: "[API-KEY]",
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
name: "jwt",
|
|
44
|
-
pattern: /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
|
|
45
|
-
replacement: "[JWT-TOKEN]",
|
|
88
|
+
validate: (match) => (0, validators_js_1.isValidTrPhone)(match) && (/^(?:\+90|0)/.test(match) || /[\s-]/.test(match)),
|
|
46
89
|
},
|
|
47
90
|
];
|
|
48
91
|
function maskPiiInText(text, replace) {
|
package/dist/cjs/pii.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../src/pii.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"pii.js","sourceRoot":"","sources":["../../src/pii.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface SecretRule {
|
|
2
|
+
id: string;
|
|
3
|
+
name: string;
|
|
4
|
+
pattern: RegExp;
|
|
5
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
6
|
+
allowlist?: RegExp[];
|
|
7
|
+
skipPlaceholderCheck?: boolean;
|
|
8
|
+
lowerSeverityInTestFiles?: boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Format-agnostic or not actually secret (a keyword + any quoted string, any
|
|
11
|
+
* 40-character base64 run, a publishable key). Fine for a code scanner that
|
|
12
|
+
* shows the finding to a person; the runtime proxy does not mask on these,
|
|
13
|
+
* because a false match would also mark the session as holding sensitive data.
|
|
14
|
+
*/
|
|
15
|
+
broad?: boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare const SECRET_RULES: SecretRule[];
|
|
18
|
+
//# sourceMappingURL=secrets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.d.ts","sourceRoot":"","sources":["../../src/secrets.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAMrB,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAK/B,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC;;;;;OAKG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,eAAO,MAAM,YAAY,EAAE,UAAU,EA2RpC,CAAC"}
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SECRET_RULES = void 0;
|
|
4
|
+
exports.SECRET_RULES = [
|
|
5
|
+
// ── Cloud providers ────────────────────────────────────────────────────────
|
|
6
|
+
{
|
|
7
|
+
id: "aws_access_key",
|
|
8
|
+
name: "AWS Access Key ID",
|
|
9
|
+
pattern: /\b(AKIA|ABIA|ACCA|AIPA|AKIA|ANPA|ANVA|APKA)[0-9A-Z]{16}\b/g,
|
|
10
|
+
severity: "critical",
|
|
11
|
+
},
|
|
12
|
+
{
|
|
13
|
+
id: "aws_secret_key",
|
|
14
|
+
broad: true,
|
|
15
|
+
name: "AWS Secret Access Key",
|
|
16
|
+
pattern: /(?<![A-Za-z0-9/+])([A-Za-z0-9/+]{40})(?![A-Za-z0-9/+])/g,
|
|
17
|
+
severity: "critical",
|
|
18
|
+
allowlist: [/^[A-Za-z0-9+/]{40}={0,2}$/], // base64 payloads
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: "google_api_key",
|
|
22
|
+
name: "Google API Key",
|
|
23
|
+
pattern: /AIza[0-9A-Za-z\-_]{35}/g,
|
|
24
|
+
severity: "critical",
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
id: "google_oauth",
|
|
28
|
+
name: "Google OAuth Client Secret",
|
|
29
|
+
pattern: /GOCSPX-[0-9A-Za-z\-_]{28}/g,
|
|
30
|
+
severity: "critical",
|
|
31
|
+
},
|
|
32
|
+
// ── Version control & CI ───────────────────────────────────────────────────
|
|
33
|
+
{
|
|
34
|
+
id: "github_pat",
|
|
35
|
+
name: "GitHub Personal Access Token",
|
|
36
|
+
pattern: /ghp_[0-9A-Za-z]{36}/g,
|
|
37
|
+
severity: "critical",
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
id: "github_oauth",
|
|
41
|
+
name: "GitHub OAuth Token",
|
|
42
|
+
pattern: /gho_[0-9A-Za-z]{36}/g,
|
|
43
|
+
severity: "critical",
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
id: "github_app_token",
|
|
47
|
+
name: "GitHub App Token",
|
|
48
|
+
pattern: /ghs_[0-9A-Za-z]{36}/g,
|
|
49
|
+
severity: "critical",
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
id: "github_refresh_token",
|
|
53
|
+
name: "GitHub Refresh Token",
|
|
54
|
+
pattern: /ghr_[0-9A-Za-z]{36}/g,
|
|
55
|
+
severity: "high",
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
id: "gitlab_pat",
|
|
59
|
+
name: "GitLab Personal Access Token",
|
|
60
|
+
pattern: /glpat-[0-9A-Za-z\-_]{20}/g,
|
|
61
|
+
severity: "critical",
|
|
62
|
+
},
|
|
63
|
+
// ── Payment ────────────────────────────────────────────────────────────────
|
|
64
|
+
{
|
|
65
|
+
id: "stripe_secret",
|
|
66
|
+
name: "Stripe Secret Key (live)",
|
|
67
|
+
pattern: /sk_live_[0-9A-Za-z]{24,}/g,
|
|
68
|
+
severity: "critical",
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
id: "stripe_secret_test",
|
|
72
|
+
// Stripe'ın kendi dokümantasyonu test-mode key'lerini kod örneklerine
|
|
73
|
+
// gömmenin güvenli olduğunu belirtiyor — gerçek parasal etkisi yok,
|
|
74
|
+
// sadece sandbox hesabına erişim. Yine de görünürlük için raporlanıyor.
|
|
75
|
+
name: "Stripe Secret Key (test mode)",
|
|
76
|
+
pattern: /sk_test_[0-9A-Za-z]{24,}/g,
|
|
77
|
+
severity: "low",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
id: "stripe_publishable",
|
|
81
|
+
broad: true,
|
|
82
|
+
name: "Stripe Publishable Key",
|
|
83
|
+
pattern: /pk_(live|test)_[0-9A-Za-z]{24,}/g,
|
|
84
|
+
severity: "medium",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "stripe_restricted",
|
|
88
|
+
name: "Stripe Restricted Key (live)",
|
|
89
|
+
pattern: /rk_live_[0-9A-Za-z]{24,}/g,
|
|
90
|
+
severity: "critical",
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
id: "stripe_restricted_test",
|
|
94
|
+
name: "Stripe Restricted Key (test mode)",
|
|
95
|
+
pattern: /rk_test_[0-9A-Za-z]{24,}/g,
|
|
96
|
+
severity: "low",
|
|
97
|
+
},
|
|
98
|
+
// ── AI / ML ────────────────────────────────────────────────────────────────
|
|
99
|
+
{
|
|
100
|
+
id: "openai_key",
|
|
101
|
+
name: "OpenAI API Key",
|
|
102
|
+
pattern: /sk-[A-Za-z0-9]{20}T3BlbkFJ[A-Za-z0-9]{20}/g,
|
|
103
|
+
severity: "critical",
|
|
104
|
+
},
|
|
105
|
+
{
|
|
106
|
+
id: "openai_key_v2",
|
|
107
|
+
name: "OpenAI API Key (v2)",
|
|
108
|
+
pattern: /sk-proj-[A-Za-z0-9\-_]{50,}/g,
|
|
109
|
+
severity: "critical",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
id: "anthropic_key",
|
|
113
|
+
name: "Anthropic API Key",
|
|
114
|
+
pattern: /sk-ant-[A-Za-z0-9\-_]{32,}/g,
|
|
115
|
+
severity: "critical",
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
id: "huggingface_token",
|
|
119
|
+
name: "HuggingFace Token",
|
|
120
|
+
pattern: /hf_[A-Za-z0-9]{34}/g,
|
|
121
|
+
severity: "high",
|
|
122
|
+
},
|
|
123
|
+
// ── Communication ──────────────────────────────────────────────────────────
|
|
124
|
+
{
|
|
125
|
+
id: "slack_token",
|
|
126
|
+
name: "Slack Token",
|
|
127
|
+
pattern: /xox[baprs]-([0-9a-zA-Z]{10,48})/g,
|
|
128
|
+
severity: "critical",
|
|
129
|
+
},
|
|
130
|
+
{
|
|
131
|
+
id: "slack_webhook",
|
|
132
|
+
name: "Slack Webhook URL",
|
|
133
|
+
pattern: /https:\/\/hooks\.slack\.com\/services\/T[0-9A-Z]{8}\/B[0-9A-Z]{8}\/[0-9a-zA-Z]{24}/g,
|
|
134
|
+
severity: "high",
|
|
135
|
+
},
|
|
136
|
+
{
|
|
137
|
+
id: "twilio_account_sid",
|
|
138
|
+
broad: true,
|
|
139
|
+
name: "Twilio Account SID",
|
|
140
|
+
pattern: /AC[0-9a-f]{32}/g,
|
|
141
|
+
severity: "high",
|
|
142
|
+
},
|
|
143
|
+
{
|
|
144
|
+
id: "twilio_auth_token",
|
|
145
|
+
name: "Twilio Auth Token",
|
|
146
|
+
pattern: /[Tt][Ww][Ii][Ll][Ii][Oo].{0,20}[0-9a-f]{32}/g,
|
|
147
|
+
severity: "critical",
|
|
148
|
+
},
|
|
149
|
+
{
|
|
150
|
+
id: "sendgrid_key",
|
|
151
|
+
name: "SendGrid API Key",
|
|
152
|
+
pattern: /SG\.[0-9A-Za-z\-_]{22}\.[0-9A-Za-z\-_]{43}/g,
|
|
153
|
+
severity: "critical",
|
|
154
|
+
},
|
|
155
|
+
// ── Database URLs ──────────────────────────────────────────────────────────
|
|
156
|
+
{
|
|
157
|
+
id: "db_url_postgres",
|
|
158
|
+
name: "PostgreSQL Connection String with credentials",
|
|
159
|
+
pattern: /postgres(?:ql)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
|
|
160
|
+
severity: "critical",
|
|
161
|
+
allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[^<>]{1,80}>/],
|
|
162
|
+
skipPlaceholderCheck: true,
|
|
163
|
+
},
|
|
164
|
+
{
|
|
165
|
+
id: "db_url_mysql",
|
|
166
|
+
name: "MySQL Connection String with credentials",
|
|
167
|
+
pattern: /mysql:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
|
|
168
|
+
severity: "critical",
|
|
169
|
+
allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[^<>]{1,80}>/],
|
|
170
|
+
skipPlaceholderCheck: true,
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
id: "db_url_mongodb",
|
|
174
|
+
name: "MongoDB Connection String with credentials",
|
|
175
|
+
pattern: /mongodb(?:\+srv)?:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
|
|
176
|
+
severity: "critical",
|
|
177
|
+
allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[^<>]{1,80}>/],
|
|
178
|
+
skipPlaceholderCheck: true,
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
id: "db_url_redis",
|
|
182
|
+
name: "Redis Connection String with credentials",
|
|
183
|
+
pattern: /redis:\/\/[^:]+:[^@\s]+@[^\s"']+/gi,
|
|
184
|
+
severity: "high",
|
|
185
|
+
allowlist: [/localhost/, /127\.0\.0\.1/, /\$\{/, /<[^<>]{1,80}>/],
|
|
186
|
+
skipPlaceholderCheck: true,
|
|
187
|
+
},
|
|
188
|
+
// ── Private keys ───────────────────────────────────────────────────────────
|
|
189
|
+
{
|
|
190
|
+
id: "private_key_rsa",
|
|
191
|
+
name: "RSA Private Key",
|
|
192
|
+
pattern: /-----BEGIN RSA PRIVATE KEY-----/g,
|
|
193
|
+
severity: "critical",
|
|
194
|
+
},
|
|
195
|
+
{
|
|
196
|
+
id: "private_key_ec",
|
|
197
|
+
name: "EC Private Key",
|
|
198
|
+
pattern: /-----BEGIN EC PRIVATE KEY-----/g,
|
|
199
|
+
severity: "critical",
|
|
200
|
+
},
|
|
201
|
+
{
|
|
202
|
+
id: "private_key_openssh",
|
|
203
|
+
name: "OpenSSH Private Key",
|
|
204
|
+
pattern: /-----BEGIN OPENSSH PRIVATE KEY-----/g,
|
|
205
|
+
severity: "critical",
|
|
206
|
+
},
|
|
207
|
+
{
|
|
208
|
+
id: "private_key_generic",
|
|
209
|
+
name: "Generic Private Key",
|
|
210
|
+
pattern: /-----BEGIN PRIVATE KEY-----/g,
|
|
211
|
+
severity: "critical",
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
id: "pgp_private_key",
|
|
215
|
+
name: "PGP Private Key Block",
|
|
216
|
+
pattern: /-----BEGIN PGP PRIVATE KEY BLOCK-----/g,
|
|
217
|
+
severity: "critical",
|
|
218
|
+
},
|
|
219
|
+
// ── Auth tokens & JWTs ─────────────────────────────────────────────────────
|
|
220
|
+
{
|
|
221
|
+
id: "jwt",
|
|
222
|
+
name: "JSON Web Token",
|
|
223
|
+
pattern: /\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,
|
|
224
|
+
severity: "high",
|
|
225
|
+
},
|
|
226
|
+
{
|
|
227
|
+
id: "bearer_token",
|
|
228
|
+
broad: true,
|
|
229
|
+
name: "Bearer Token in code",
|
|
230
|
+
// Gerçek bearer token'lar (JWT, OAuth2 opak token) neredeyse hiç 20
|
|
231
|
+
// karakterin altına inmez — testlerdeki "Bearer alpha"/"Bearer test-token"
|
|
232
|
+
// gibi kısa sahte değerleri eleyip gürültüyü büyük ölçüde azaltıyor.
|
|
233
|
+
pattern: /['"](Bearer\s+[A-Za-z0-9\-._~+/]{20,}=*)['"]/gi,
|
|
234
|
+
severity: "high",
|
|
235
|
+
lowerSeverityInTestFiles: true,
|
|
236
|
+
},
|
|
237
|
+
// ── DevOps & infra ─────────────────────────────────────────────────────────
|
|
238
|
+
{
|
|
239
|
+
id: "npm_token",
|
|
240
|
+
name: "npm Access Token",
|
|
241
|
+
pattern: /npm_[A-Za-z0-9]{36}/g,
|
|
242
|
+
severity: "critical",
|
|
243
|
+
},
|
|
244
|
+
{
|
|
245
|
+
id: "docker_pat",
|
|
246
|
+
name: "Docker Hub Personal Access Token",
|
|
247
|
+
pattern: /dckr_pat_[A-Za-z0-9\-_]{27}/g,
|
|
248
|
+
severity: "high",
|
|
249
|
+
},
|
|
250
|
+
{
|
|
251
|
+
id: "vercel_token",
|
|
252
|
+
broad: true,
|
|
253
|
+
name: "Vercel API Token",
|
|
254
|
+
pattern: /vercel(?:[._-])?(?:token|api)['":\s=]+([A-Za-z0-9]{24})/gi,
|
|
255
|
+
severity: "high",
|
|
256
|
+
},
|
|
257
|
+
// ── Generic patterns ───────────────────────────────────────────────────────
|
|
258
|
+
{
|
|
259
|
+
id: "generic_secret_assignment",
|
|
260
|
+
broad: true,
|
|
261
|
+
name: "Hardcoded secret assignment",
|
|
262
|
+
pattern: /(?:password|passwd|secret|api[_-]?key|auth[_-]?token|access[_-]?token|private[_-]?key)\s*[:=]\s*['"][^'"]{8,}['"]/gi,
|
|
263
|
+
severity: "medium",
|
|
264
|
+
allowlist: [
|
|
265
|
+
/process\.env/,
|
|
266
|
+
/\$\{/,
|
|
267
|
+
/os\.environ/,
|
|
268
|
+
/getenv/,
|
|
269
|
+
/placeholder/i,
|
|
270
|
+
/example/i,
|
|
271
|
+
/your[-_]?/i,
|
|
272
|
+
/<[^<>]{1,80}>/,
|
|
273
|
+
/\*{3,}/,
|
|
274
|
+
],
|
|
275
|
+
lowerSeverityInTestFiles: true,
|
|
276
|
+
},
|
|
277
|
+
];
|
|
278
|
+
//# sourceMappingURL=secrets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets.js","sourceRoot":"","sources":["../../src/secrets.ts"],"names":[],"mappings":"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"}
|
package/dist/cjs/validators.d.ts
CHANGED
|
@@ -4,4 +4,12 @@ export declare function isValidTcKimlik(raw: string): boolean;
|
|
|
4
4
|
export declare function isValidLuhn(raw: string): boolean;
|
|
5
5
|
/** IBAN mod-97 checksum (ISO 7064 MOD97-10), computed in chunks to avoid precision loss. */
|
|
6
6
|
export declare function isValidIban(raw: string): boolean;
|
|
7
|
+
/** Turkish tax number (Vergi Kimlik No, 10 digits) — the Gelir İdaresi check-digit algorithm. */
|
|
8
|
+
export declare function isValidVkn(raw: string): boolean;
|
|
9
|
+
/**
|
|
10
|
+
* Turkish phone number: after an optional +90 / 0090 / 0 prefix, 10 digits
|
|
11
|
+
* starting with a mobile (5xx), landline (2xx–4xx) or 850 code. Any other
|
|
12
|
+
* 10-digit run (an order number) is not a phone number.
|
|
13
|
+
*/
|
|
14
|
+
export declare function isValidTrPhone(raw: string): boolean;
|
|
7
15
|
//# sourceMappingURL=validators.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAehD;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUhD"}
|
|
1
|
+
{"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"AAEA,qFAAqF;AACrF,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUpD;AAED,6CAA6C;AAC7C,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAehD;AAED,4FAA4F;AAC5F,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAUhD;AAED,iGAAiG;AACjG,wBAAgB,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAU/C;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAMnD"}
|
package/dist/cjs/validators.js
CHANGED
|
@@ -4,6 +4,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
4
4
|
exports.isValidTcKimlik = isValidTcKimlik;
|
|
5
5
|
exports.isValidLuhn = isValidLuhn;
|
|
6
6
|
exports.isValidIban = isValidIban;
|
|
7
|
+
exports.isValidVkn = isValidVkn;
|
|
8
|
+
exports.isValidTrPhone = isValidTrPhone;
|
|
7
9
|
/** Turkish national ID (TC Kimlik No) checksum — the standard 11-digit algorithm. */
|
|
8
10
|
function isValidTcKimlik(raw) {
|
|
9
11
|
const d = raw.replace(/\D/g, "");
|
|
@@ -49,4 +51,32 @@ function isValidIban(raw) {
|
|
|
49
51
|
}
|
|
50
52
|
return Number(remainder) === 1;
|
|
51
53
|
}
|
|
54
|
+
/** Turkish tax number (Vergi Kimlik No, 10 digits) — the Gelir İdaresi check-digit algorithm. */
|
|
55
|
+
function isValidVkn(raw) {
|
|
56
|
+
const d = raw.replace(/\D/g, "");
|
|
57
|
+
if (d.length !== 10)
|
|
58
|
+
return false;
|
|
59
|
+
const digits = d.split("").map(Number);
|
|
60
|
+
let sum = 0;
|
|
61
|
+
for (let i = 0; i < 9; i++) {
|
|
62
|
+
const tmp = (digits[i] + 10 - (i + 1)) % 10;
|
|
63
|
+
sum += tmp === 9 ? 9 : (tmp * 2 ** (10 - (i + 1))) % 9;
|
|
64
|
+
}
|
|
65
|
+
return (10 - (sum % 10)) % 10 === digits[9];
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Turkish phone number: after an optional +90 / 0090 / 0 prefix, 10 digits
|
|
69
|
+
* starting with a mobile (5xx), landline (2xx–4xx) or 850 code. Any other
|
|
70
|
+
* 10-digit run (an order number) is not a phone number.
|
|
71
|
+
*/
|
|
72
|
+
function isValidTrPhone(raw) {
|
|
73
|
+
let d = raw.replace(/\D/g, "");
|
|
74
|
+
if (d.startsWith("0090"))
|
|
75
|
+
d = d.slice(4);
|
|
76
|
+
else if (d.startsWith("90") && d.length === 12)
|
|
77
|
+
d = d.slice(2);
|
|
78
|
+
else if (d.startsWith("0") && d.length === 11)
|
|
79
|
+
d = d.slice(1);
|
|
80
|
+
return d.length === 10 && /^(?:5\d|[234][1-9]|850)/.test(d);
|
|
81
|
+
}
|
|
52
82
|
//# sourceMappingURL=validators.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":";AAAA,6EAA6E;;AAG7E,0CAUC;AAGD,kCAeC;AAGD,kCAUC;
|
|
1
|
+
{"version":3,"file":"validators.js","sourceRoot":"","sources":["../../src/validators.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
export { isValidTcKimlik, isValidLuhn, isValidIban } from "./validators.js";
|
|
1
|
+
export { isValidTcKimlik, isValidLuhn, isValidIban, isValidVkn, isValidTrPhone } from "./validators.js";
|
|
2
2
|
export { PII_PATTERNS, maskPiiInText, maskPiiInValue } from "./pii.js";
|
|
3
3
|
export type { PiiPattern, PiiReplacer } from "./pii.js";
|
|
4
|
-
export {
|
|
5
|
-
export type {
|
|
4
|
+
export { SECRET_RULES } from "./secrets.js";
|
|
5
|
+
export type { SecretRule } from "./secrets.js";
|
|
6
|
+
export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjection, scanToolResult, } from "./injection.js";
|
|
7
|
+
export type { ScanResult, InjectionRule, InjectionCategory, InjectionFinding } from "./injection.js";
|
|
6
8
|
export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
|
|
7
9
|
export type { Capability, FlowCategory, ToolRecord } from "./classify.js";
|
|
8
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,iBAAiB,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACrG,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACvE,YAAY,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
export { isValidTcKimlik, isValidLuhn, isValidIban } from "./validators.js";
|
|
1
|
+
export { isValidTcKimlik, isValidLuhn, isValidIban, isValidVkn, isValidTrPhone } from "./validators.js";
|
|
2
2
|
export { PII_PATTERNS, maskPiiInText, maskPiiInValue } from "./pii.js";
|
|
3
|
-
export {
|
|
3
|
+
export { SECRET_RULES } from "./secrets.js";
|
|
4
|
+
export { INJECTION_RULES, INJECTION_PATTERNS, findInjections, scanForPromptInjection, scanToolResult, } from "./injection.js";
|
|
4
5
|
export { CAPABILITY_RULES, classifyTool, textOf } from "./classify.js";
|
|
5
6
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACxG,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,OAAO,EACL,eAAe,EACf,kBAAkB,EAClB,cAAc,EACd,sBAAsB,EACtB,cAAc,GACf,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC"}
|
package/dist/injection.d.ts
CHANGED
|
@@ -7,8 +7,53 @@ export type ScanResult = {
|
|
|
7
7
|
action: "warn";
|
|
8
8
|
reason: string;
|
|
9
9
|
};
|
|
10
|
+
export type InjectionCategory = "instruction-override" | "role-spoofing" | "hidden-text" | "direct-address" | "exfiltration";
|
|
11
|
+
export interface InjectionRule {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
category: InjectionCategory;
|
|
15
|
+
/** Always global (`g`): callers iterate matches. */
|
|
16
|
+
pattern: RegExp;
|
|
17
|
+
severity: "critical" | "high" | "medium" | "low";
|
|
18
|
+
/** Why it is risky and what to do — shown with a finding. */
|
|
19
|
+
recommendation: string;
|
|
20
|
+
/**
|
|
21
|
+
* A generic phrase that also shows up in ordinary text ("act as", "developer
|
|
22
|
+
* mode"). Never blocks a call, only warns; the static scanner skips it.
|
|
23
|
+
*/
|
|
24
|
+
broad?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Content that will reach a model: a tool result, a RAG chunk, a scraped page.
|
|
28
|
+
* Regexes are heuristics that aim for few false positives, not an intent model.
|
|
29
|
+
* The precise rules come from prompt-injection-scanner; the broad ones are the
|
|
30
|
+
* phrases security-proxy 0.x blocked on.
|
|
31
|
+
*/
|
|
32
|
+
export declare const INJECTION_RULES: InjectionRule[];
|
|
33
|
+
/** @deprecated The bare regexes of INJECTION_RULES; use INJECTION_RULES. */
|
|
10
34
|
export declare const INJECTION_PATTERNS: RegExp[];
|
|
35
|
+
export interface InjectionFinding {
|
|
36
|
+
ruleId: string;
|
|
37
|
+
name: string;
|
|
38
|
+
category: InjectionCategory;
|
|
39
|
+
severity: InjectionRule["severity"];
|
|
40
|
+
broad: boolean;
|
|
41
|
+
match: string;
|
|
42
|
+
index: number;
|
|
43
|
+
/** Set when the phrase was found inside a decoded base64 run. */
|
|
44
|
+
encoding?: "base64";
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Every rule match in the text, plus precise-rule matches inside base64 runs
|
|
48
|
+
* that decode to text (an instruction hidden from both the reader and a plain
|
|
49
|
+
* pattern scan).
|
|
50
|
+
*/
|
|
51
|
+
export declare function findInjections(text: string): InjectionFinding[];
|
|
52
|
+
/**
|
|
53
|
+
* A precise high/critical rule → `mode` (block or warn). A broad or medium
|
|
54
|
+
* rule alone → warn, never block.
|
|
55
|
+
*/
|
|
11
56
|
export declare function scanForPromptInjection(input: unknown, mode?: "block" | "warn"): ScanResult;
|
|
12
|
-
/** Same
|
|
57
|
+
/** Same rules as request scanning, applied to a tool result the model will read. */
|
|
13
58
|
export declare function scanToolResult(content: unknown, mode?: "block" | "warn"): ScanResult;
|
|
14
59
|
//# sourceMappingURL=injection.d.ts.map
|
package/dist/injection.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../src/injection.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"injection.d.ts","sourceRoot":"","sources":["../src/injection.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,MAAM,EAAE,OAAO,CAAA;CAAE,GACnB;IAAE,MAAM,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACnC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEvC,MAAM,MAAM,iBAAiB,GACzB,sBAAsB,GACtB,eAAe,GACf,aAAa,GACb,gBAAgB,GAChB,cAAc,CAAC;AAEnB,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,oDAAoD;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,6DAA6D;IAC7D,cAAc,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED;;;;;GAKG;AACH,eAAO,MAAM,eAAe,EAAE,aAAa,EAiQ1C,CAAC;AAEF,4EAA4E;AAC5E,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAAgD,CAAC;AAExF,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,CAAC;IACpC,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,iEAAiE;IACjE,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAsCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,EAAE,CAK/D;AAiBD;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,OAAO,EACd,IAAI,GAAE,OAAO,GAAG,MAAgB,GAC/B,UAAU,CASZ;AAED,oFAAoF;AACpF,wBAAgB,cAAc,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,GAAE,OAAO,GAAG,MAAgB,GAAG,UAAU,CAO7F"}
|