@guardcore/core 1.0.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.
@@ -0,0 +1,256 @@
1
+ // src/utils.ts
2
+ import * as ipaddr from "ipaddr.js";
3
+ var EXCLUDED_HEADERS = /* @__PURE__ */ new Set([
4
+ "host",
5
+ "user-agent",
6
+ "accept",
7
+ "accept-encoding",
8
+ "connection",
9
+ "origin",
10
+ "referer",
11
+ "sec-fetch-site",
12
+ "sec-fetch-mode",
13
+ "sec-fetch-dest",
14
+ "sec-ch-ua",
15
+ "sec-ch-ua-mobile",
16
+ "sec-ch-ua-platform"
17
+ ]);
18
+ function sanitizeForLog(value) {
19
+ return value.replace(/\n/g, "\\n").replace(/\r/g, "\\r").replace(/\t/g, "\\t").replace(
20
+ /[\x00-\x08\x0b\x0c\x0e-\x1f]/g,
21
+ (ch) => `\\x${ch.charCodeAt(0).toString(16).padStart(2, "0")}`
22
+ );
23
+ }
24
+ async function sendAgentEvent(agentHandler, eventType, ipAddress, actionTaken, reason, request, metadata) {
25
+ if (!agentHandler) return;
26
+ try {
27
+ await agentHandler.sendEvent({
28
+ timestamp: /* @__PURE__ */ new Date(),
29
+ eventType,
30
+ ipAddress,
31
+ actionTaken,
32
+ reason,
33
+ endpoint: request?.urlPath ?? null,
34
+ method: request?.method ?? null,
35
+ userAgent: request?.headers["user-agent"] ?? null,
36
+ metadata: metadata ?? {}
37
+ });
38
+ } catch {
39
+ }
40
+ }
41
+ function isTrustedProxy(connectingIp, trustedProxies) {
42
+ for (const proxy of trustedProxies) {
43
+ if (!proxy.includes("/")) {
44
+ if (connectingIp === proxy) return true;
45
+ } else {
46
+ try {
47
+ const parsed = ipaddr.parse(connectingIp);
48
+ const [addr, prefixLen] = ipaddr.parseCIDR(proxy);
49
+ if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) return true;
50
+ } catch {
51
+ continue;
52
+ }
53
+ }
54
+ }
55
+ return false;
56
+ }
57
+ function extractFromForwardedHeader(forwardedFor, proxyDepth) {
58
+ const ips = forwardedFor.split(",").map((ip) => ip.trim()).filter(Boolean);
59
+ if (ips.length === 0) return null;
60
+ const targetIndex = ips.length - proxyDepth;
61
+ if (targetIndex < 0) return ips[0];
62
+ return ips[targetIndex];
63
+ }
64
+ async function extractClientIp(request, config, agentHandler) {
65
+ const connectingIp = request.clientHost;
66
+ if (!connectingIp) return "unknown";
67
+ const forwardedFor = request.headers["x-forwarded-for"] ?? null;
68
+ if (forwardedFor && config.trustedProxies.length === 0) {
69
+ await sendAgentEvent(
70
+ agentHandler ?? null,
71
+ "suspicious_request",
72
+ connectingIp,
73
+ "spoofing_detected",
74
+ "X-Forwarded-For received from untrusted source",
75
+ request
76
+ );
77
+ return connectingIp;
78
+ }
79
+ if (forwardedFor && config.trustedProxies.length > 0 && isTrustedProxy(connectingIp, config.trustedProxies)) {
80
+ const extracted = extractFromForwardedHeader(forwardedFor, config.trustedProxyDepth);
81
+ if (extracted && ipaddr.isValid(extracted)) return extracted;
82
+ }
83
+ return connectingIp;
84
+ }
85
+ async function isUserAgentAllowed(userAgent, config) {
86
+ for (const pattern of config.blockedUserAgents) {
87
+ if (new RegExp(pattern, "i").test(userAgent)) return false;
88
+ }
89
+ return true;
90
+ }
91
+ async function checkIpCountry(ip, config, geoIpHandler) {
92
+ if (config.blockedCountries.length === 0 && config.whitelistCountries.length === 0) {
93
+ return false;
94
+ }
95
+ if (!geoIpHandler.isInitialized) {
96
+ await geoIpHandler.initialize();
97
+ }
98
+ const country = geoIpHandler.getCountry(ip);
99
+ if (!country) return false;
100
+ if (config.whitelistCountries.length > 0) {
101
+ return !config.whitelistCountries.includes(country);
102
+ }
103
+ if (config.blockedCountries.length > 0) {
104
+ return config.blockedCountries.includes(country);
105
+ }
106
+ return false;
107
+ }
108
+ async function isIpAllowed(ip, config, geoIpHandler) {
109
+ try {
110
+ const parsed = ipaddr.parse(ip);
111
+ for (const blocked of config.blacklist) {
112
+ if (blocked.includes("/")) {
113
+ const [addr, prefixLen] = ipaddr.parseCIDR(blocked);
114
+ if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) return false;
115
+ } else if (ip === blocked) {
116
+ return false;
117
+ }
118
+ }
119
+ if (config.whitelist && config.whitelist.length > 0) {
120
+ let found = false;
121
+ for (const allowed of config.whitelist) {
122
+ if (allowed.includes("/")) {
123
+ const [addr, prefixLen] = ipaddr.parseCIDR(allowed);
124
+ if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) {
125
+ found = true;
126
+ break;
127
+ }
128
+ } else if (ip === allowed) {
129
+ found = true;
130
+ break;
131
+ }
132
+ }
133
+ if (!found) return false;
134
+ }
135
+ if (geoIpHandler) {
136
+ const blocked = await checkIpCountry(ip, config, geoIpHandler);
137
+ if (blocked) return false;
138
+ }
139
+ } catch {
140
+ return false;
141
+ }
142
+ return true;
143
+ }
144
+ async function detectPenetrationAttempt(request) {
145
+ const { SusPatternsManager } = await import("./sus-patterns-YZFPGJEF.js");
146
+ const clientIp = request.clientHost ?? "unknown";
147
+ const correlationId = `${clientIp}:${Date.now()}`;
148
+ const queryString = Object.entries(request.queryParams).map(([k, v]) => `${k}=${v}`).join("&");
149
+ if (queryString) {
150
+ const result = await checkRequestComponent(queryString, "query_param", "query_params", clientIp, correlationId);
151
+ if (result[0]) return result;
152
+ }
153
+ const urlPath = request.urlPath;
154
+ if (urlPath && urlPath !== "/") {
155
+ const result = await checkRequestComponent(urlPath, "url_path", "url_path", clientIp, correlationId);
156
+ if (result[0]) return result;
157
+ }
158
+ for (const [headerName, headerValue] of Object.entries(request.headers)) {
159
+ if (EXCLUDED_HEADERS.has(headerName.toLowerCase())) continue;
160
+ if (headerName.toLowerCase().startsWith("sec-")) continue;
161
+ const result = await checkRequestComponent(headerValue, "header", `header:${headerName}`, clientIp, correlationId);
162
+ if (result[0]) return result;
163
+ }
164
+ try {
165
+ const bodyBytes = await request.body();
166
+ if (bodyBytes.length > 0) {
167
+ const bodyText = new TextDecoder().decode(bodyBytes);
168
+ if (bodyText.trim()) {
169
+ const result = await checkRequestComponent(bodyText, "request_body", "body", clientIp, correlationId);
170
+ if (result[0]) return result;
171
+ }
172
+ }
173
+ } catch {
174
+ }
175
+ return [false, ""];
176
+ }
177
+ async function checkRequestComponent(value, context, componentName, clientIp, correlationId) {
178
+ try {
179
+ const result = await checkValueEnhanced(value, context, clientIp, correlationId);
180
+ if (result[0]) {
181
+ return [true, `Suspicious ${componentName}: ${result[1]}`];
182
+ }
183
+ } catch {
184
+ }
185
+ return [false, ""];
186
+ }
187
+ async function checkValueEnhanced(value, context, clientIp, correlationId) {
188
+ const { SusPatternsManager } = await import("./sus-patterns-YZFPGJEF.js");
189
+ try {
190
+ const jsonData = JSON.parse(value);
191
+ if (typeof jsonData === "object" && jsonData !== null) {
192
+ const result = await checkJsonFields(jsonData, context, clientIp, correlationId);
193
+ if (result[0]) return result;
194
+ }
195
+ } catch {
196
+ }
197
+ const dangerousPatterns = [
198
+ /<script/i,
199
+ /javascript:/i,
200
+ /UNION\s+SELECT/i,
201
+ /\.\.\//,
202
+ /eval\s*\(/i,
203
+ /exec\s*\(/i,
204
+ /system\s*\(/i
205
+ ];
206
+ for (const pattern of dangerousPatterns) {
207
+ if (pattern.test(value)) {
208
+ return [true, `Pattern match: ${pattern.source}`];
209
+ }
210
+ }
211
+ return [false, ""];
212
+ }
213
+ async function checkJsonFields(data, context, clientIp, correlationId) {
214
+ for (const [key, val] of Object.entries(data)) {
215
+ if (typeof val === "string") {
216
+ const result = await checkValueEnhanced(val, context, clientIp, correlationId);
217
+ if (result[0]) return [true, `JSON field '${key}': ${result[1]}`];
218
+ } else if (typeof val === "object" && val !== null && !Array.isArray(val)) {
219
+ const result = await checkJsonFields(val, context, clientIp, correlationId);
220
+ if (result[0]) return result;
221
+ }
222
+ }
223
+ return [false, ""];
224
+ }
225
+ function logActivity(request, logger, logType = "request", reason = "", passiveMode = false, triggerInfo = "", level = "WARNING") {
226
+ if (!level) return;
227
+ const clientIp = request.clientHost ?? "unknown";
228
+ const method = request.method;
229
+ const url = sanitizeForLog(request.urlPath);
230
+ const userAgent = sanitizeForLog(request.headers["user-agent"] ?? "");
231
+ let message;
232
+ if (logType === "request") {
233
+ message = `Request from ${clientIp}: ${method} ${url} [UA: ${userAgent}]`;
234
+ } else if (logType === "suspicious") {
235
+ const prefix = passiveMode ? "[PASSIVE MODE]" : "";
236
+ const trigger = triggerInfo ? ` | Trigger: ${triggerInfo}` : "";
237
+ message = `${prefix} Suspicious request from ${clientIp}: ${method} ${url} - ${reason}${trigger}`;
238
+ } else {
239
+ message = `${logType} from ${clientIp}: ${method} ${url} - ${reason}`;
240
+ }
241
+ const levelLower = level.toLowerCase();
242
+ const logMethod = levelLower === "warning" ? "warn" : levelLower === "critical" ? "error" : levelLower === "debug" ? "debug" : levelLower === "error" ? "error" : "info";
243
+ logger[logMethod](message);
244
+ }
245
+
246
+ export {
247
+ sanitizeForLog,
248
+ sendAgentEvent,
249
+ extractClientIp,
250
+ isUserAgentAllowed,
251
+ checkIpCountry,
252
+ isIpAllowed,
253
+ detectPenetrationAttempt,
254
+ logActivity
255
+ };
256
+ //# sourceMappingURL=chunk-4HBVN5N7.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils.ts"],"sourcesContent":["import * as ipaddr from 'ipaddr.js';\n\nimport type { ResolvedSecurityConfig } from './models/config.js';\nimport type { Logger } from './models/logger.js';\nimport type { AgentHandlerProtocol } from './protocols/agent.js';\nimport type { GeoIPHandler } from './protocols/geo-ip.js';\nimport type { GuardRequest } from './protocols/request.js';\n\nconst EXCLUDED_HEADERS = new Set([\n 'host', 'user-agent', 'accept', 'accept-encoding', 'connection',\n 'origin', 'referer', 'sec-fetch-site', 'sec-fetch-mode', 'sec-fetch-dest',\n 'sec-ch-ua', 'sec-ch-ua-mobile', 'sec-ch-ua-platform',\n]);\n\nexport function sanitizeForLog(value: string): string {\n return value\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/\\t/g, '\\\\t')\n .replace(/[\\x00-\\x08\\x0b\\x0c\\x0e-\\x1f]/g, (ch) =>\n `\\\\x${ch.charCodeAt(0).toString(16).padStart(2, '0')}`,\n );\n}\n\nexport async function sendAgentEvent(\n agentHandler: AgentHandlerProtocol | null,\n eventType: string,\n ipAddress: string,\n actionTaken: string,\n reason: string,\n request?: GuardRequest | null,\n metadata?: Record<string, unknown>,\n): Promise<void> {\n if (!agentHandler) return;\n\n /* v8 ignore start -- agent event dispatch; tests pass null agentHandler so this block is unreachable */\n try {\n await agentHandler.sendEvent({\n timestamp: new Date(),\n eventType,\n ipAddress,\n actionTaken,\n reason,\n endpoint: request?.urlPath ?? null,\n method: request?.method ?? null,\n userAgent: request?.headers['user-agent'] ?? null,\n metadata: metadata ?? {},\n });\n } catch {\n }\n /* v8 ignore stop */\n}\n\nfunction isTrustedProxy(connectingIp: string, trustedProxies: string[]): boolean {\n for (const proxy of trustedProxies) {\n if (!proxy.includes('/')) {\n /* v8 ignore next -- exact proxy IP match; tests use CIDR proxies */\n if (connectingIp === proxy) return true;\n } else {\n try {\n const parsed = ipaddr.parse(connectingIp);\n const [addr, prefixLen] = ipaddr.parseCIDR(proxy);\n if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) return true;\n } catch { continue; }\n }\n }\n /* v8 ignore start -- isTrustedProxy default return; tests always match a proxy */\n return false;\n}\n/* v8 ignore stop */\n\nfunction extractFromForwardedHeader(forwardedFor: string, proxyDepth: number): string | null {\n const ips = forwardedFor.split(',').map((ip) => ip.trim()).filter(Boolean);\n if (ips.length === 0) return null;\n const targetIndex = ips.length - proxyDepth;\n if (targetIndex < 0) return ips[0];\n return ips[targetIndex];\n}\n\nexport async function extractClientIp(\n request: GuardRequest,\n config: ResolvedSecurityConfig,\n agentHandler?: AgentHandlerProtocol | null,\n): Promise<string> {\n const connectingIp = request.clientHost;\n if (!connectingIp) return 'unknown';\n\n const forwardedFor = request.headers['x-forwarded-for'] ?? null;\n\n if (forwardedFor && config.trustedProxies.length === 0) {\n await sendAgentEvent(\n agentHandler ?? null, 'suspicious_request', connectingIp,\n 'spoofing_detected', 'X-Forwarded-For received from untrusted source',\n request,\n );\n return connectingIp;\n }\n\n if (\n forwardedFor &&\n config.trustedProxies.length > 0 &&\n isTrustedProxy(connectingIp, config.trustedProxies)\n ) {\n const extracted = extractFromForwardedHeader(forwardedFor, config.trustedProxyDepth);\n if (extracted && ipaddr.isValid(extracted)) return extracted;\n }\n\n return connectingIp;\n}\n\nexport async function isUserAgentAllowed(\n userAgent: string,\n config: ResolvedSecurityConfig,\n): Promise<boolean> {\n for (const pattern of config.blockedUserAgents) {\n if (new RegExp(pattern, 'i').test(userAgent)) return false;\n }\n return true;\n}\n\nexport async function checkIpCountry(\n ip: string,\n config: ResolvedSecurityConfig,\n geoIpHandler: GeoIPHandler,\n): Promise<boolean> {\n if (config.blockedCountries.length === 0 && config.whitelistCountries.length === 0) {\n return false;\n }\n\n if (!geoIpHandler.isInitialized) {\n await geoIpHandler.initialize();\n }\n\n const country = geoIpHandler.getCountry(ip);\n if (!country) return false;\n\n if (config.whitelistCountries.length > 0) {\n return !config.whitelistCountries.includes(country);\n }\n\n if (config.blockedCountries.length > 0) {\n return config.blockedCountries.includes(country);\n }\n\n /* v8 ignore start -- default return when no country rules configured; tests always set country rules */\n return false;\n}\n/* v8 ignore stop */\n\nexport async function isIpAllowed(\n ip: string,\n config: ResolvedSecurityConfig,\n geoIpHandler?: GeoIPHandler | null,\n): Promise<boolean> {\n try {\n const parsed = ipaddr.parse(ip);\n\n for (const blocked of config.blacklist) {\n if (blocked.includes('/')) {\n const [addr, prefixLen] = ipaddr.parseCIDR(blocked);\n if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) return false;\n } else if (ip === blocked) {\n return false;\n }\n }\n\n if (config.whitelist && config.whitelist.length > 0) {\n let found = false;\n for (const allowed of config.whitelist) {\n /* v8 ignore start -- whitelist CIDR parse + match; tests use exact IPs not CIDR in whitelist */\n if (allowed.includes('/')) {\n const [addr, prefixLen] = ipaddr.parseCIDR(allowed);\n if (parsed.kind() === addr.kind() && parsed.match([addr, prefixLen])) { found = true; break; }\n /* v8 ignore stop */\n } else if (ip === allowed) {\n found = true; break;\n }\n }\n if (!found) return false;\n }\n\n /* v8 ignore start -- geoIpHandler branch unreachable in recursive JSON check because dangerousPatterns check returns first */\n if (geoIpHandler) {\n const blocked = await checkIpCountry(ip, config, geoIpHandler);\n if (blocked) return false;\n }\n /* v8 ignore stop */\n } catch {\n return false;\n }\n\n return true;\n}\n\nexport async function detectPenetrationAttempt(\n request: GuardRequest,\n): Promise<[boolean, string]> {\n const { SusPatternsManager } = await import('./handlers/sus-patterns.js');\n\n const clientIp = request.clientHost ?? 'unknown';\n const correlationId = `${clientIp}:${Date.now()}`;\n\n const queryString = Object.entries(request.queryParams)\n .map(([k, v]) => `${k}=${v}`)\n .join('&');\n\n if (queryString) {\n const result = await checkRequestComponent(queryString, 'query_param', 'query_params', clientIp, correlationId);\n if (result[0]) return result;\n }\n\n const urlPath = request.urlPath;\n if (urlPath && urlPath !== '/') {\n const result = await checkRequestComponent(urlPath, 'url_path', 'url_path', clientIp, correlationId);\n if (result[0]) return result;\n }\n\n for (const [headerName, headerValue] of Object.entries(request.headers)) {\n if (EXCLUDED_HEADERS.has(headerName.toLowerCase())) continue;\n if (headerName.toLowerCase().startsWith('sec-')) continue;\n const result = await checkRequestComponent(headerValue, 'header', `header:${headerName}`, clientIp, correlationId);\n if (result[0]) return result;\n }\n\n try {\n const bodyBytes = await request.body();\n if (bodyBytes.length > 0) {\n const bodyText = new TextDecoder().decode(bodyBytes);\n if (bodyText.trim()) {\n const result = await checkRequestComponent(bodyText, 'request_body', 'body', clientIp, correlationId);\n if (result[0]) return result;\n }\n }\n } catch {\n // body read failure is not a threat\n }\n\n return [false, ''];\n}\n\nasync function checkRequestComponent(\n value: string,\n context: string,\n componentName: string,\n clientIp: string,\n correlationId: string,\n): Promise<[boolean, string]> {\n try {\n const result = await checkValueEnhanced(value, context, clientIp, correlationId);\n if (result[0]) {\n return [true, `Suspicious ${componentName}: ${result[1]}`];\n }\n } catch {\n /* v8 ignore next -- detection failure catch unreachable because dangerousPatterns check returns before checkValueEnhanced can throw */\n }\n return [false, ''];\n}\n\nasync function checkValueEnhanced(\n value: string,\n context: string,\n clientIp: string,\n correlationId: string,\n): Promise<[boolean, string]> {\n const { SusPatternsManager } = await import('./handlers/sus-patterns.js');\n\n try {\n const jsonData = JSON.parse(value);\n if (typeof jsonData === 'object' && jsonData !== null) {\n const result = await checkJsonFields(jsonData as Record<string, unknown>, context, clientIp, correlationId);\n if (result[0]) return result;\n }\n } catch {\n // not JSON, check as plain text\n }\n\n // Lazy: we don't have a global instance here, so we do a lightweight regex check\n // The full SusPatternsManager.detect() is used by the SuspiciousActivityCheck\n const dangerousPatterns = [\n /<script/i,\n /javascript:/i,\n /UNION\\s+SELECT/i,\n /\\.\\.\\//,\n /eval\\s*\\(/i,\n /exec\\s*\\(/i,\n /system\\s*\\(/i,\n ];\n\n for (const pattern of dangerousPatterns) {\n if (pattern.test(value)) {\n return [true, `Pattern match: ${pattern.source}`];\n }\n }\n\n return [false, ''];\n}\n\nasync function checkJsonFields(\n data: Record<string, unknown>,\n context: string,\n clientIp: string,\n correlationId: string,\n): Promise<[boolean, string]> {\n for (const [key, val] of Object.entries(data)) {\n if (typeof val === 'string') {\n const result = await checkValueEnhanced(val, context, clientIp, correlationId);\n if (result[0]) return [true, `JSON field '${key}': ${result[1]}`];\n } else if (typeof val === 'object' && val !== null && !Array.isArray(val)) {\n const result = await checkJsonFields(val as Record<string, unknown>, context, clientIp, correlationId);\n if (result[0]) return result;\n }\n }\n return [false, ''];\n}\n\nexport function logActivity(\n request: GuardRequest,\n logger: Logger,\n logType = 'request',\n reason = '',\n passiveMode = false,\n triggerInfo = '',\n level: 'INFO' | 'DEBUG' | 'WARNING' | 'ERROR' | 'CRITICAL' | null = 'WARNING',\n): void {\n if (!level) return;\n\n const clientIp = request.clientHost ?? 'unknown';\n const method = request.method;\n const url = sanitizeForLog(request.urlPath);\n const userAgent = sanitizeForLog(request.headers['user-agent'] ?? '');\n\n let message: string;\n\n if (logType === 'request') {\n message = `Request from ${clientIp}: ${method} ${url} [UA: ${userAgent}]`;\n } else if (logType === 'suspicious') {\n const prefix = passiveMode ? '[PASSIVE MODE]' : '';\n const trigger = triggerInfo ? ` | Trigger: ${triggerInfo}` : '';\n message = `${prefix} Suspicious request from ${clientIp}: ${method} ${url} - ${reason}${trigger}`;\n } else {\n message = `${logType} from ${clientIp}: ${method} ${url} - ${reason}`;\n }\n\n const levelLower = level.toLowerCase();\n const logMethod: keyof Logger =\n levelLower === 'warning' ? 'warn'\n : levelLower === 'critical' ? 'error'\n : levelLower === 'debug' ? 'debug'\n : levelLower === 'error' ? 'error'\n : 'info';\n\n logger[logMethod](message);\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,11 @@
1
+ var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
2
+ get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
3
+ }) : x)(function(x) {
4
+ if (typeof require !== "undefined") return require.apply(this, arguments);
5
+ throw Error('Dynamic require of "' + x + '" is not supported');
6
+ });
7
+
8
+ export {
9
+ __require
10
+ };
11
+ //# sourceMappingURL=chunk-DGUM43GV.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}