@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,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"}
|