@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.
Files changed (145) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +289 -0
  3. package/SECURITY.md +539 -0
  4. package/dist/auth/auth-manager.d.ts +137 -0
  5. package/dist/auth/auth-manager.d.ts.map +1 -0
  6. package/dist/auth/auth-manager.js +984 -0
  7. package/dist/auth/auth-manager.js.map +1 -0
  8. package/dist/auth/mcp-auth.d.ts +102 -0
  9. package/dist/auth/mcp-auth.d.ts.map +1 -0
  10. package/dist/auth/mcp-auth.js +286 -0
  11. package/dist/auth/mcp-auth.js.map +1 -0
  12. package/dist/config.d.ts +89 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +216 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/errors.d.ts +26 -0
  17. package/dist/errors.d.ts.map +1 -0
  18. package/dist/errors.js +41 -0
  19. package/dist/errors.js.map +1 -0
  20. package/dist/index.d.ts +32 -0
  21. package/dist/index.d.ts.map +1 -0
  22. package/dist/index.js +371 -0
  23. package/dist/index.js.map +1 -0
  24. package/dist/library/notebook-library.d.ts +70 -0
  25. package/dist/library/notebook-library.d.ts.map +1 -0
  26. package/dist/library/notebook-library.js +279 -0
  27. package/dist/library/notebook-library.js.map +1 -0
  28. package/dist/library/types.d.ts +67 -0
  29. package/dist/library/types.d.ts.map +1 -0
  30. package/dist/library/types.js +8 -0
  31. package/dist/library/types.js.map +1 -0
  32. package/dist/resources/resource-handlers.d.ts +22 -0
  33. package/dist/resources/resource-handlers.d.ts.map +1 -0
  34. package/dist/resources/resource-handlers.js +216 -0
  35. package/dist/resources/resource-handlers.js.map +1 -0
  36. package/dist/session/browser-session.d.ts +108 -0
  37. package/dist/session/browser-session.d.ts.map +1 -0
  38. package/dist/session/browser-session.js +621 -0
  39. package/dist/session/browser-session.js.map +1 -0
  40. package/dist/session/session-manager.d.ts +77 -0
  41. package/dist/session/session-manager.d.ts.map +1 -0
  42. package/dist/session/session-manager.js +314 -0
  43. package/dist/session/session-manager.js.map +1 -0
  44. package/dist/session/session-timeout.d.ts +122 -0
  45. package/dist/session/session-timeout.d.ts.map +1 -0
  46. package/dist/session/session-timeout.js +281 -0
  47. package/dist/session/session-timeout.js.map +1 -0
  48. package/dist/session/shared-context-manager.d.ts +107 -0
  49. package/dist/session/shared-context-manager.d.ts.map +1 -0
  50. package/dist/session/shared-context-manager.js +447 -0
  51. package/dist/session/shared-context-manager.js.map +1 -0
  52. package/dist/tools/definitions/ask-question.d.ts +8 -0
  53. package/dist/tools/definitions/ask-question.d.ts.map +1 -0
  54. package/dist/tools/definitions/ask-question.js +211 -0
  55. package/dist/tools/definitions/ask-question.js.map +1 -0
  56. package/dist/tools/definitions/notebook-management.d.ts +3 -0
  57. package/dist/tools/definitions/notebook-management.d.ts.map +1 -0
  58. package/dist/tools/definitions/notebook-management.js +243 -0
  59. package/dist/tools/definitions/notebook-management.js.map +1 -0
  60. package/dist/tools/definitions/session-management.d.ts +3 -0
  61. package/dist/tools/definitions/session-management.d.ts.map +1 -0
  62. package/dist/tools/definitions/session-management.js +41 -0
  63. package/dist/tools/definitions/session-management.js.map +1 -0
  64. package/dist/tools/definitions/system.d.ts +3 -0
  65. package/dist/tools/definitions/system.d.ts.map +1 -0
  66. package/dist/tools/definitions/system.js +143 -0
  67. package/dist/tools/definitions/system.js.map +1 -0
  68. package/dist/tools/definitions.d.ts +12 -0
  69. package/dist/tools/definitions.d.ts.map +1 -0
  70. package/dist/tools/definitions.js +26 -0
  71. package/dist/tools/definitions.js.map +1 -0
  72. package/dist/tools/handlers.d.ts +213 -0
  73. package/dist/tools/handlers.d.ts.map +1 -0
  74. package/dist/tools/handlers.js +813 -0
  75. package/dist/tools/handlers.js.map +1 -0
  76. package/dist/tools/index.d.ts +8 -0
  77. package/dist/tools/index.d.ts.map +1 -0
  78. package/dist/tools/index.js +8 -0
  79. package/dist/tools/index.js.map +1 -0
  80. package/dist/types.d.ts +82 -0
  81. package/dist/types.d.ts.map +1 -0
  82. package/dist/types.js +5 -0
  83. package/dist/types.js.map +1 -0
  84. package/dist/utils/audit-logger.d.ts +140 -0
  85. package/dist/utils/audit-logger.d.ts.map +1 -0
  86. package/dist/utils/audit-logger.js +361 -0
  87. package/dist/utils/audit-logger.js.map +1 -0
  88. package/dist/utils/cert-pinning.d.ts +97 -0
  89. package/dist/utils/cert-pinning.d.ts.map +1 -0
  90. package/dist/utils/cert-pinning.js +328 -0
  91. package/dist/utils/cert-pinning.js.map +1 -0
  92. package/dist/utils/cleanup-manager.d.ts +133 -0
  93. package/dist/utils/cleanup-manager.d.ts.map +1 -0
  94. package/dist/utils/cleanup-manager.js +673 -0
  95. package/dist/utils/cleanup-manager.js.map +1 -0
  96. package/dist/utils/cli-handler.d.ts +16 -0
  97. package/dist/utils/cli-handler.d.ts.map +1 -0
  98. package/dist/utils/cli-handler.js +102 -0
  99. package/dist/utils/cli-handler.js.map +1 -0
  100. package/dist/utils/crypto.d.ts +175 -0
  101. package/dist/utils/crypto.d.ts.map +1 -0
  102. package/dist/utils/crypto.js +612 -0
  103. package/dist/utils/crypto.js.map +1 -0
  104. package/dist/utils/logger.d.ts +61 -0
  105. package/dist/utils/logger.d.ts.map +1 -0
  106. package/dist/utils/logger.js +92 -0
  107. package/dist/utils/logger.js.map +1 -0
  108. package/dist/utils/page-utils.d.ts +54 -0
  109. package/dist/utils/page-utils.d.ts.map +1 -0
  110. package/dist/utils/page-utils.js +405 -0
  111. package/dist/utils/page-utils.js.map +1 -0
  112. package/dist/utils/response-validator.d.ts +98 -0
  113. package/dist/utils/response-validator.d.ts.map +1 -0
  114. package/dist/utils/response-validator.js +352 -0
  115. package/dist/utils/response-validator.js.map +1 -0
  116. package/dist/utils/secrets-scanner.d.ts +126 -0
  117. package/dist/utils/secrets-scanner.d.ts.map +1 -0
  118. package/dist/utils/secrets-scanner.js +443 -0
  119. package/dist/utils/secrets-scanner.js.map +1 -0
  120. package/dist/utils/secure-memory.d.ts +130 -0
  121. package/dist/utils/secure-memory.d.ts.map +1 -0
  122. package/dist/utils/secure-memory.js +279 -0
  123. package/dist/utils/secure-memory.js.map +1 -0
  124. package/dist/utils/security.d.ts +83 -0
  125. package/dist/utils/security.d.ts.map +1 -0
  126. package/dist/utils/security.js +272 -0
  127. package/dist/utils/security.js.map +1 -0
  128. package/dist/utils/settings-manager.d.ts +37 -0
  129. package/dist/utils/settings-manager.d.ts.map +1 -0
  130. package/dist/utils/settings-manager.js +125 -0
  131. package/dist/utils/settings-manager.js.map +1 -0
  132. package/dist/utils/stealth-utils.d.ts +135 -0
  133. package/dist/utils/stealth-utils.d.ts.map +1 -0
  134. package/dist/utils/stealth-utils.js +398 -0
  135. package/dist/utils/stealth-utils.js.map +1 -0
  136. package/dist/utils/tool-validation.d.ts +93 -0
  137. package/dist/utils/tool-validation.d.ts.map +1 -0
  138. package/dist/utils/tool-validation.js +277 -0
  139. package/dist/utils/tool-validation.js.map +1 -0
  140. package/docs/SECURITY_IMPLEMENTATION_PLAN.md +437 -0
  141. package/docs/configuration.md +94 -0
  142. package/docs/tools.md +34 -0
  143. package/docs/troubleshooting.md +59 -0
  144. package/docs/usage-guide.md +245 -0
  145. package/package.json +82 -0
@@ -0,0 +1,98 @@
1
+ /**
2
+ * Response Validator for NotebookLM MCP Server
3
+ *
4
+ * Validates and sanitizes responses from NotebookLM:
5
+ * - Prompt injection detection
6
+ * - Malicious URL detection
7
+ * - Encoded payload detection
8
+ * - Response sanitization
9
+ *
10
+ * Uses patterns derived from MEDUSA AI Security Scanner.
11
+ * Added by Pantheon Security for hardened fork.
12
+ */
13
+ /**
14
+ * Response validation result
15
+ */
16
+ export interface ValidationResult {
17
+ safe: boolean;
18
+ warnings: string[];
19
+ blocked: string[];
20
+ sanitized: string;
21
+ originalLength: number;
22
+ sanitizedLength: number;
23
+ }
24
+ /**
25
+ * Response validator configuration
26
+ */
27
+ export interface ResponseValidatorConfig {
28
+ /** Enable response validation (default: true) */
29
+ enabled: boolean;
30
+ /** Block responses containing prompt injection (default: true) */
31
+ blockPromptInjection: boolean;
32
+ /** Block responses containing suspicious URLs (default: true) */
33
+ blockSuspiciousUrls: boolean;
34
+ /** Block responses containing encoded payloads (default: false - just warn) */
35
+ blockEncodedPayloads: boolean;
36
+ /** Warn on suspicious content without blocking (default: true) */
37
+ warnOnSuspicious: boolean;
38
+ /** Allowed domains for URLs in responses */
39
+ allowedDomains: string[];
40
+ }
41
+ /**
42
+ * Response Validator Class
43
+ */
44
+ export declare class ResponseValidator {
45
+ private config;
46
+ private stats;
47
+ constructor(config?: Partial<ResponseValidatorConfig>);
48
+ /**
49
+ * Validate a response from NotebookLM
50
+ */
51
+ validate(response: string): Promise<ValidationResult>;
52
+ /**
53
+ * Detect prompt injection attempts in text
54
+ */
55
+ detectPromptInjection(text: string): Array<{
56
+ pattern: RegExp;
57
+ description: string;
58
+ severity: string;
59
+ match: string;
60
+ }>;
61
+ /**
62
+ * Detect suspicious URLs in text
63
+ */
64
+ detectSuspiciousUrls(text: string): Array<{
65
+ pattern: RegExp;
66
+ description: string;
67
+ url: string;
68
+ }>;
69
+ /**
70
+ * Detect encoded payloads in text
71
+ */
72
+ detectEncodedPayloads(text: string): Array<{
73
+ pattern: RegExp;
74
+ description: string;
75
+ match: string;
76
+ }>;
77
+ /**
78
+ * Get validation statistics
79
+ */
80
+ getStats(): typeof this.stats;
81
+ /**
82
+ * Reset statistics
83
+ */
84
+ resetStats(): void;
85
+ /**
86
+ * Update configuration
87
+ */
88
+ updateConfig(config: Partial<ResponseValidatorConfig>): void;
89
+ }
90
+ /**
91
+ * Get or create the global response validator
92
+ */
93
+ export declare function getResponseValidator(): ResponseValidator;
94
+ /**
95
+ * Convenience function to validate a response
96
+ */
97
+ export declare function validateResponse(response: string): Promise<ValidationResult>;
98
+ //# sourceMappingURL=response-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-validator.d.ts","sourceRoot":"","sources":["../../src/utils/response-validator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAKH;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,eAAe,EAAE,MAAM,CAAC;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,uBAAuB;IACtC,iDAAiD;IACjD,OAAO,EAAE,OAAO,CAAC;IACjB,kEAAkE;IAClE,oBAAoB,EAAE,OAAO,CAAC;IAC9B,iEAAiE;IACjE,mBAAmB,EAAE,OAAO,CAAC;IAC7B,+EAA+E;IAC/E,oBAAoB,EAAE,OAAO,CAAC;IAC9B,kEAAkE;IAClE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,4CAA4C;IAC5C,cAAc,EAAE,MAAM,EAAE,CAAC;CAC1B;AAwID;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAA0B;IACxC,OAAO,CAAC,KAAK,CAKX;gBAEU,MAAM,CAAC,EAAE,OAAO,CAAC,uBAAuB,CAAC;IAIrD;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAmG3D;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkBrH;;OAEG;IACH,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAiBhG;;OAEG;IACH,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAoBnG;;OAEG;IACH,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK;IAI7B;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,uBAAuB,CAAC,GAAG,IAAI;CAG7D;AAOD;;GAEG;AACH,wBAAgB,oBAAoB,IAAI,iBAAiB,CAKxD;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,CAElF"}
@@ -0,0 +1,352 @@
1
+ /**
2
+ * Response Validator for NotebookLM MCP Server
3
+ *
4
+ * Validates and sanitizes responses from NotebookLM:
5
+ * - Prompt injection detection
6
+ * - Malicious URL detection
7
+ * - Encoded payload detection
8
+ * - Response sanitization
9
+ *
10
+ * Uses patterns derived from MEDUSA AI Security Scanner.
11
+ * Added by Pantheon Security for hardened fork.
12
+ */
13
+ import { audit } from "./audit-logger.js";
14
+ import { log } from "./logger.js";
15
+ /**
16
+ * Get validator configuration from environment
17
+ */
18
+ function getValidatorConfig() {
19
+ return {
20
+ enabled: process.env.NLMCP_RESPONSE_VALIDATION !== "false",
21
+ blockPromptInjection: process.env.NLMCP_BLOCK_PROMPT_INJECTION !== "false",
22
+ blockSuspiciousUrls: process.env.NLMCP_BLOCK_SUSPICIOUS_URLS !== "false",
23
+ blockEncodedPayloads: process.env.NLMCP_BLOCK_ENCODED_PAYLOADS === "true",
24
+ warnOnSuspicious: process.env.NLMCP_WARN_SUSPICIOUS !== "false",
25
+ allowedDomains: (process.env.NLMCP_ALLOWED_DOMAINS || "").split(",").filter(d => d.length > 0),
26
+ };
27
+ }
28
+ /**
29
+ * Prompt injection detection patterns
30
+ * Derived from MEDUSA AI Security Scanner (AIC001-030)
31
+ */
32
+ const PROMPT_INJECTION_PATTERNS = [
33
+ // Direct instruction override attempts
34
+ {
35
+ pattern: /ignore\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?|rules?|guidelines?)/i,
36
+ description: "Instruction override attempt",
37
+ severity: "critical",
38
+ },
39
+ {
40
+ pattern: /disregard\s+(all\s+)?(previous|prior|above|earlier)\s+(instructions?|prompts?|text|context)/i,
41
+ description: "Disregard instruction attempt",
42
+ severity: "critical",
43
+ },
44
+ {
45
+ pattern: /forget\s+(everything|all|your)\s+(you('ve)?|instructions?|training|learned)/i,
46
+ description: "Memory reset attempt",
47
+ severity: "critical",
48
+ },
49
+ {
50
+ pattern: /you\s+are\s+now\s+(in\s+)?(\w+)\s+mode/i,
51
+ description: "Mode switching attempt",
52
+ severity: "high",
53
+ },
54
+ {
55
+ pattern: /new\s+instructions?\s*:/i,
56
+ description: "New instruction injection",
57
+ severity: "high",
58
+ },
59
+ {
60
+ pattern: /system\s*:\s*[^\n]{10,}/i,
61
+ description: "System prompt injection",
62
+ severity: "critical",
63
+ },
64
+ {
65
+ pattern: /\[INST\]|\[\/INST\]/i,
66
+ description: "Instruction delimiter injection (Llama-style)",
67
+ severity: "high",
68
+ },
69
+ {
70
+ pattern: /<\|im_start\|>|<\|im_end\|>/i,
71
+ description: "Chat template injection",
72
+ severity: "high",
73
+ },
74
+ {
75
+ pattern: /###\s*(system|user|assistant)\s*:/i,
76
+ description: "Role delimiter injection",
77
+ severity: "high",
78
+ },
79
+ {
80
+ pattern: /pretend\s+(you('re)?|to\s+be)\s+(a|an|the)?\s*(different|new|another)/i,
81
+ description: "Identity manipulation attempt",
82
+ severity: "medium",
83
+ },
84
+ {
85
+ pattern: /act\s+as\s+(if\s+)?(you('re)?|a|an)\s*(unrestricted|unfiltered|jailbroken)/i,
86
+ description: "Jailbreak attempt",
87
+ severity: "critical",
88
+ },
89
+ {
90
+ pattern: /bypass\s+(your\s+)?(safety|security|restrictions?|filters?|guidelines?)/i,
91
+ description: "Safety bypass attempt",
92
+ severity: "critical",
93
+ },
94
+ {
95
+ pattern: /do\s+not\s+(follow|obey|respect)\s+(your\s+)?(rules?|guidelines?|instructions?)/i,
96
+ description: "Rule violation instruction",
97
+ severity: "high",
98
+ },
99
+ // Claude-specific patterns
100
+ {
101
+ pattern: /human\s*:\s*[^\n]{20,}/i,
102
+ description: "Human turn injection (Claude-style)",
103
+ severity: "high",
104
+ },
105
+ {
106
+ pattern: /assistant\s*:\s*[^\n]{20,}/i,
107
+ description: "Assistant turn injection (Claude-style)",
108
+ severity: "high",
109
+ },
110
+ ];
111
+ /**
112
+ * Suspicious URL patterns
113
+ */
114
+ const SUSPICIOUS_URL_PATTERNS = [
115
+ // URL shorteners (could hide malicious destinations)
116
+ { pattern: /https?:\/\/(bit\.ly|tinyurl\.com|t\.co|goo\.gl|ow\.ly|is\.gd|buff\.ly|adf\.ly|j\.mp)\//i, description: "URL shortener" },
117
+ // Paste/sharing services (data exfiltration)
118
+ { pattern: /https?:\/\/(pastebin\.com|hastebin\.com|paste\.ee|ghostbin\.com|dpaste\.org)\//i, description: "Paste service" },
119
+ // File sharing (potential malware)
120
+ { pattern: /https?:\/\/(anonfiles\.com|mediafire\.com|zippyshare\.com|sendspace\.com)\//i, description: "File sharing service" },
121
+ // Dangerous protocols
122
+ { pattern: /javascript:/i, description: "JavaScript protocol" },
123
+ { pattern: /data:/i, description: "Data protocol" },
124
+ { pattern: /file:\/\//i, description: "File protocol" },
125
+ { pattern: /vbscript:/i, description: "VBScript protocol" },
126
+ // IP addresses (potential C2)
127
+ { pattern: /https?:\/\/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/i, description: "Raw IP address URL" },
128
+ // Webhook URLs (data exfiltration)
129
+ { pattern: /https?:\/\/[^\/]*webhook/i, description: "Webhook URL" },
130
+ { pattern: /https?:\/\/[^\/]*discord(app)?\.com\/api\/webhooks/i, description: "Discord webhook" },
131
+ ];
132
+ /**
133
+ * Encoded payload patterns
134
+ */
135
+ const ENCODED_PAYLOAD_PATTERNS = [
136
+ // Base64 encoded data (long strings)
137
+ { pattern: /[A-Za-z0-9+\/]{100,}={0,2}/g, description: "Possible Base64 encoded data" },
138
+ // Hex encoded data
139
+ { pattern: /(?:0x)?[0-9a-fA-F]{40,}/g, description: "Possible hex encoded data" },
140
+ // URL encoded data
141
+ { pattern: /(?:%[0-9A-Fa-f]{2}){10,}/g, description: "Heavily URL encoded content" },
142
+ // Unicode escape sequences
143
+ { pattern: /(?:\\u[0-9A-Fa-f]{4}){5,}/g, description: "Unicode escape sequences" },
144
+ ];
145
+ /**
146
+ * Response Validator Class
147
+ */
148
+ export class ResponseValidator {
149
+ config;
150
+ stats = {
151
+ validated: 0,
152
+ blocked: 0,
153
+ warned: 0,
154
+ passed: 0,
155
+ };
156
+ constructor(config) {
157
+ this.config = { ...getValidatorConfig(), ...config };
158
+ }
159
+ /**
160
+ * Validate a response from NotebookLM
161
+ */
162
+ async validate(response) {
163
+ if (!this.config.enabled) {
164
+ return {
165
+ safe: true,
166
+ warnings: [],
167
+ blocked: [],
168
+ sanitized: response,
169
+ originalLength: response.length,
170
+ sanitizedLength: response.length,
171
+ };
172
+ }
173
+ this.stats.validated++;
174
+ const warnings = [];
175
+ const blocked = [];
176
+ let sanitized = response;
177
+ // Check for prompt injection
178
+ if (this.config.blockPromptInjection) {
179
+ const injectionResults = this.detectPromptInjection(response);
180
+ for (const result of injectionResults) {
181
+ if (result.severity === "critical" || result.severity === "high") {
182
+ blocked.push(`Prompt injection (${result.severity}): ${result.description}`);
183
+ // Redact the matched content
184
+ sanitized = sanitized.replace(result.match, "[REDACTED: prompt injection detected]");
185
+ }
186
+ else {
187
+ warnings.push(`Suspicious pattern (${result.severity}): ${result.description}`);
188
+ }
189
+ }
190
+ }
191
+ // Check for suspicious URLs
192
+ if (this.config.blockSuspiciousUrls) {
193
+ const urlResults = this.detectSuspiciousUrls(response);
194
+ for (const result of urlResults) {
195
+ if (this.config.allowedDomains.length > 0) {
196
+ // Check if URL is in allowed domains
197
+ const isAllowed = this.config.allowedDomains.some(domain => result.url.includes(domain));
198
+ if (isAllowed)
199
+ continue;
200
+ }
201
+ blocked.push(`Suspicious URL: ${result.description} - ${result.url.substring(0, 50)}`);
202
+ sanitized = sanitized.replace(result.url, "[REDACTED: suspicious URL]");
203
+ }
204
+ }
205
+ // Check for encoded payloads
206
+ const encodedResults = this.detectEncodedPayloads(response);
207
+ for (const result of encodedResults) {
208
+ if (this.config.blockEncodedPayloads) {
209
+ blocked.push(`Encoded payload: ${result.description}`);
210
+ sanitized = sanitized.replace(result.match, "[REDACTED: encoded payload]");
211
+ }
212
+ else if (this.config.warnOnSuspicious) {
213
+ warnings.push(`Encoded content detected: ${result.description}`);
214
+ }
215
+ }
216
+ // Determine if response is safe
217
+ const safe = blocked.length === 0;
218
+ // Update stats
219
+ if (!safe) {
220
+ this.stats.blocked++;
221
+ }
222
+ else if (warnings.length > 0) {
223
+ this.stats.warned++;
224
+ }
225
+ else {
226
+ this.stats.passed++;
227
+ }
228
+ // Audit if issues found
229
+ if (blocked.length > 0 || warnings.length > 0) {
230
+ await audit.security("response_validation", safe ? "warning" : "error", {
231
+ blocked_count: blocked.length,
232
+ warning_count: warnings.length,
233
+ blocked_reasons: blocked,
234
+ warnings: warnings,
235
+ original_length: response.length,
236
+ sanitized_length: sanitized.length,
237
+ });
238
+ if (!safe) {
239
+ log.warning(`🛡️ Response blocked: ${blocked.join(", ")}`);
240
+ }
241
+ else {
242
+ log.info(`⚠️ Response warnings: ${warnings.join(", ")}`);
243
+ }
244
+ }
245
+ return {
246
+ safe,
247
+ warnings,
248
+ blocked,
249
+ sanitized,
250
+ originalLength: response.length,
251
+ sanitizedLength: sanitized.length,
252
+ };
253
+ }
254
+ /**
255
+ * Detect prompt injection attempts in text
256
+ */
257
+ detectPromptInjection(text) {
258
+ const results = [];
259
+ for (const { pattern, description, severity } of PROMPT_INJECTION_PATTERNS) {
260
+ const match = text.match(pattern);
261
+ if (match) {
262
+ results.push({
263
+ pattern,
264
+ description,
265
+ severity,
266
+ match: match[0],
267
+ });
268
+ }
269
+ }
270
+ return results;
271
+ }
272
+ /**
273
+ * Detect suspicious URLs in text
274
+ */
275
+ detectSuspiciousUrls(text) {
276
+ const results = [];
277
+ for (const { pattern, description } of SUSPICIOUS_URL_PATTERNS) {
278
+ const matches = text.matchAll(new RegExp(pattern, "gi"));
279
+ for (const match of matches) {
280
+ results.push({
281
+ pattern,
282
+ description,
283
+ url: match[0],
284
+ });
285
+ }
286
+ }
287
+ return results;
288
+ }
289
+ /**
290
+ * Detect encoded payloads in text
291
+ */
292
+ detectEncodedPayloads(text) {
293
+ const results = [];
294
+ for (const { pattern, description } of ENCODED_PAYLOAD_PATTERNS) {
295
+ const matches = text.matchAll(pattern);
296
+ for (const match of matches) {
297
+ // Only flag if it's actually suspiciously long
298
+ if (match[0].length > 100) {
299
+ results.push({
300
+ pattern,
301
+ description,
302
+ match: match[0].substring(0, 50) + "...",
303
+ });
304
+ }
305
+ }
306
+ }
307
+ return results;
308
+ }
309
+ /**
310
+ * Get validation statistics
311
+ */
312
+ getStats() {
313
+ return { ...this.stats };
314
+ }
315
+ /**
316
+ * Reset statistics
317
+ */
318
+ resetStats() {
319
+ this.stats = {
320
+ validated: 0,
321
+ blocked: 0,
322
+ warned: 0,
323
+ passed: 0,
324
+ };
325
+ }
326
+ /**
327
+ * Update configuration
328
+ */
329
+ updateConfig(config) {
330
+ this.config = { ...this.config, ...config };
331
+ }
332
+ }
333
+ /**
334
+ * Global validator instance
335
+ */
336
+ let globalValidator = null;
337
+ /**
338
+ * Get or create the global response validator
339
+ */
340
+ export function getResponseValidator() {
341
+ if (!globalValidator) {
342
+ globalValidator = new ResponseValidator();
343
+ }
344
+ return globalValidator;
345
+ }
346
+ /**
347
+ * Convenience function to validate a response
348
+ */
349
+ export async function validateResponse(response) {
350
+ return getResponseValidator().validate(response);
351
+ }
352
+ //# sourceMappingURL=response-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"response-validator.js","sourceRoot":"","sources":["../../src/utils/response-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,126 @@
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
+ /**
20
+ * Secret detection result
21
+ */
22
+ export interface SecretMatch {
23
+ type: string;
24
+ pattern: string;
25
+ match: string;
26
+ redacted: string;
27
+ line?: number;
28
+ column?: number;
29
+ severity: "critical" | "high" | "medium" | "low";
30
+ }
31
+ /**
32
+ * Secret pattern definition
33
+ */
34
+ interface SecretPattern {
35
+ name: string;
36
+ pattern: RegExp;
37
+ severity: "critical" | "high" | "medium" | "low";
38
+ description: string;
39
+ redactFn?: (match: string) => string;
40
+ }
41
+ /**
42
+ * Secrets Scanner Configuration
43
+ */
44
+ export interface SecretsConfig {
45
+ /** Enable secrets scanning (default: true) */
46
+ enabled: boolean;
47
+ /** Block output containing secrets (default: false - just warn) */
48
+ blockOnDetection: boolean;
49
+ /** Auto-redact secrets in output (default: true) */
50
+ autoRedact: boolean;
51
+ /** Minimum severity to report (default: low) */
52
+ minSeverity: "critical" | "high" | "medium" | "low";
53
+ /** Custom patterns to add */
54
+ customPatterns: SecretPattern[];
55
+ /** Patterns to ignore (by name) */
56
+ ignoredPatterns: string[];
57
+ }
58
+ /**
59
+ * Secrets Scanner Class
60
+ */
61
+ export declare class SecretsScanner {
62
+ private config;
63
+ private patterns;
64
+ private stats;
65
+ constructor(config?: Partial<SecretsConfig>);
66
+ /**
67
+ * Scan text for secrets
68
+ */
69
+ scan(text: string): SecretMatch[];
70
+ /**
71
+ * Scan and optionally redact secrets
72
+ */
73
+ scanAndRedact(text: string): Promise<{
74
+ clean: string;
75
+ secrets: SecretMatch[];
76
+ blocked: boolean;
77
+ }>;
78
+ /**
79
+ * Default redaction function
80
+ */
81
+ private defaultRedact;
82
+ /**
83
+ * Add a custom pattern
84
+ */
85
+ addPattern(pattern: SecretPattern): void;
86
+ /**
87
+ * Ignore a pattern by name
88
+ */
89
+ ignorePattern(name: string): void;
90
+ /**
91
+ * Get scanning statistics
92
+ */
93
+ getStats(): typeof this.stats & {
94
+ patterns: number;
95
+ };
96
+ /**
97
+ * Reset statistics
98
+ */
99
+ resetStats(): void;
100
+ /**
101
+ * Update configuration
102
+ */
103
+ updateConfig(config: Partial<SecretsConfig>): void;
104
+ /**
105
+ * Check if scanning is enabled
106
+ */
107
+ isEnabled(): boolean;
108
+ }
109
+ /**
110
+ * Get or create the global secrets scanner
111
+ */
112
+ export declare function getSecretsScanner(): SecretsScanner;
113
+ /**
114
+ * Convenience function to scan text for secrets
115
+ */
116
+ export declare function scanForSecrets(text: string): SecretMatch[];
117
+ /**
118
+ * Convenience function to scan and redact secrets
119
+ */
120
+ export declare function scanAndRedactSecrets(text: string): Promise<{
121
+ clean: string;
122
+ secrets: SecretMatch[];
123
+ blocked: boolean;
124
+ }>;
125
+ export {};
126
+ //# sourceMappingURL=secrets-scanner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"secrets-scanner.d.ts","sourceRoot":"","sources":["../../src/utils/secrets-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAKH;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;CAClD;AAED;;GAEG;AACH,UAAU,aAAa;IACrB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;CACtC;AAiOD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,8CAA8C;IAC9C,OAAO,EAAE,OAAO,CAAC;IACjB,mEAAmE;IACnE,gBAAgB,EAAE,OAAO,CAAC;IAC1B,oDAAoD;IACpD,UAAU,EAAE,OAAO,CAAC;IACpB,gDAAgD;IAChD,WAAW,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACpD,6BAA6B;IAC7B,cAAc,EAAE,aAAa,EAAE,CAAC;IAChC,mCAAmC;IACnC,eAAe,EAAE,MAAM,EAAE,CAAC;CAC3B;AA2BD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,MAAM,CAAgB;IAC9B,OAAO,CAAC,QAAQ,CAAkB;IAClC,OAAO,CAAC,KAAK,CAKX;gBAEU,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC;IAO3C;;OAEG;IACH,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE;IAkDjC;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;QACzC,KAAK,EAAE,MAAM,CAAC;QACd,OAAO,EAAE,WAAW,EAAE,CAAC;QACvB,OAAO,EAAE,OAAO,CAAC;KAClB,CAAC;IA2DF;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,aAAa,GAAG,IAAI;IAKxC;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAKjC;;OAEG;IACH,QAAQ,IAAI,OAAO,IAAI,CAAC,KAAK,GAAG;QAAE,QAAQ,EAAE,MAAM,CAAA;KAAE;IAOpD;;OAEG;IACH,UAAU,IAAI,IAAI;IASlB;;OAEG;IACH,YAAY,CAAC,MAAM,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,IAAI;IAIlD;;OAEG;IACH,SAAS,IAAI,OAAO;CAGrB;AAOD;;GAEG;AACH,wBAAgB,iBAAiB,IAAI,cAAc,CAKlD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,EAAE,CAE1D;AAED;;GAEG;AACH,wBAAsB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAChE,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,OAAO,EAAE,OAAO,CAAC;CAClB,CAAC,CAED"}