@pan-sec/notebooklm-mcp 1.4.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/LICENSE +21 -0
- package/README.md +289 -0
- package/SECURITY.md +539 -0
- package/dist/auth/auth-manager.d.ts +137 -0
- package/dist/auth/auth-manager.d.ts.map +1 -0
- package/dist/auth/auth-manager.js +984 -0
- package/dist/auth/auth-manager.js.map +1 -0
- package/dist/auth/mcp-auth.d.ts +102 -0
- package/dist/auth/mcp-auth.d.ts.map +1 -0
- package/dist/auth/mcp-auth.js +286 -0
- package/dist/auth/mcp-auth.js.map +1 -0
- package/dist/config.d.ts +89 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +216 -0
- package/dist/config.js.map +1 -0
- package/dist/errors.d.ts +26 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +41 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +32 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +371 -0
- package/dist/index.js.map +1 -0
- package/dist/library/notebook-library.d.ts +70 -0
- package/dist/library/notebook-library.d.ts.map +1 -0
- package/dist/library/notebook-library.js +279 -0
- package/dist/library/notebook-library.js.map +1 -0
- package/dist/library/types.d.ts +67 -0
- package/dist/library/types.d.ts.map +1 -0
- package/dist/library/types.js +8 -0
- package/dist/library/types.js.map +1 -0
- package/dist/resources/resource-handlers.d.ts +22 -0
- package/dist/resources/resource-handlers.d.ts.map +1 -0
- package/dist/resources/resource-handlers.js +216 -0
- package/dist/resources/resource-handlers.js.map +1 -0
- package/dist/session/browser-session.d.ts +108 -0
- package/dist/session/browser-session.d.ts.map +1 -0
- package/dist/session/browser-session.js +621 -0
- package/dist/session/browser-session.js.map +1 -0
- package/dist/session/session-manager.d.ts +77 -0
- package/dist/session/session-manager.d.ts.map +1 -0
- package/dist/session/session-manager.js +314 -0
- package/dist/session/session-manager.js.map +1 -0
- package/dist/session/session-timeout.d.ts +122 -0
- package/dist/session/session-timeout.d.ts.map +1 -0
- package/dist/session/session-timeout.js +281 -0
- package/dist/session/session-timeout.js.map +1 -0
- package/dist/session/shared-context-manager.d.ts +107 -0
- package/dist/session/shared-context-manager.d.ts.map +1 -0
- package/dist/session/shared-context-manager.js +447 -0
- package/dist/session/shared-context-manager.js.map +1 -0
- package/dist/tools/definitions/ask-question.d.ts +8 -0
- package/dist/tools/definitions/ask-question.d.ts.map +1 -0
- package/dist/tools/definitions/ask-question.js +211 -0
- package/dist/tools/definitions/ask-question.js.map +1 -0
- package/dist/tools/definitions/notebook-management.d.ts +3 -0
- package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
- package/dist/tools/definitions/notebook-management.js +243 -0
- package/dist/tools/definitions/notebook-management.js.map +1 -0
- package/dist/tools/definitions/session-management.d.ts +3 -0
- package/dist/tools/definitions/session-management.d.ts.map +1 -0
- package/dist/tools/definitions/session-management.js +41 -0
- package/dist/tools/definitions/session-management.js.map +1 -0
- package/dist/tools/definitions/system.d.ts +3 -0
- package/dist/tools/definitions/system.d.ts.map +1 -0
- package/dist/tools/definitions/system.js +143 -0
- package/dist/tools/definitions/system.js.map +1 -0
- package/dist/tools/definitions.d.ts +12 -0
- package/dist/tools/definitions.d.ts.map +1 -0
- package/dist/tools/definitions.js +26 -0
- package/dist/tools/definitions.js.map +1 -0
- package/dist/tools/handlers.d.ts +213 -0
- package/dist/tools/handlers.d.ts.map +1 -0
- package/dist/tools/handlers.js +813 -0
- package/dist/tools/handlers.js.map +1 -0
- package/dist/tools/index.d.ts +8 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +8 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/types.d.ts +82 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/audit-logger.d.ts +140 -0
- package/dist/utils/audit-logger.d.ts.map +1 -0
- package/dist/utils/audit-logger.js +361 -0
- package/dist/utils/audit-logger.js.map +1 -0
- package/dist/utils/cert-pinning.d.ts +97 -0
- package/dist/utils/cert-pinning.d.ts.map +1 -0
- package/dist/utils/cert-pinning.js +328 -0
- package/dist/utils/cert-pinning.js.map +1 -0
- package/dist/utils/cleanup-manager.d.ts +133 -0
- package/dist/utils/cleanup-manager.d.ts.map +1 -0
- package/dist/utils/cleanup-manager.js +673 -0
- package/dist/utils/cleanup-manager.js.map +1 -0
- package/dist/utils/cli-handler.d.ts +16 -0
- package/dist/utils/cli-handler.d.ts.map +1 -0
- package/dist/utils/cli-handler.js +102 -0
- package/dist/utils/cli-handler.js.map +1 -0
- package/dist/utils/crypto.d.ts +175 -0
- package/dist/utils/crypto.d.ts.map +1 -0
- package/dist/utils/crypto.js +612 -0
- package/dist/utils/crypto.js.map +1 -0
- package/dist/utils/logger.d.ts +61 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +92 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/page-utils.d.ts +54 -0
- package/dist/utils/page-utils.d.ts.map +1 -0
- package/dist/utils/page-utils.js +405 -0
- package/dist/utils/page-utils.js.map +1 -0
- package/dist/utils/response-validator.d.ts +98 -0
- package/dist/utils/response-validator.d.ts.map +1 -0
- package/dist/utils/response-validator.js +352 -0
- package/dist/utils/response-validator.js.map +1 -0
- package/dist/utils/secrets-scanner.d.ts +126 -0
- package/dist/utils/secrets-scanner.d.ts.map +1 -0
- package/dist/utils/secrets-scanner.js +443 -0
- package/dist/utils/secrets-scanner.js.map +1 -0
- package/dist/utils/secure-memory.d.ts +130 -0
- package/dist/utils/secure-memory.d.ts.map +1 -0
- package/dist/utils/secure-memory.js +279 -0
- package/dist/utils/secure-memory.js.map +1 -0
- package/dist/utils/security.d.ts +83 -0
- package/dist/utils/security.d.ts.map +1 -0
- package/dist/utils/security.js +272 -0
- package/dist/utils/security.js.map +1 -0
- package/dist/utils/settings-manager.d.ts +37 -0
- package/dist/utils/settings-manager.d.ts.map +1 -0
- package/dist/utils/settings-manager.js +125 -0
- package/dist/utils/settings-manager.js.map +1 -0
- package/dist/utils/stealth-utils.d.ts +135 -0
- package/dist/utils/stealth-utils.d.ts.map +1 -0
- package/dist/utils/stealth-utils.js +398 -0
- package/dist/utils/stealth-utils.js.map +1 -0
- package/dist/utils/tool-validation.d.ts +93 -0
- package/dist/utils/tool-validation.d.ts.map +1 -0
- package/dist/utils/tool-validation.js +277 -0
- package/dist/utils/tool-validation.js.map +1 -0
- package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
- package/docs/configuration.md +94 -0
- package/docs/tools.md +34 -0
- package/docs/troubleshooting.md +59 -0
- package/docs/usage-guide.md +245 -0
- package/package.json +82 -0
|
@@ -0,0 +1,443 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secrets Scanner for NotebookLM MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Detects and prevents credential exposure:
|
|
5
|
+
* - API keys
|
|
6
|
+
* - Passwords
|
|
7
|
+
* - Tokens
|
|
8
|
+
* - Private keys
|
|
9
|
+
* - Connection strings
|
|
10
|
+
*
|
|
11
|
+
* Why this matters:
|
|
12
|
+
* - Prevents accidental credential logging
|
|
13
|
+
* - Detects leaked secrets in responses
|
|
14
|
+
* - Compliance with security best practices
|
|
15
|
+
*
|
|
16
|
+
* Patterns derived from: TruffleHog, GitLeaks, MEDUSA
|
|
17
|
+
* Added by Pantheon Security for hardened fork.
|
|
18
|
+
*/
|
|
19
|
+
import { log } from "./logger.js";
|
|
20
|
+
import { audit } from "./audit-logger.js";
|
|
21
|
+
/**
|
|
22
|
+
* Secret detection patterns
|
|
23
|
+
* Based on TruffleHog, GitLeaks, and custom patterns
|
|
24
|
+
*/
|
|
25
|
+
const SECRET_PATTERNS = [
|
|
26
|
+
// === CRITICAL: High-value secrets ===
|
|
27
|
+
// AWS
|
|
28
|
+
{
|
|
29
|
+
name: "AWS Access Key ID",
|
|
30
|
+
pattern: /\b(A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}\b/g,
|
|
31
|
+
severity: "critical",
|
|
32
|
+
description: "AWS Access Key ID",
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
name: "AWS Secret Access Key",
|
|
36
|
+
pattern: /\b[A-Za-z0-9/+=]{40}\b(?=.*aws|.*secret|.*key)/gi,
|
|
37
|
+
severity: "critical",
|
|
38
|
+
description: "Potential AWS Secret Access Key",
|
|
39
|
+
},
|
|
40
|
+
// Google
|
|
41
|
+
{
|
|
42
|
+
name: "Google API Key",
|
|
43
|
+
pattern: /\bAIza[0-9A-Za-z_-]{35}\b/g,
|
|
44
|
+
severity: "critical",
|
|
45
|
+
description: "Google API Key",
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
name: "Google OAuth Client ID",
|
|
49
|
+
pattern: /\b[0-9]+-[a-z0-9_]{32}\.apps\.googleusercontent\.com\b/g,
|
|
50
|
+
severity: "high",
|
|
51
|
+
description: "Google OAuth Client ID",
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
name: "Google OAuth Client Secret",
|
|
55
|
+
pattern: /\bGOCspx-[A-Za-z0-9_-]{28}\b/g,
|
|
56
|
+
severity: "critical",
|
|
57
|
+
description: "Google OAuth Client Secret",
|
|
58
|
+
},
|
|
59
|
+
// GitHub
|
|
60
|
+
{
|
|
61
|
+
name: "GitHub Personal Access Token",
|
|
62
|
+
pattern: /\b(ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{36,}\b/g,
|
|
63
|
+
severity: "critical",
|
|
64
|
+
description: "GitHub Personal Access Token",
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
name: "GitHub OAuth Token",
|
|
68
|
+
pattern: /\bgho_[A-Za-z0-9]{36}\b/g,
|
|
69
|
+
severity: "critical",
|
|
70
|
+
description: "GitHub OAuth Access Token",
|
|
71
|
+
},
|
|
72
|
+
// Slack
|
|
73
|
+
{
|
|
74
|
+
name: "Slack Bot Token",
|
|
75
|
+
pattern: /\bxoxb-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}\b/g,
|
|
76
|
+
severity: "critical",
|
|
77
|
+
description: "Slack Bot Token",
|
|
78
|
+
},
|
|
79
|
+
{
|
|
80
|
+
name: "Slack User Token",
|
|
81
|
+
pattern: /\bxoxp-[0-9]{10,13}-[0-9]{10,13}-[a-zA-Z0-9]{24}\b/g,
|
|
82
|
+
severity: "critical",
|
|
83
|
+
description: "Slack User Token",
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
name: "Slack Webhook URL",
|
|
87
|
+
pattern: /\bhttps:\/\/hooks\.slack\.com\/services\/T[A-Z0-9]{8,}\/B[A-Z0-9]{8,}\/[a-zA-Z0-9]{24}\b/g,
|
|
88
|
+
severity: "high",
|
|
89
|
+
description: "Slack Webhook URL",
|
|
90
|
+
},
|
|
91
|
+
// Stripe
|
|
92
|
+
{
|
|
93
|
+
name: "Stripe API Key",
|
|
94
|
+
pattern: /\b(sk|pk)_(test|live)_[0-9a-zA-Z]{24,}\b/g,
|
|
95
|
+
severity: "critical",
|
|
96
|
+
description: "Stripe API Key",
|
|
97
|
+
},
|
|
98
|
+
// OpenAI
|
|
99
|
+
{
|
|
100
|
+
name: "OpenAI API Key",
|
|
101
|
+
pattern: /\bsk-[A-Za-z0-9]{48}\b/g,
|
|
102
|
+
severity: "critical",
|
|
103
|
+
description: "OpenAI API Key",
|
|
104
|
+
},
|
|
105
|
+
// Anthropic
|
|
106
|
+
{
|
|
107
|
+
name: "Anthropic API Key",
|
|
108
|
+
pattern: /\bsk-ant-[A-Za-z0-9_-]{40,}\b/g,
|
|
109
|
+
severity: "critical",
|
|
110
|
+
description: "Anthropic API Key",
|
|
111
|
+
},
|
|
112
|
+
// === HIGH: Authentication credentials ===
|
|
113
|
+
// Private Keys
|
|
114
|
+
{
|
|
115
|
+
name: "RSA Private Key",
|
|
116
|
+
pattern: /-----BEGIN RSA PRIVATE KEY-----[\s\S]*?-----END RSA PRIVATE KEY-----/g,
|
|
117
|
+
severity: "critical",
|
|
118
|
+
description: "RSA Private Key",
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
name: "EC Private Key",
|
|
122
|
+
pattern: /-----BEGIN EC PRIVATE KEY-----[\s\S]*?-----END EC PRIVATE KEY-----/g,
|
|
123
|
+
severity: "critical",
|
|
124
|
+
description: "EC Private Key",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: "Generic Private Key",
|
|
128
|
+
pattern: /-----BEGIN PRIVATE KEY-----[\s\S]*?-----END PRIVATE KEY-----/g,
|
|
129
|
+
severity: "critical",
|
|
130
|
+
description: "Private Key",
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
name: "PGP Private Key",
|
|
134
|
+
pattern: /-----BEGIN PGP PRIVATE KEY BLOCK-----[\s\S]*?-----END PGP PRIVATE KEY BLOCK-----/g,
|
|
135
|
+
severity: "critical",
|
|
136
|
+
description: "PGP Private Key Block",
|
|
137
|
+
},
|
|
138
|
+
// JWT
|
|
139
|
+
{
|
|
140
|
+
name: "JSON Web Token",
|
|
141
|
+
pattern: /\beyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]+\b/g,
|
|
142
|
+
severity: "high",
|
|
143
|
+
description: "JSON Web Token (JWT)",
|
|
144
|
+
},
|
|
145
|
+
// Database Connection Strings
|
|
146
|
+
{
|
|
147
|
+
name: "PostgreSQL Connection String",
|
|
148
|
+
pattern: /\bpostgres(?:ql)?:\/\/[^:]+:[^@]+@[^/]+\/[^\s]+/gi,
|
|
149
|
+
severity: "critical",
|
|
150
|
+
description: "PostgreSQL Connection String with credentials",
|
|
151
|
+
},
|
|
152
|
+
{
|
|
153
|
+
name: "MongoDB Connection String",
|
|
154
|
+
pattern: /\bmongodb(?:\+srv)?:\/\/[^:]+:[^@]+@[^/]+/gi,
|
|
155
|
+
severity: "critical",
|
|
156
|
+
description: "MongoDB Connection String with credentials",
|
|
157
|
+
},
|
|
158
|
+
{
|
|
159
|
+
name: "MySQL Connection String",
|
|
160
|
+
pattern: /\bmysql:\/\/[^:]+:[^@]+@[^/]+/gi,
|
|
161
|
+
severity: "critical",
|
|
162
|
+
description: "MySQL Connection String with credentials",
|
|
163
|
+
},
|
|
164
|
+
// === MEDIUM: Potentially sensitive ===
|
|
165
|
+
// Generic password patterns
|
|
166
|
+
{
|
|
167
|
+
name: "Password in URL",
|
|
168
|
+
pattern: /\b[a-zA-Z]+:\/\/[^:]+:([^@]+)@/g,
|
|
169
|
+
severity: "high",
|
|
170
|
+
description: "Password in URL",
|
|
171
|
+
redactFn: (match) => match.replace(/:([^@]+)@/, ":****@"),
|
|
172
|
+
},
|
|
173
|
+
{
|
|
174
|
+
name: "Password Assignment",
|
|
175
|
+
pattern: /(?:password|passwd|pwd|secret|token|api_key|apikey|api-key)\s*[:=]\s*["']?([^\s"']{8,})["']?/gi,
|
|
176
|
+
severity: "medium",
|
|
177
|
+
description: "Password or secret assignment",
|
|
178
|
+
},
|
|
179
|
+
// Generic API key patterns
|
|
180
|
+
{
|
|
181
|
+
name: "Generic API Key",
|
|
182
|
+
pattern: /\b[a-zA-Z0-9_-]*api[_-]?key[a-zA-Z0-9_-]*\s*[:=]\s*["']?([^\s"']{16,})["']?/gi,
|
|
183
|
+
severity: "medium",
|
|
184
|
+
description: "Generic API key pattern",
|
|
185
|
+
},
|
|
186
|
+
// Bearer tokens
|
|
187
|
+
{
|
|
188
|
+
name: "Bearer Token",
|
|
189
|
+
pattern: /\bBearer\s+[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/gi,
|
|
190
|
+
severity: "high",
|
|
191
|
+
description: "Bearer Authorization Token",
|
|
192
|
+
},
|
|
193
|
+
// Basic Auth
|
|
194
|
+
{
|
|
195
|
+
name: "Basic Auth Header",
|
|
196
|
+
pattern: /\bBasic\s+[A-Za-z0-9+/=]{20,}\b/gi,
|
|
197
|
+
severity: "high",
|
|
198
|
+
description: "Basic Authentication Header",
|
|
199
|
+
},
|
|
200
|
+
// === LOW: May need review ===
|
|
201
|
+
// High entropy strings (potential secrets)
|
|
202
|
+
{
|
|
203
|
+
name: "High Entropy String",
|
|
204
|
+
pattern: /\b[A-Za-z0-9+/]{32,}={0,2}\b/g,
|
|
205
|
+
severity: "low",
|
|
206
|
+
description: "High entropy string (possible encoded secret)",
|
|
207
|
+
},
|
|
208
|
+
// SSH keys
|
|
209
|
+
{
|
|
210
|
+
name: "SSH Private Key",
|
|
211
|
+
pattern: /-----BEGIN OPENSSH PRIVATE KEY-----[\s\S]*?-----END OPENSSH PRIVATE KEY-----/g,
|
|
212
|
+
severity: "critical",
|
|
213
|
+
description: "OpenSSH Private Key",
|
|
214
|
+
},
|
|
215
|
+
// Email with password context
|
|
216
|
+
{
|
|
217
|
+
name: "Email with Password",
|
|
218
|
+
pattern: /\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b.*(?:password|pwd|passwd)/gi,
|
|
219
|
+
severity: "medium",
|
|
220
|
+
description: "Email address in password context",
|
|
221
|
+
},
|
|
222
|
+
];
|
|
223
|
+
/**
|
|
224
|
+
* Get secrets scanner configuration
|
|
225
|
+
*/
|
|
226
|
+
function getSecretsConfig() {
|
|
227
|
+
const minSeverity = (process.env.NLMCP_SECRETS_MIN_SEVERITY || "low");
|
|
228
|
+
return {
|
|
229
|
+
enabled: process.env.NLMCP_SECRETS_SCANNING !== "false",
|
|
230
|
+
blockOnDetection: process.env.NLMCP_SECRETS_BLOCK === "true",
|
|
231
|
+
autoRedact: process.env.NLMCP_SECRETS_REDACT !== "false",
|
|
232
|
+
minSeverity,
|
|
233
|
+
customPatterns: [],
|
|
234
|
+
ignoredPatterns: (process.env.NLMCP_SECRETS_IGNORE || "").split(",").filter(Boolean),
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* Severity level ordering
|
|
239
|
+
*/
|
|
240
|
+
const SEVERITY_ORDER = {
|
|
241
|
+
critical: 4,
|
|
242
|
+
high: 3,
|
|
243
|
+
medium: 2,
|
|
244
|
+
low: 1,
|
|
245
|
+
};
|
|
246
|
+
/**
|
|
247
|
+
* Secrets Scanner Class
|
|
248
|
+
*/
|
|
249
|
+
export class SecretsScanner {
|
|
250
|
+
config;
|
|
251
|
+
patterns;
|
|
252
|
+
stats = {
|
|
253
|
+
scanned: 0,
|
|
254
|
+
secretsFound: 0,
|
|
255
|
+
blocked: 0,
|
|
256
|
+
redacted: 0,
|
|
257
|
+
};
|
|
258
|
+
constructor(config) {
|
|
259
|
+
this.config = { ...getSecretsConfig(), ...config };
|
|
260
|
+
this.patterns = [...SECRET_PATTERNS, ...this.config.customPatterns].filter((p) => !this.config.ignoredPatterns.includes(p.name));
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Scan text for secrets
|
|
264
|
+
*/
|
|
265
|
+
scan(text) {
|
|
266
|
+
if (!this.config.enabled || !text) {
|
|
267
|
+
return [];
|
|
268
|
+
}
|
|
269
|
+
this.stats.scanned++;
|
|
270
|
+
const matches = [];
|
|
271
|
+
const minSeverityLevel = SEVERITY_ORDER[this.config.minSeverity];
|
|
272
|
+
for (const pattern of this.patterns) {
|
|
273
|
+
// Skip if below minimum severity
|
|
274
|
+
if (SEVERITY_ORDER[pattern.severity] < minSeverityLevel) {
|
|
275
|
+
continue;
|
|
276
|
+
}
|
|
277
|
+
// Reset regex state
|
|
278
|
+
pattern.pattern.lastIndex = 0;
|
|
279
|
+
let match;
|
|
280
|
+
while ((match = pattern.pattern.exec(text)) !== null) {
|
|
281
|
+
const matchedText = match[0];
|
|
282
|
+
// Calculate line and column
|
|
283
|
+
const beforeMatch = text.substring(0, match.index);
|
|
284
|
+
const lines = beforeMatch.split("\n");
|
|
285
|
+
const line = lines.length;
|
|
286
|
+
const column = lines[lines.length - 1].length + 1;
|
|
287
|
+
// Generate redacted version
|
|
288
|
+
const redacted = pattern.redactFn
|
|
289
|
+
? pattern.redactFn(matchedText)
|
|
290
|
+
: this.defaultRedact(matchedText, pattern.name);
|
|
291
|
+
matches.push({
|
|
292
|
+
type: pattern.name,
|
|
293
|
+
pattern: pattern.description,
|
|
294
|
+
match: matchedText,
|
|
295
|
+
redacted,
|
|
296
|
+
line,
|
|
297
|
+
column,
|
|
298
|
+
severity: pattern.severity,
|
|
299
|
+
});
|
|
300
|
+
this.stats.secretsFound++;
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
return matches;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Scan and optionally redact secrets
|
|
307
|
+
*/
|
|
308
|
+
async scanAndRedact(text) {
|
|
309
|
+
const secrets = this.scan(text);
|
|
310
|
+
if (secrets.length === 0) {
|
|
311
|
+
return { clean: text, secrets: [], blocked: false };
|
|
312
|
+
}
|
|
313
|
+
// Log the detection
|
|
314
|
+
const criticalCount = secrets.filter((s) => s.severity === "critical").length;
|
|
315
|
+
const highCount = secrets.filter((s) => s.severity === "high").length;
|
|
316
|
+
if (criticalCount > 0 || highCount > 0) {
|
|
317
|
+
log.warning(`🔐 Secrets detected: ${criticalCount} critical, ${highCount} high`);
|
|
318
|
+
for (const secret of secrets.filter((s) => s.severity === "critical" || s.severity === "high")) {
|
|
319
|
+
log.warning(` - ${secret.type} at line ${secret.line}`);
|
|
320
|
+
}
|
|
321
|
+
}
|
|
322
|
+
// Audit log
|
|
323
|
+
await audit.security("secrets_detected", criticalCount > 0 ? "critical" : "warning", {
|
|
324
|
+
count: secrets.length,
|
|
325
|
+
types: [...new Set(secrets.map((s) => s.type))],
|
|
326
|
+
severities: {
|
|
327
|
+
critical: criticalCount,
|
|
328
|
+
high: highCount,
|
|
329
|
+
medium: secrets.filter((s) => s.severity === "medium").length,
|
|
330
|
+
low: secrets.filter((s) => s.severity === "low").length,
|
|
331
|
+
},
|
|
332
|
+
});
|
|
333
|
+
// Check if we should block
|
|
334
|
+
if (this.config.blockOnDetection && (criticalCount > 0 || highCount > 0)) {
|
|
335
|
+
this.stats.blocked++;
|
|
336
|
+
return {
|
|
337
|
+
clean: "[BLOCKED: Sensitive data detected]",
|
|
338
|
+
secrets,
|
|
339
|
+
blocked: true,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
// Redact if enabled
|
|
343
|
+
let clean = text;
|
|
344
|
+
if (this.config.autoRedact) {
|
|
345
|
+
// Sort by position descending to avoid offset issues
|
|
346
|
+
const sortedSecrets = [...secrets].sort((a, b) => {
|
|
347
|
+
const posA = text.indexOf(a.match);
|
|
348
|
+
const posB = text.indexOf(b.match);
|
|
349
|
+
return posB - posA;
|
|
350
|
+
});
|
|
351
|
+
for (const secret of sortedSecrets) {
|
|
352
|
+
clean = clean.replace(secret.match, secret.redacted);
|
|
353
|
+
this.stats.redacted++;
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
return { clean, secrets, blocked: false };
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Default redaction function
|
|
360
|
+
*/
|
|
361
|
+
defaultRedact(value, type) {
|
|
362
|
+
if (value.length <= 8) {
|
|
363
|
+
return `[REDACTED:${type}]`;
|
|
364
|
+
}
|
|
365
|
+
// Show first 4 and last 4 characters
|
|
366
|
+
const prefix = value.substring(0, 4);
|
|
367
|
+
const suffix = value.substring(value.length - 4);
|
|
368
|
+
const middleLength = value.length - 8;
|
|
369
|
+
return `${prefix}${"*".repeat(Math.min(middleLength, 8))}${suffix}`;
|
|
370
|
+
}
|
|
371
|
+
/**
|
|
372
|
+
* Add a custom pattern
|
|
373
|
+
*/
|
|
374
|
+
addPattern(pattern) {
|
|
375
|
+
this.patterns.push(pattern);
|
|
376
|
+
this.config.customPatterns.push(pattern);
|
|
377
|
+
}
|
|
378
|
+
/**
|
|
379
|
+
* Ignore a pattern by name
|
|
380
|
+
*/
|
|
381
|
+
ignorePattern(name) {
|
|
382
|
+
this.config.ignoredPatterns.push(name);
|
|
383
|
+
this.patterns = this.patterns.filter((p) => p.name !== name);
|
|
384
|
+
}
|
|
385
|
+
/**
|
|
386
|
+
* Get scanning statistics
|
|
387
|
+
*/
|
|
388
|
+
getStats() {
|
|
389
|
+
return {
|
|
390
|
+
...this.stats,
|
|
391
|
+
patterns: this.patterns.length,
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Reset statistics
|
|
396
|
+
*/
|
|
397
|
+
resetStats() {
|
|
398
|
+
this.stats = {
|
|
399
|
+
scanned: 0,
|
|
400
|
+
secretsFound: 0,
|
|
401
|
+
blocked: 0,
|
|
402
|
+
redacted: 0,
|
|
403
|
+
};
|
|
404
|
+
}
|
|
405
|
+
/**
|
|
406
|
+
* Update configuration
|
|
407
|
+
*/
|
|
408
|
+
updateConfig(config) {
|
|
409
|
+
this.config = { ...this.config, ...config };
|
|
410
|
+
}
|
|
411
|
+
/**
|
|
412
|
+
* Check if scanning is enabled
|
|
413
|
+
*/
|
|
414
|
+
isEnabled() {
|
|
415
|
+
return this.config.enabled;
|
|
416
|
+
}
|
|
417
|
+
}
|
|
418
|
+
/**
|
|
419
|
+
* Global secrets scanner instance
|
|
420
|
+
*/
|
|
421
|
+
let globalScanner = null;
|
|
422
|
+
/**
|
|
423
|
+
* Get or create the global secrets scanner
|
|
424
|
+
*/
|
|
425
|
+
export function getSecretsScanner() {
|
|
426
|
+
if (!globalScanner) {
|
|
427
|
+
globalScanner = new SecretsScanner();
|
|
428
|
+
}
|
|
429
|
+
return globalScanner;
|
|
430
|
+
}
|
|
431
|
+
/**
|
|
432
|
+
* Convenience function to scan text for secrets
|
|
433
|
+
*/
|
|
434
|
+
export function scanForSecrets(text) {
|
|
435
|
+
return getSecretsScanner().scan(text);
|
|
436
|
+
}
|
|
437
|
+
/**
|
|
438
|
+
* Convenience function to scan and redact secrets
|
|
439
|
+
*/
|
|
440
|
+
export async function scanAndRedactSecrets(text) {
|
|
441
|
+
return getSecretsScanner().scanAndRedact(text);
|
|
442
|
+
}
|
|
443
|
+
//# sourceMappingURL=secrets-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secrets-scanner.js","sourceRoot":"","sources":["../../src/utils/secrets-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Secure Memory Utilities for NotebookLM MCP Server
|
|
3
|
+
*
|
|
4
|
+
* Provides secure handling of sensitive data in memory:
|
|
5
|
+
* - Zero-fill buffers and strings after use
|
|
6
|
+
* - Secure string class that auto-wipes
|
|
7
|
+
* - Memory-safe credential handling
|
|
8
|
+
*
|
|
9
|
+
* Why this matters:
|
|
10
|
+
* - Prevents memory dump attacks
|
|
11
|
+
* - Reduces credential exposure window
|
|
12
|
+
* - Mitigates cold boot attacks
|
|
13
|
+
*
|
|
14
|
+
* Added by Pantheon Security for hardened fork.
|
|
15
|
+
*/
|
|
16
|
+
/**
|
|
17
|
+
* Securely zero-fill a Buffer
|
|
18
|
+
* Uses crypto.randomFill first to prevent compiler optimization removal
|
|
19
|
+
*/
|
|
20
|
+
export declare function zeroBuffer(buffer: Buffer): void;
|
|
21
|
+
/**
|
|
22
|
+
* Securely zero-fill a Uint8Array
|
|
23
|
+
*/
|
|
24
|
+
export declare function zeroUint8Array(arr: Uint8Array): void;
|
|
25
|
+
/**
|
|
26
|
+
* Create a secure string that can be wiped
|
|
27
|
+
* Note: JavaScript strings are immutable, so we use a Buffer internally
|
|
28
|
+
*/
|
|
29
|
+
export declare class SecureString {
|
|
30
|
+
private buffer;
|
|
31
|
+
private wiped;
|
|
32
|
+
constructor(value: string);
|
|
33
|
+
/**
|
|
34
|
+
* Get the string value (creates new string each time)
|
|
35
|
+
*/
|
|
36
|
+
toString(): string;
|
|
37
|
+
/**
|
|
38
|
+
* Get the underlying buffer (for crypto operations)
|
|
39
|
+
*/
|
|
40
|
+
toBuffer(): Buffer;
|
|
41
|
+
/**
|
|
42
|
+
* Get length without exposing content
|
|
43
|
+
*/
|
|
44
|
+
get length(): number;
|
|
45
|
+
/**
|
|
46
|
+
* Securely wipe the string from memory
|
|
47
|
+
*/
|
|
48
|
+
wipe(): void;
|
|
49
|
+
/**
|
|
50
|
+
* Check if already wiped
|
|
51
|
+
*/
|
|
52
|
+
isWiped(): boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Secure credential holder with automatic wiping
|
|
56
|
+
*/
|
|
57
|
+
export declare class SecureCredential {
|
|
58
|
+
private value;
|
|
59
|
+
private createdAt;
|
|
60
|
+
private maxAgeMs;
|
|
61
|
+
private autoWipeTimer?;
|
|
62
|
+
constructor(credential: string, maxAgeMs?: number);
|
|
63
|
+
/**
|
|
64
|
+
* Get the credential value
|
|
65
|
+
*/
|
|
66
|
+
getValue(): string;
|
|
67
|
+
/**
|
|
68
|
+
* Check if credential has expired
|
|
69
|
+
*/
|
|
70
|
+
isExpired(): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* Get time remaining before auto-wipe (ms)
|
|
73
|
+
*/
|
|
74
|
+
getTimeRemaining(): number;
|
|
75
|
+
/**
|
|
76
|
+
* Securely wipe the credential
|
|
77
|
+
*/
|
|
78
|
+
wipe(): void;
|
|
79
|
+
/**
|
|
80
|
+
* Check if already wiped
|
|
81
|
+
*/
|
|
82
|
+
isWiped(): boolean;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Secure object that wipes all string/buffer properties on dispose
|
|
86
|
+
*/
|
|
87
|
+
export declare class SecureObject<T extends Record<string, unknown>> {
|
|
88
|
+
private data;
|
|
89
|
+
private disposed;
|
|
90
|
+
constructor(data: T);
|
|
91
|
+
/**
|
|
92
|
+
* Get a property value
|
|
93
|
+
*/
|
|
94
|
+
get<K extends keyof T>(key: K): T[K];
|
|
95
|
+
/**
|
|
96
|
+
* Get all data (use carefully)
|
|
97
|
+
*/
|
|
98
|
+
getData(): T;
|
|
99
|
+
/**
|
|
100
|
+
* Dispose and wipe all sensitive data
|
|
101
|
+
*/
|
|
102
|
+
dispose(): void;
|
|
103
|
+
/**
|
|
104
|
+
* Check if disposed
|
|
105
|
+
*/
|
|
106
|
+
isDisposed(): boolean;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Execute a function with a secure credential, auto-wiping after use
|
|
110
|
+
*/
|
|
111
|
+
export declare function withSecureCredential<T>(credential: string, fn: (cred: SecureCredential) => Promise<T>): Promise<T>;
|
|
112
|
+
/**
|
|
113
|
+
* Execute a function with a secure buffer, auto-wiping after use
|
|
114
|
+
*/
|
|
115
|
+
export declare function withSecureBuffer<T>(data: Buffer, fn: (buffer: Buffer) => Promise<T>): Promise<T>;
|
|
116
|
+
export declare function createSecureBuffer(size: number): Buffer;
|
|
117
|
+
export declare function createSecureBuffer(data: string, encoding?: BufferEncoding): Buffer;
|
|
118
|
+
/**
|
|
119
|
+
* Secure comparison to prevent timing attacks
|
|
120
|
+
*/
|
|
121
|
+
export declare function secureCompare(a: string | Buffer, b: string | Buffer): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Generate a secure random string
|
|
124
|
+
*/
|
|
125
|
+
export declare function secureRandomString(length: number, encoding?: BufferEncoding): string;
|
|
126
|
+
/**
|
|
127
|
+
* Mask sensitive data for logging (doesn't expose real length)
|
|
128
|
+
*/
|
|
129
|
+
export declare function maskSensitive(value: string, showChars?: number): string;
|
|
130
|
+
//# sourceMappingURL=secure-memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"secure-memory.d.ts","sourceRoot":"","sources":["../../src/utils/secure-memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAIH;;;GAGG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAO/C;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI,CAMpD;AAED;;;GAGG;AACH,qBAAa,YAAY;IACvB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,KAAK,CAAkB;gBAEnB,KAAK,EAAE,MAAM;IAIzB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAOlB;;OAEG;IACH,QAAQ,IAAI,MAAM;IAOlB;;OAEG;IACH,IAAI,MAAM,IAAI,MAAM,CAEnB;IAED;;OAEG;IACH,IAAI,IAAI,IAAI;IAOZ;;OAEG;IACH,OAAO,IAAI,OAAO;CAGnB;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,KAAK,CAAe;IAC5B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,aAAa,CAAC,CAAiB;gBAE3B,UAAU,EAAE,MAAM,EAAE,QAAQ,GAAE,MAAe;IAWzD;;OAEG;IACH,QAAQ,IAAI,MAAM;IAQlB;;OAEG;IACH,SAAS,IAAI,OAAO;IAIpB;;OAEG;IACH,gBAAgB,IAAI,MAAM;IAK1B;;OAEG;IACH,IAAI,IAAI,IAAI;IAQZ;;OAEG;IACH,OAAO,IAAI,OAAO;CAGnB;AAED;;GAEG;AACH,qBAAa,YAAY,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IACzD,OAAO,CAAC,IAAI,CAAI;IAChB,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,IAAI,EAAE,CAAC;IAInB;;OAEG;IACH,GAAG,CAAC,CAAC,SAAS,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;IAOpC;;OAEG;IACH,OAAO,IAAI,CAAC;IAOZ;;OAEG;IACH,OAAO,IAAI,IAAI;IAuBf;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,CAAC,EAC1C,UAAU,EAAE,MAAM,EAClB,EAAE,EAAE,CAAC,IAAI,EAAE,gBAAgB,KAAK,OAAO,CAAC,CAAC,CAAC,GACzC,OAAO,CAAC,CAAC,CAAC,CAOZ;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,CAAC,EACtC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GACjC,OAAO,CAAC,CAAC,CAAC,CAMZ;AAUD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;AACzD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,cAAc,GAAG,MAAM,CAAC;AAiBpF;;GAEG;AACH,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAW7E;AAED;;GAEG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,GAAE,cAA4B,GAAG,MAAM,CAGjG;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG,MAAM,CAK1E"}
|