@dotsetlabs/tollgate 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +885 -0
- package/dist/analyzers/filesystem.d.ts +26 -0
- package/dist/analyzers/filesystem.d.ts.map +1 -0
- package/dist/analyzers/filesystem.js +284 -0
- package/dist/analyzers/filesystem.js.map +1 -0
- package/dist/analyzers/http.d.ts +90 -0
- package/dist/analyzers/http.d.ts.map +1 -0
- package/dist/analyzers/http.js +433 -0
- package/dist/analyzers/http.js.map +1 -0
- package/dist/analyzers/index.d.ts +101 -0
- package/dist/analyzers/index.d.ts.map +1 -0
- package/dist/analyzers/index.js +342 -0
- package/dist/analyzers/index.js.map +1 -0
- package/dist/analyzers/loader.d.ts +114 -0
- package/dist/analyzers/loader.d.ts.map +1 -0
- package/dist/analyzers/loader.js +184 -0
- package/dist/analyzers/loader.js.map +1 -0
- package/dist/analyzers/prompt-injection.d.ts +95 -0
- package/dist/analyzers/prompt-injection.d.ts.map +1 -0
- package/dist/analyzers/prompt-injection.js +725 -0
- package/dist/analyzers/prompt-injection.js.map +1 -0
- package/dist/analyzers/sdk.d.ts +230 -0
- package/dist/analyzers/sdk.d.ts.map +1 -0
- package/dist/analyzers/sdk.js +283 -0
- package/dist/analyzers/sdk.js.map +1 -0
- package/dist/analyzers/shell.d.ts +20 -0
- package/dist/analyzers/shell.d.ts.map +1 -0
- package/dist/analyzers/shell.js +297 -0
- package/dist/analyzers/shell.js.map +1 -0
- package/dist/analyzers/sql.d.ts +37 -0
- package/dist/analyzers/sql.d.ts.map +1 -0
- package/dist/analyzers/sql.js +455 -0
- package/dist/analyzers/sql.js.map +1 -0
- package/dist/analyzers/types.d.ts +117 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +46 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/approval/interactive.d.ts +72 -0
- package/dist/approval/interactive.d.ts.map +1 -0
- package/dist/approval/interactive.js +550 -0
- package/dist/approval/interactive.js.map +1 -0
- package/dist/approval/terminal.d.ts +59 -0
- package/dist/approval/terminal.d.ts.map +1 -0
- package/dist/approval/terminal.js +238 -0
- package/dist/approval/terminal.js.map +1 -0
- package/dist/approval/types.d.ts +66 -0
- package/dist/approval/types.d.ts.map +1 -0
- package/dist/approval/types.js +2 -0
- package/dist/approval/types.js.map +1 -0
- package/dist/audit/exporter.d.ts +138 -0
- package/dist/audit/exporter.d.ts.map +1 -0
- package/dist/audit/exporter.js +366 -0
- package/dist/audit/exporter.js.map +1 -0
- package/dist/audit/logger.d.ts +156 -0
- package/dist/audit/logger.d.ts.map +1 -0
- package/dist/audit/logger.js +406 -0
- package/dist/audit/logger.js.map +1 -0
- package/dist/audit/redaction.d.ts +110 -0
- package/dist/audit/redaction.d.ts.map +1 -0
- package/dist/audit/redaction.js +307 -0
- package/dist/audit/redaction.js.map +1 -0
- package/dist/audit/schema.d.ts +76 -0
- package/dist/audit/schema.d.ts.map +1 -0
- package/dist/audit/schema.js +122 -0
- package/dist/audit/schema.js.map +1 -0
- package/dist/cli/commands/doctor.d.ts +34 -0
- package/dist/cli/commands/doctor.d.ts.map +1 -0
- package/dist/cli/commands/doctor.js +431 -0
- package/dist/cli/commands/doctor.js.map +1 -0
- package/dist/cli/commands/export.d.ts +18 -0
- package/dist/cli/commands/export.d.ts.map +1 -0
- package/dist/cli/commands/export.js +63 -0
- package/dist/cli/commands/export.js.map +1 -0
- package/dist/cli/commands/init.d.ts +12 -0
- package/dist/cli/commands/init.d.ts.map +1 -0
- package/dist/cli/commands/init.js +102 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/logs.d.ts +11 -0
- package/dist/cli/commands/logs.d.ts.map +1 -0
- package/dist/cli/commands/logs.js +60 -0
- package/dist/cli/commands/logs.js.map +1 -0
- package/dist/cli/commands/scan.d.ts +29 -0
- package/dist/cli/commands/scan.d.ts.map +1 -0
- package/dist/cli/commands/scan.js +251 -0
- package/dist/cli/commands/scan.js.map +1 -0
- package/dist/cli/commands/serve.d.ts +26 -0
- package/dist/cli/commands/serve.d.ts.map +1 -0
- package/dist/cli/commands/serve.js +424 -0
- package/dist/cli/commands/serve.js.map +1 -0
- package/dist/cli/commands/start.d.ts +20 -0
- package/dist/cli/commands/start.d.ts.map +1 -0
- package/dist/cli/commands/start.js +82 -0
- package/dist/cli/commands/start.js.map +1 -0
- package/dist/cli/commands/stats.d.ts +10 -0
- package/dist/cli/commands/stats.d.ts.map +1 -0
- package/dist/cli/commands/stats.js +42 -0
- package/dist/cli/commands/stats.js.map +1 -0
- package/dist/cli/commands/templates.d.ts +26 -0
- package/dist/cli/commands/templates.d.ts.map +1 -0
- package/dist/cli/commands/templates.js +221 -0
- package/dist/cli/commands/templates.js.map +1 -0
- package/dist/cli/commands/validate.d.ts +12 -0
- package/dist/cli/commands/validate.d.ts.map +1 -0
- package/dist/cli/commands/validate.js +107 -0
- package/dist/cli/commands/validate.js.map +1 -0
- package/dist/cli/commands/wrap.d.ts +19 -0
- package/dist/cli/commands/wrap.d.ts.map +1 -0
- package/dist/cli/commands/wrap.js +59 -0
- package/dist/cli/commands/wrap.js.map +1 -0
- package/dist/cli/index.d.ts +17 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +202 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/ui.d.ts +139 -0
- package/dist/cli/ui.d.ts.map +1 -0
- package/dist/cli/ui.js +271 -0
- package/dist/cli/ui.js.map +1 -0
- package/dist/constants.d.ts +33 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +37 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +49 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +82 -0
- package/dist/index.js.map +1 -0
- package/dist/orchestrator/index.d.ts +11 -0
- package/dist/orchestrator/index.d.ts.map +1 -0
- package/dist/orchestrator/index.js +10 -0
- package/dist/orchestrator/index.js.map +1 -0
- package/dist/orchestrator/manager.d.ts +127 -0
- package/dist/orchestrator/manager.d.ts.map +1 -0
- package/dist/orchestrator/manager.js +498 -0
- package/dist/orchestrator/manager.js.map +1 -0
- package/dist/orchestrator/types.d.ts +141 -0
- package/dist/orchestrator/types.d.ts.map +1 -0
- package/dist/orchestrator/types.js +9 -0
- package/dist/orchestrator/types.js.map +1 -0
- package/dist/policy/engine.d.ts +55 -0
- package/dist/policy/engine.d.ts.map +1 -0
- package/dist/policy/engine.js +288 -0
- package/dist/policy/engine.js.map +1 -0
- package/dist/policy/natural-language.d.ts +141 -0
- package/dist/policy/natural-language.d.ts.map +1 -0
- package/dist/policy/natural-language.js +552 -0
- package/dist/policy/natural-language.js.map +1 -0
- package/dist/policy/parser.d.ts +141 -0
- package/dist/policy/parser.d.ts.map +1 -0
- package/dist/policy/parser.js +314 -0
- package/dist/policy/parser.js.map +1 -0
- package/dist/policy/types.d.ts +428 -0
- package/dist/policy/types.d.ts.map +1 -0
- package/dist/policy/types.js +32 -0
- package/dist/policy/types.js.map +1 -0
- package/dist/policy/validator.d.ts +72 -0
- package/dist/policy/validator.d.ts.map +1 -0
- package/dist/policy/validator.js +453 -0
- package/dist/policy/validator.js.map +1 -0
- package/dist/proxy/bridge.d.ts +84 -0
- package/dist/proxy/bridge.d.ts.map +1 -0
- package/dist/proxy/bridge.js +217 -0
- package/dist/proxy/bridge.js.map +1 -0
- package/dist/proxy/client.d.ts +130 -0
- package/dist/proxy/client.d.ts.map +1 -0
- package/dist/proxy/client.js +290 -0
- package/dist/proxy/client.js.map +1 -0
- package/dist/proxy/server.d.ts +111 -0
- package/dist/proxy/server.d.ts.map +1 -0
- package/dist/proxy/server.js +444 -0
- package/dist/proxy/server.js.map +1 -0
- package/dist/scanner.d.ts +91 -0
- package/dist/scanner.d.ts.map +1 -0
- package/dist/scanner.js +373 -0
- package/dist/scanner.js.map +1 -0
- package/dist/session/index.d.ts +32 -0
- package/dist/session/index.d.ts.map +1 -0
- package/dist/session/index.js +31 -0
- package/dist/session/index.js.map +1 -0
- package/dist/session/manager.d.ts +166 -0
- package/dist/session/manager.d.ts.map +1 -0
- package/dist/session/manager.js +454 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/session/sqlite-store.d.ts +54 -0
- package/dist/session/sqlite-store.d.ts.map +1 -0
- package/dist/session/sqlite-store.js +209 -0
- package/dist/session/sqlite-store.js.map +1 -0
- package/dist/session/types.d.ts +179 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +38 -0
- package/dist/session/types.js.map +1 -0
- package/dist/templates.d.ts +64 -0
- package/dist/templates.d.ts.map +1 -0
- package/dist/templates.js +451 -0
- package/dist/templates.js.map +1 -0
- package/dist/utils/config.d.ts +57 -0
- package/dist/utils/config.d.ts.map +1 -0
- package/dist/utils/config.js +104 -0
- package/dist/utils/config.js.map +1 -0
- package/dist/utils/errors.d.ts +18 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +35 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/logger.d.ts +144 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +300 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/wizard.d.ts +68 -0
- package/dist/wizard.d.ts.map +1 -0
- package/dist/wizard.js +395 -0
- package/dist/wizard.js.map +1 -0
- package/package.json +99 -0
|
@@ -0,0 +1,433 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* HTTP/API Request Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Classifies HTTP requests by risk level based on:
|
|
5
|
+
* - HTTP method (GET = read, POST/PUT = write, DELETE = destructive)
|
|
6
|
+
* - Target host (internal IPs, localhost, cloud metadata = dangerous)
|
|
7
|
+
* - Sensitive headers (Authorization, Cookie, API keys)
|
|
8
|
+
* - Dangerous protocols (file://, ftp://)
|
|
9
|
+
*
|
|
10
|
+
* This analyzer is designed to prevent:
|
|
11
|
+
* - Server-Side Request Forgery (SSRF) attacks
|
|
12
|
+
* - Unauthorized access to internal services
|
|
13
|
+
* - Credential leakage
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const analyzer = new HttpAnalyzer();
|
|
18
|
+
*
|
|
19
|
+
* // Analyze a URL string
|
|
20
|
+
* analyzer.analyze('https://api.example.com/users');
|
|
21
|
+
* // → { risk: 'read', reason: 'GET request to external host' }
|
|
22
|
+
*
|
|
23
|
+
* // Analyze a JSON-encoded request
|
|
24
|
+
* analyzer.analyze(JSON.stringify({
|
|
25
|
+
* url: 'https://api.example.com/users',
|
|
26
|
+
* method: 'POST',
|
|
27
|
+
* headers: { 'Content-Type': 'application/json' }
|
|
28
|
+
* }));
|
|
29
|
+
* // → { risk: 'write', reason: 'POST request to external host' }
|
|
30
|
+
*
|
|
31
|
+
* // Dangerous request detection
|
|
32
|
+
* analyzer.analyze('http://169.254.169.254/latest/meta-data/');
|
|
33
|
+
* // → { risk: 'dangerous', reason: 'SSRF: AWS metadata endpoint' }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
// ============================================================================
|
|
37
|
+
// HTTP Analyzer Implementation
|
|
38
|
+
// ============================================================================
|
|
39
|
+
/**
|
|
40
|
+
* HTTP/API Request Analyzer
|
|
41
|
+
*
|
|
42
|
+
* Analyzes HTTP requests and URLs to determine risk levels.
|
|
43
|
+
* Prevents SSRF attacks, credential leakage, and unauthorized access.
|
|
44
|
+
*/
|
|
45
|
+
export class HttpAnalyzer {
|
|
46
|
+
name = 'http';
|
|
47
|
+
// -------------------------------------------------------------------------
|
|
48
|
+
// SSRF Prevention Patterns
|
|
49
|
+
// -------------------------------------------------------------------------
|
|
50
|
+
/**
|
|
51
|
+
* Cloud metadata endpoints - critical SSRF targets
|
|
52
|
+
*/
|
|
53
|
+
METADATA_ENDPOINTS = [
|
|
54
|
+
{
|
|
55
|
+
pattern: /169\.254\.169\.254/,
|
|
56
|
+
risk: 'dangerous',
|
|
57
|
+
reason: 'SSRF: AWS/Azure metadata endpoint detected',
|
|
58
|
+
category: 'cloud_metadata',
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
pattern: /metadata\.google\.internal/i,
|
|
62
|
+
risk: 'dangerous',
|
|
63
|
+
reason: 'SSRF: GCP metadata endpoint detected',
|
|
64
|
+
category: 'cloud_metadata',
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
pattern: /100\.100\.100\.200/,
|
|
68
|
+
risk: 'dangerous',
|
|
69
|
+
reason: 'SSRF: Alibaba Cloud metadata endpoint detected',
|
|
70
|
+
category: 'cloud_metadata',
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
pattern: /169\.254\.170\.2/,
|
|
74
|
+
risk: 'dangerous',
|
|
75
|
+
reason: 'SSRF: AWS ECS container credentials endpoint',
|
|
76
|
+
category: 'cloud_metadata',
|
|
77
|
+
},
|
|
78
|
+
];
|
|
79
|
+
/**
|
|
80
|
+
* Internal/private IP ranges - SSRF and network access control
|
|
81
|
+
*/
|
|
82
|
+
INTERNAL_IP_PATTERNS = [
|
|
83
|
+
// Localhost variants
|
|
84
|
+
{
|
|
85
|
+
pattern: /^https?:\/\/localhost(:[0-9]+)?/i,
|
|
86
|
+
risk: 'dangerous',
|
|
87
|
+
reason: 'SSRF: Request to localhost',
|
|
88
|
+
category: 'internal_network',
|
|
89
|
+
},
|
|
90
|
+
{
|
|
91
|
+
pattern: /^https?:\/\/127\.[0-9]+\.[0-9]+\.[0-9]+/,
|
|
92
|
+
risk: 'dangerous',
|
|
93
|
+
reason: 'SSRF: Request to loopback address (127.x.x.x)',
|
|
94
|
+
category: 'internal_network',
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
pattern: /^https?:\/\/\[::1\]/,
|
|
98
|
+
risk: 'dangerous',
|
|
99
|
+
reason: 'SSRF: Request to IPv6 loopback',
|
|
100
|
+
category: 'internal_network',
|
|
101
|
+
},
|
|
102
|
+
// Full IPv6 loopback notation
|
|
103
|
+
{
|
|
104
|
+
pattern: /^https?:\/\/\[0:0:0:0:0:0:0:1\]/,
|
|
105
|
+
risk: 'dangerous',
|
|
106
|
+
reason: 'SSRF: Request to IPv6 loopback (expanded)',
|
|
107
|
+
category: 'internal_network',
|
|
108
|
+
},
|
|
109
|
+
// Mixed notation IPv6 loopback
|
|
110
|
+
{
|
|
111
|
+
pattern: /^https?:\/\/\[::ffff:127\.\d{1,3}\.\d{1,3}\.\d{1,3}\]/,
|
|
112
|
+
risk: 'dangerous',
|
|
113
|
+
reason: 'SSRF: Request to IPv4-mapped IPv6 loopback',
|
|
114
|
+
category: 'internal_network',
|
|
115
|
+
},
|
|
116
|
+
{
|
|
117
|
+
pattern: /^https?:\/\/0\.0\.0\.0/,
|
|
118
|
+
risk: 'dangerous',
|
|
119
|
+
reason: 'SSRF: Request to 0.0.0.0',
|
|
120
|
+
category: 'internal_network',
|
|
121
|
+
},
|
|
122
|
+
// Private IP ranges (RFC 1918)
|
|
123
|
+
{
|
|
124
|
+
pattern: /^https?:\/\/10\.[0-9]+\.[0-9]+\.[0-9]+/,
|
|
125
|
+
risk: 'dangerous',
|
|
126
|
+
reason: 'SSRF: Request to private IP range (10.x.x.x)',
|
|
127
|
+
category: 'internal_network',
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
pattern: /^https?:\/\/172\.(1[6-9]|2[0-9]|3[0-1])\.[0-9]+\.[0-9]+/,
|
|
131
|
+
risk: 'dangerous',
|
|
132
|
+
reason: 'SSRF: Request to private IP range (172.16-31.x.x)',
|
|
133
|
+
category: 'internal_network',
|
|
134
|
+
},
|
|
135
|
+
{
|
|
136
|
+
pattern: /^https?:\/\/192\.168\.[0-9]+\.[0-9]+/,
|
|
137
|
+
risk: 'dangerous',
|
|
138
|
+
reason: 'SSRF: Request to private IP range (192.168.x.x)',
|
|
139
|
+
category: 'internal_network',
|
|
140
|
+
},
|
|
141
|
+
// Link-local
|
|
142
|
+
{
|
|
143
|
+
pattern: /^https?:\/\/169\.254\.[0-9]+\.[0-9]+/,
|
|
144
|
+
risk: 'dangerous',
|
|
145
|
+
reason: 'SSRF: Request to link-local address',
|
|
146
|
+
category: 'internal_network',
|
|
147
|
+
},
|
|
148
|
+
// Octal IP notation (e.g., 0177.0.0.1 = 127.0.0.1)
|
|
149
|
+
{
|
|
150
|
+
pattern: /^https?:\/\/0[0-7]+\./,
|
|
151
|
+
risk: 'dangerous',
|
|
152
|
+
reason: 'SSRF: Octal IP notation detected (possible bypass attempt)',
|
|
153
|
+
category: 'internal_network',
|
|
154
|
+
},
|
|
155
|
+
// Hex IP notation (e.g., 0x7f.0x0.0x0.0x1 = 127.0.0.1)
|
|
156
|
+
{
|
|
157
|
+
pattern: /^https?:\/\/0x[0-9a-fA-F]+/,
|
|
158
|
+
risk: 'dangerous',
|
|
159
|
+
reason: 'SSRF: Hexadecimal IP notation detected (possible bypass attempt)',
|
|
160
|
+
category: 'internal_network',
|
|
161
|
+
},
|
|
162
|
+
// Decimal encoded IP (e.g., 2130706433 = 127.0.0.1)
|
|
163
|
+
{
|
|
164
|
+
pattern: /^https?:\/\/\d{8,10}(\/|:|$)/,
|
|
165
|
+
risk: 'dangerous',
|
|
166
|
+
reason: 'SSRF: Decimal encoded IP detected (possible bypass attempt)',
|
|
167
|
+
category: 'internal_network',
|
|
168
|
+
},
|
|
169
|
+
];
|
|
170
|
+
// -------------------------------------------------------------------------
|
|
171
|
+
// Dangerous Protocol Patterns
|
|
172
|
+
// -------------------------------------------------------------------------
|
|
173
|
+
DANGEROUS_PROTOCOLS = [
|
|
174
|
+
{
|
|
175
|
+
pattern: /^file:\/\//i,
|
|
176
|
+
risk: 'dangerous',
|
|
177
|
+
reason: 'Dangerous protocol: file:// - Local file access attempt',
|
|
178
|
+
category: 'dangerous_protocol',
|
|
179
|
+
},
|
|
180
|
+
{
|
|
181
|
+
pattern: /^ftp:\/\//i,
|
|
182
|
+
risk: 'destructive',
|
|
183
|
+
reason: 'Insecure protocol: ftp:// - Unencrypted file transfer',
|
|
184
|
+
category: 'dangerous_protocol',
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
pattern: /^gopher:\/\//i,
|
|
188
|
+
risk: 'dangerous',
|
|
189
|
+
reason: 'Dangerous protocol: gopher:// - Often used in SSRF attacks',
|
|
190
|
+
category: 'dangerous_protocol',
|
|
191
|
+
},
|
|
192
|
+
{
|
|
193
|
+
pattern: /^dict:\/\//i,
|
|
194
|
+
risk: 'dangerous',
|
|
195
|
+
reason: 'Dangerous protocol: dict:// - Often used in SSRF attacks',
|
|
196
|
+
category: 'dangerous_protocol',
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
pattern: /^ldap:\/\//i,
|
|
200
|
+
risk: 'dangerous',
|
|
201
|
+
reason: 'Dangerous protocol: ldap:// - Directory access',
|
|
202
|
+
category: 'dangerous_protocol',
|
|
203
|
+
},
|
|
204
|
+
];
|
|
205
|
+
// -------------------------------------------------------------------------
|
|
206
|
+
// Sensitive Header Patterns
|
|
207
|
+
// -------------------------------------------------------------------------
|
|
208
|
+
/**
|
|
209
|
+
* Headers that indicate sensitive operations.
|
|
210
|
+
* These don't block the request but elevate risk level.
|
|
211
|
+
*/
|
|
212
|
+
SENSITIVE_HEADERS = [
|
|
213
|
+
'authorization',
|
|
214
|
+
'x-api-key',
|
|
215
|
+
'x-auth-token',
|
|
216
|
+
'cookie',
|
|
217
|
+
'x-csrf-token',
|
|
218
|
+
'x-xsrf-token',
|
|
219
|
+
'proxy-authorization',
|
|
220
|
+
];
|
|
221
|
+
// -------------------------------------------------------------------------
|
|
222
|
+
// HTTP Method Risk Classification
|
|
223
|
+
// -------------------------------------------------------------------------
|
|
224
|
+
/**
|
|
225
|
+
* Maps HTTP methods to their base risk level.
|
|
226
|
+
*/
|
|
227
|
+
METHOD_RISK = {
|
|
228
|
+
// Safe methods - no side effects
|
|
229
|
+
OPTIONS: 'safe',
|
|
230
|
+
HEAD: 'safe',
|
|
231
|
+
TRACE: 'safe',
|
|
232
|
+
// Read methods
|
|
233
|
+
GET: 'read',
|
|
234
|
+
// Write methods
|
|
235
|
+
POST: 'write',
|
|
236
|
+
PUT: 'write',
|
|
237
|
+
PATCH: 'write',
|
|
238
|
+
// Destructive methods
|
|
239
|
+
DELETE: 'destructive',
|
|
240
|
+
};
|
|
241
|
+
// -------------------------------------------------------------------------
|
|
242
|
+
// Main Analysis Method
|
|
243
|
+
// -------------------------------------------------------------------------
|
|
244
|
+
analyze(input, context) {
|
|
245
|
+
// Parse the input (could be URL string or JSON object)
|
|
246
|
+
const request = this.parseInput(input, context);
|
|
247
|
+
if (!request.url) {
|
|
248
|
+
return {
|
|
249
|
+
risk: 'write',
|
|
250
|
+
reason: 'Could not parse URL from input',
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
// Check for dangerous protocols first
|
|
254
|
+
for (const { pattern, risk, reason, category } of this.DANGEROUS_PROTOCOLS) {
|
|
255
|
+
if (pattern.test(request.url)) {
|
|
256
|
+
return {
|
|
257
|
+
risk,
|
|
258
|
+
reason,
|
|
259
|
+
triggers: [category],
|
|
260
|
+
metadata: { category, url: this.sanitizeUrl(request.url) },
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
// Check for cloud metadata endpoints (highest priority SSRF targets)
|
|
265
|
+
for (const { pattern, risk, reason, category } of this.METADATA_ENDPOINTS) {
|
|
266
|
+
if (pattern.test(request.url)) {
|
|
267
|
+
return {
|
|
268
|
+
risk,
|
|
269
|
+
reason,
|
|
270
|
+
triggers: [category],
|
|
271
|
+
metadata: { category, url: this.sanitizeUrl(request.url) },
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
// Check for internal/private IPs
|
|
276
|
+
for (const { pattern, risk, reason, category } of this.INTERNAL_IP_PATTERNS) {
|
|
277
|
+
if (pattern.test(request.url)) {
|
|
278
|
+
return {
|
|
279
|
+
risk,
|
|
280
|
+
reason,
|
|
281
|
+
triggers: [category],
|
|
282
|
+
metadata: { category, url: this.sanitizeUrl(request.url) },
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
// Get base risk from HTTP method
|
|
287
|
+
const method = request.method.toUpperCase();
|
|
288
|
+
let baseRisk = this.METHOD_RISK[method] ?? 'write';
|
|
289
|
+
const triggers = [];
|
|
290
|
+
// Check for sensitive headers (elevates risk)
|
|
291
|
+
const sensitiveHeaders = this.detectSensitiveHeaders(request.headers);
|
|
292
|
+
if (sensitiveHeaders.length > 0) {
|
|
293
|
+
triggers.push('sensitive_headers');
|
|
294
|
+
// Elevate risk if we're sending credentials
|
|
295
|
+
if (baseRisk === 'safe') {
|
|
296
|
+
baseRisk = 'read';
|
|
297
|
+
}
|
|
298
|
+
else if (baseRisk === 'read') {
|
|
299
|
+
baseRisk = 'write';
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
// Build reason string
|
|
303
|
+
const hostInfo = this.extractHost(request.url);
|
|
304
|
+
let reason = `${method} request`;
|
|
305
|
+
if (hostInfo) {
|
|
306
|
+
reason += ` to ${hostInfo}`;
|
|
307
|
+
}
|
|
308
|
+
if (sensitiveHeaders.length > 0) {
|
|
309
|
+
reason += ` (includes ${sensitiveHeaders.join(', ')})`;
|
|
310
|
+
}
|
|
311
|
+
return {
|
|
312
|
+
risk: baseRisk,
|
|
313
|
+
reason,
|
|
314
|
+
triggers: triggers.length > 0 ? triggers : undefined,
|
|
315
|
+
metadata: {
|
|
316
|
+
method,
|
|
317
|
+
host: hostInfo,
|
|
318
|
+
hasSensitiveHeaders: sensitiveHeaders.length > 0,
|
|
319
|
+
},
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
// -------------------------------------------------------------------------
|
|
323
|
+
// Helper Methods
|
|
324
|
+
// -------------------------------------------------------------------------
|
|
325
|
+
/**
|
|
326
|
+
* Parses input into a structured request object.
|
|
327
|
+
* Accepts either a URL string or a JSON-encoded request object.
|
|
328
|
+
*/
|
|
329
|
+
parseInput(input, context) {
|
|
330
|
+
const trimmed = input.trim();
|
|
331
|
+
// Try to parse as JSON first
|
|
332
|
+
if (trimmed.startsWith('{')) {
|
|
333
|
+
try {
|
|
334
|
+
const parsed = JSON.parse(trimmed);
|
|
335
|
+
return {
|
|
336
|
+
url: String(parsed.url ?? parsed.uri ?? ''),
|
|
337
|
+
method: String(parsed.method ?? 'GET').toUpperCase(),
|
|
338
|
+
headers: this.normalizeHeaders(parsed.headers),
|
|
339
|
+
body: parsed.body ? String(parsed.body) : undefined,
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
catch {
|
|
343
|
+
// Not valid JSON, treat as URL
|
|
344
|
+
}
|
|
345
|
+
}
|
|
346
|
+
// Infer method from context if available
|
|
347
|
+
const method = this.inferMethod(context?.tool);
|
|
348
|
+
// Treat as URL string
|
|
349
|
+
return {
|
|
350
|
+
url: trimmed,
|
|
351
|
+
method,
|
|
352
|
+
headers: {},
|
|
353
|
+
};
|
|
354
|
+
}
|
|
355
|
+
/**
|
|
356
|
+
* Normalizes headers object to lowercase keys.
|
|
357
|
+
*/
|
|
358
|
+
normalizeHeaders(headers) {
|
|
359
|
+
if (!headers || typeof headers !== 'object') {
|
|
360
|
+
return {};
|
|
361
|
+
}
|
|
362
|
+
const normalized = {};
|
|
363
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
364
|
+
normalized[key.toLowerCase()] = String(value);
|
|
365
|
+
}
|
|
366
|
+
return normalized;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* Infers HTTP method from tool name.
|
|
370
|
+
*/
|
|
371
|
+
inferMethod(tool) {
|
|
372
|
+
if (!tool)
|
|
373
|
+
return 'GET';
|
|
374
|
+
const lowerTool = tool.toLowerCase();
|
|
375
|
+
if (lowerTool.includes('delete') || lowerTool.includes('remove')) {
|
|
376
|
+
return 'DELETE';
|
|
377
|
+
}
|
|
378
|
+
if (lowerTool.includes('post') || lowerTool.includes('create') || lowerTool.includes('send')) {
|
|
379
|
+
return 'POST';
|
|
380
|
+
}
|
|
381
|
+
if (lowerTool.includes('put') || lowerTool.includes('update') || lowerTool.includes('replace')) {
|
|
382
|
+
return 'PUT';
|
|
383
|
+
}
|
|
384
|
+
if (lowerTool.includes('patch') || lowerTool.includes('modify')) {
|
|
385
|
+
return 'PATCH';
|
|
386
|
+
}
|
|
387
|
+
return 'GET';
|
|
388
|
+
}
|
|
389
|
+
/**
|
|
390
|
+
* Detects sensitive headers in the request.
|
|
391
|
+
*/
|
|
392
|
+
detectSensitiveHeaders(headers) {
|
|
393
|
+
const found = [];
|
|
394
|
+
for (const headerName of Object.keys(headers)) {
|
|
395
|
+
const lowerName = headerName.toLowerCase();
|
|
396
|
+
if (this.SENSITIVE_HEADERS.includes(lowerName)) {
|
|
397
|
+
found.push(headerName);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
return found;
|
|
401
|
+
}
|
|
402
|
+
/**
|
|
403
|
+
* Extracts host from URL for display.
|
|
404
|
+
*/
|
|
405
|
+
extractHost(url) {
|
|
406
|
+
try {
|
|
407
|
+
const parsed = new URL(url);
|
|
408
|
+
return parsed.host;
|
|
409
|
+
}
|
|
410
|
+
catch {
|
|
411
|
+
// Try to extract host with regex for malformed URLs
|
|
412
|
+
const match = url.match(/^https?:\/\/([^/:]+)/i);
|
|
413
|
+
return match?.[1] ?? null;
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
/**
|
|
417
|
+
* Sanitizes URL for safe logging (removes credentials).
|
|
418
|
+
*/
|
|
419
|
+
sanitizeUrl(url) {
|
|
420
|
+
try {
|
|
421
|
+
const parsed = new URL(url);
|
|
422
|
+
// Remove username and password
|
|
423
|
+
parsed.username = '';
|
|
424
|
+
parsed.password = '';
|
|
425
|
+
return parsed.toString();
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
// Return as-is if parsing fails
|
|
429
|
+
return url;
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
//# sourceMappingURL=http.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/analyzers/http.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
export * from './types.js';
|
|
2
|
+
export { SqlAnalyzer } from './sql.js';
|
|
3
|
+
export { FilesystemAnalyzer } from './filesystem.js';
|
|
4
|
+
export { ShellAnalyzer } from './shell.js';
|
|
5
|
+
export { HttpAnalyzer } from './http.js';
|
|
6
|
+
export { PromptInjectionAnalyzer } from './prompt-injection.js';
|
|
7
|
+
export { defineAnalyzer, defineAsyncAnalyzer, createPatternAnalyzer, isCustomAnalyzer, isAsyncAnalyzer, type AnalyzerDefinition, type CustomAnalyzer, } from './sdk.js';
|
|
8
|
+
export { loadAnalyzer, loadAnalyzers, loadAnalyzersFromConfig, initializeAnalyzers, cleanupAnalyzers, unloadAnalyzer, listCustomAnalyzers, resolveAnalyzerPath, type LoadResult, type LoaderOptions, } from './loader.js';
|
|
9
|
+
import type { ContentAnalyzer, AnalysisResult, AnalyzerContext, RiskMapping, RiskLevel } from './types.js';
|
|
10
|
+
/** Concrete policy actions (excludes 'smart' which is resolved to one of these) */
|
|
11
|
+
export type ConcreteAction = 'allow' | 'deny' | 'prompt';
|
|
12
|
+
/**
|
|
13
|
+
* Registry of all available analyzers
|
|
14
|
+
*/
|
|
15
|
+
export declare class AnalyzerRegistry {
|
|
16
|
+
private analyzers;
|
|
17
|
+
private customAnalyzers;
|
|
18
|
+
private timeoutMs;
|
|
19
|
+
constructor(timeoutMs?: number);
|
|
20
|
+
/**
|
|
21
|
+
* Register a new analyzer
|
|
22
|
+
*/
|
|
23
|
+
register(analyzer: ContentAnalyzer): void;
|
|
24
|
+
/**
|
|
25
|
+
* Unregister an analyzer by name
|
|
26
|
+
*/
|
|
27
|
+
unregister(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Get an analyzer by name
|
|
30
|
+
*/
|
|
31
|
+
get(name: string): ContentAnalyzer | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Check if an analyzer exists
|
|
34
|
+
*/
|
|
35
|
+
has(name: string): boolean;
|
|
36
|
+
/**
|
|
37
|
+
* List all registered analyzer names
|
|
38
|
+
*/
|
|
39
|
+
list(): string[];
|
|
40
|
+
/**
|
|
41
|
+
* List only custom (non-built-in) analyzer names
|
|
42
|
+
*/
|
|
43
|
+
listCustom(): string[];
|
|
44
|
+
/**
|
|
45
|
+
* Set the timeout for analyzer operations.
|
|
46
|
+
*/
|
|
47
|
+
setTimeout(timeoutMs: number): void;
|
|
48
|
+
/**
|
|
49
|
+
* Get the current timeout for analyzer operations.
|
|
50
|
+
*/
|
|
51
|
+
getTimeout(): number;
|
|
52
|
+
/**
|
|
53
|
+
* Analyze content with a specific analyzer
|
|
54
|
+
*/
|
|
55
|
+
analyze(analyzerName: string, content: string, context?: AnalyzerContext): AnalysisResult;
|
|
56
|
+
/**
|
|
57
|
+
* Analyze content with a specific analyzer with timeout protection.
|
|
58
|
+
* Returns a 'dangerous' result if the analysis times out.
|
|
59
|
+
*
|
|
60
|
+
* @param analyzerName - Name of the analyzer to use
|
|
61
|
+
* @param content - Content to analyze
|
|
62
|
+
* @param context - Optional analyzer context
|
|
63
|
+
* @param timeoutMs - Optional timeout override (defaults to registry timeout)
|
|
64
|
+
*/
|
|
65
|
+
analyzeWithTimeout(analyzerName: string, content: string, context?: AnalyzerContext, timeoutMs?: number): Promise<AnalysisResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Analyze content with a specific analyzer (async version)
|
|
68
|
+
* Supports both sync and async analyzers
|
|
69
|
+
*/
|
|
70
|
+
analyzeAsync(analyzerName: string, content: string, context?: AnalyzerContext): Promise<AnalysisResult>;
|
|
71
|
+
/**
|
|
72
|
+
* Initialize all custom analyzers
|
|
73
|
+
*/
|
|
74
|
+
initializeCustomAnalyzers(): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* Cleanup all custom analyzers
|
|
77
|
+
*/
|
|
78
|
+
cleanupCustomAnalyzers(): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Get custom content extraction function for an analyzer
|
|
81
|
+
*/
|
|
82
|
+
getContentExtractor(analyzerName: string): ((tool: string, args: Record<string, unknown>) => string | null) | undefined;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Convert a risk level to a concrete policy action using a risk mapping
|
|
86
|
+
*/
|
|
87
|
+
export declare function riskToAction(risk: RiskLevel, mapping?: RiskMapping): ConcreteAction;
|
|
88
|
+
/**
|
|
89
|
+
* Global analyzer registry instance
|
|
90
|
+
*/
|
|
91
|
+
export declare const analyzerRegistry: AnalyzerRegistry;
|
|
92
|
+
/**
|
|
93
|
+
* Helper to determine which analyzer to use based on tool/server
|
|
94
|
+
*/
|
|
95
|
+
export declare function inferAnalyzer(server: string, tool: string, _args?: Record<string, unknown>): string | null;
|
|
96
|
+
/**
|
|
97
|
+
* Extract the content to analyze from tool arguments.
|
|
98
|
+
* First checks if the analyzer has a custom extractor, then falls back to built-in extraction.
|
|
99
|
+
*/
|
|
100
|
+
export declare function extractAnalyzableContent(analyzerName: string, tool: string, args: Record<string, unknown>): string | null;
|
|
101
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/analyzers/index.ts"],"names":[],"mappings":"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"}
|