xypriss 2.2.5 → 2.3.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/README.md +1 -3
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js +9 -5
- package/dist/cjs/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js +9 -5
- package/dist/cjs/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/cjs/mods/security/src/components/cache/index.js +9 -5
- package/dist/cjs/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/index.js +8 -4
- package/dist/cjs/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
- package/dist/cjs/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/cjs/mods/security/src/index.js +9 -5
- package/dist/cjs/mods/security/src/index.js.map +1 -1
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js +31 -2
- package/dist/cjs/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js +87 -30
- package/dist/cjs/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js +320 -0
- package/dist/cjs/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js +215 -0
- package/dist/cjs/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js +96 -0
- package/dist/cjs/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js +212 -0
- package/dist/cjs/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js +335 -0
- package/dist/cjs/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
- package/dist/cjs/src/middleware/built-in/security/XXEProtector.js +175 -0
- package/dist/cjs/src/middleware/built-in/security/XXEProtector.js.map +1 -0
- package/dist/cjs/src/middleware/security-middleware.js +249 -132
- package/dist/cjs/src/middleware/security-middleware.js.map +1 -1
- package/dist/cjs/src/plugins/modules/index.js +8 -4
- package/dist/cjs/src/plugins/modules/index.js.map +1 -1
- package/dist/cjs/src/server/FastServer.js +49 -32
- package/dist/cjs/src/server/FastServer.js.map +1 -1
- package/dist/cjs/src/server/ServerFactory.js +34 -1
- package/dist/cjs/src/server/ServerFactory.js.map +1 -1
- package/dist/cjs/src/server/components/multi-server/MultiServerManager.js +11 -2
- package/dist/cjs/src/server/components/multi-server/MultiServerManager.js.map +1 -1
- package/dist/cjs/src/server/const/default.js +15 -1
- package/dist/cjs/src/server/const/default.js.map +1 -1
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js +9 -5
- package/dist/esm/mods/security/src/algorithms/hash-algorithms.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js +9 -5
- package/dist/esm/mods/security/src/components/cache/cacheSys.utils.js.map +1 -1
- package/dist/esm/mods/security/src/components/cache/index.js +9 -5
- package/dist/esm/mods/security/src/components/cache/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/index.js +8 -4
- package/dist/esm/mods/security/src/components/fortified-function/index.js.map +1 -1
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js +9 -5
- package/dist/esm/mods/security/src/components/fortified-function/security/security-handler.js.map +1 -1
- package/dist/esm/mods/security/src/index.js +9 -5
- package/dist/esm/mods/security/src/index.js.map +1 -1
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js +31 -2
- package/dist/esm/src/cluster/modules/CrossPlatformMemory.js.map +1 -1
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js +75 -18
- package/dist/esm/src/middleware/XyPrissMiddlewareAPI.js.map +1 -1
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js +318 -0
- package/dist/esm/src/middleware/built-in/BuiltInMiddleware.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js +213 -0
- package/dist/esm/src/middleware/built-in/security/CommandInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js +94 -0
- package/dist/esm/src/middleware/built-in/security/LDAPInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js +210 -0
- package/dist/esm/src/middleware/built-in/security/PathTraversalDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js +333 -0
- package/dist/esm/src/middleware/built-in/security/SQLInjectionDetector.js.map +1 -0
- package/dist/esm/src/middleware/built-in/security/XXEProtector.js +173 -0
- package/dist/esm/src/middleware/built-in/security/XXEProtector.js.map +1 -0
- package/dist/esm/src/middleware/security-middleware.js +248 -131
- package/dist/esm/src/middleware/security-middleware.js.map +1 -1
- package/dist/esm/src/plugins/modules/index.js +8 -4
- package/dist/esm/src/plugins/modules/index.js.map +1 -1
- package/dist/esm/src/server/FastServer.js +50 -33
- package/dist/esm/src/server/FastServer.js.map +1 -1
- package/dist/esm/src/server/ServerFactory.js +34 -1
- package/dist/esm/src/server/ServerFactory.js.map +1 -1
- package/dist/esm/src/server/components/multi-server/MultiServerManager.js +11 -2
- package/dist/esm/src/server/components/multi-server/MultiServerManager.js.map +1 -1
- package/dist/esm/src/server/const/default.js +15 -1
- package/dist/esm/src/server/const/default.js.map +1 -1
- package/dist/index.d.ts +895 -39
- package/package.json +2 -2
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Command Injection Detection Module
|
|
5
|
+
*
|
|
6
|
+
* Detects and prevents OS command injection attacks with
|
|
7
|
+
* intelligent context-aware false positive reduction
|
|
8
|
+
*/
|
|
9
|
+
class CommandInjectionDetector {
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
// High-risk command injection patterns
|
|
12
|
+
this.highRiskPatterns = [
|
|
13
|
+
// Command chaining
|
|
14
|
+
/[;&|`]\s*(ls|cat|wget|curl|nc|netcat|bash|sh|cmd|powershell|eval|exec)/gi,
|
|
15
|
+
// Command substitution
|
|
16
|
+
/\$\(.*?\)/g,
|
|
17
|
+
/`.*?`/g,
|
|
18
|
+
// Pipe to dangerous commands
|
|
19
|
+
/\|\s*(bash|sh|cmd|powershell|python|perl|ruby|node)/gi,
|
|
20
|
+
// Redirection with dangerous commands
|
|
21
|
+
/[<>]\s*(\/etc\/|\/bin\/|C:\\)/gi,
|
|
22
|
+
// Encoded command injection
|
|
23
|
+
/%0a|%0d|%09/gi, // newline, carriage return, tab
|
|
24
|
+
// Dangerous system commands
|
|
25
|
+
/(rm\s+-rf|del\s+\/|format\s+|mkfs|dd\s+if=)/gi,
|
|
26
|
+
// Network commands
|
|
27
|
+
/(wget|curl|nc|netcat|telnet|ssh|ftp)\s+/gi,
|
|
28
|
+
// Eval/exec patterns
|
|
29
|
+
/(eval|exec|system|passthru|shell_exec|popen)\s*\(/gi,
|
|
30
|
+
];
|
|
31
|
+
// Medium-risk patterns
|
|
32
|
+
this.mediumRiskPatterns = [
|
|
33
|
+
// Shell metacharacters
|
|
34
|
+
/[;&|`$()]/g,
|
|
35
|
+
// Redirection operators
|
|
36
|
+
/[<>]/g,
|
|
37
|
+
// Common command names (could be legitimate text)
|
|
38
|
+
/\b(ls|cat|echo|pwd|cd|mkdir|touch|grep|find|chmod|chown)\b/gi,
|
|
39
|
+
];
|
|
40
|
+
this.config = {
|
|
41
|
+
enabled: config.enabled ?? true,
|
|
42
|
+
strictMode: config.strictMode ?? false,
|
|
43
|
+
logAttempts: config.logAttempts ?? true,
|
|
44
|
+
blockOnDetection: config.blockOnDetection ?? true,
|
|
45
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.7,
|
|
46
|
+
customPatterns: config.customPatterns ?? [],
|
|
47
|
+
allowedCommands: config.allowedCommands ?? [],
|
|
48
|
+
contextualAnalysis: config.contextualAnalysis ?? true,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Detect command injection attempts
|
|
53
|
+
*/
|
|
54
|
+
detect(input, context) {
|
|
55
|
+
if (!input || typeof input !== 'string') {
|
|
56
|
+
return {
|
|
57
|
+
isMalicious: false,
|
|
58
|
+
confidence: 0,
|
|
59
|
+
detectedPatterns: [],
|
|
60
|
+
riskLevel: 'LOW',
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
const result = {
|
|
64
|
+
isMalicious: false,
|
|
65
|
+
confidence: 0,
|
|
66
|
+
detectedPatterns: [],
|
|
67
|
+
sanitizedInput: input,
|
|
68
|
+
riskLevel: 'LOW',
|
|
69
|
+
};
|
|
70
|
+
// High-risk pattern detection
|
|
71
|
+
let highRiskScore = 0;
|
|
72
|
+
this.highRiskPatterns.forEach((pattern, index) => {
|
|
73
|
+
const matches = input.match(pattern);
|
|
74
|
+
if (matches) {
|
|
75
|
+
const patternName = this.getHighRiskPatternName(index);
|
|
76
|
+
result.detectedPatterns.push(`${patternName}: ${matches.join(', ')}`);
|
|
77
|
+
highRiskScore += this.getHighRiskWeight(index);
|
|
78
|
+
}
|
|
79
|
+
});
|
|
80
|
+
// Medium-risk pattern detection with context
|
|
81
|
+
let mediumRiskScore = 0;
|
|
82
|
+
if (this.config.contextualAnalysis && context) {
|
|
83
|
+
mediumRiskScore = this.analyzeContext(input, context);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
this.mediumRiskPatterns.forEach((pattern) => {
|
|
87
|
+
const matches = input.match(pattern);
|
|
88
|
+
if (matches) {
|
|
89
|
+
mediumRiskScore += 0.1 * matches.length;
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// Legitimacy checks
|
|
94
|
+
const legitimacyScore = this.calculateLegitimacyScore(input);
|
|
95
|
+
// Calculate final confidence
|
|
96
|
+
result.confidence = Math.max(0, highRiskScore + mediumRiskScore * 0.3 - legitimacyScore);
|
|
97
|
+
result.confidence = Math.min(result.confidence, 1.0);
|
|
98
|
+
// Determine risk level
|
|
99
|
+
if (result.confidence >= 0.9) {
|
|
100
|
+
result.riskLevel = 'CRITICAL';
|
|
101
|
+
result.isMalicious = true;
|
|
102
|
+
}
|
|
103
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
104
|
+
result.riskLevel = 'HIGH';
|
|
105
|
+
result.isMalicious = true;
|
|
106
|
+
}
|
|
107
|
+
else if (result.confidence >= 0.4) {
|
|
108
|
+
result.riskLevel = 'MEDIUM';
|
|
109
|
+
result.isMalicious = false;
|
|
110
|
+
}
|
|
111
|
+
// Sanitize input
|
|
112
|
+
if (result.confidence >= 0.4) {
|
|
113
|
+
result.sanitizedInput = this.sanitizeInput(input);
|
|
114
|
+
}
|
|
115
|
+
// Log attempts
|
|
116
|
+
if (this.config.logAttempts && result.confidence >= 0.7) {
|
|
117
|
+
this.logAttempt(input, result);
|
|
118
|
+
}
|
|
119
|
+
return result;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Sanitize input by removing command injection sequences
|
|
123
|
+
*/
|
|
124
|
+
sanitizeInput(input) {
|
|
125
|
+
let sanitized = input;
|
|
126
|
+
// Remove command chaining characters
|
|
127
|
+
sanitized = sanitized.replace(/[;&|`]/g, '');
|
|
128
|
+
// Remove command substitution
|
|
129
|
+
sanitized = sanitized.replace(/\$\(.*?\)/g, '');
|
|
130
|
+
// Remove backticks
|
|
131
|
+
sanitized = sanitized.replace(/`/g, '');
|
|
132
|
+
// Remove redirection operators
|
|
133
|
+
sanitized = sanitized.replace(/[<>]/g, '');
|
|
134
|
+
// Remove encoded newlines/tabs
|
|
135
|
+
sanitized = sanitized.replace(/%0a|%0d|%09/gi, '');
|
|
136
|
+
return sanitized.trim();
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Analyze context to reduce false positives
|
|
140
|
+
*/
|
|
141
|
+
analyzeContext(input, context) {
|
|
142
|
+
let score = 0;
|
|
143
|
+
// Check if this is a code/technical field where commands might be legitimate
|
|
144
|
+
const technicalContexts = ['code', 'script', 'command', 'terminal', 'shell'];
|
|
145
|
+
const isTechnicalContext = technicalContexts.some(ctx => context.fieldName?.toLowerCase().includes(ctx) ||
|
|
146
|
+
context.fieldType?.toLowerCase().includes(ctx));
|
|
147
|
+
this.mediumRiskPatterns.forEach((pattern, index) => {
|
|
148
|
+
const matches = input.match(pattern);
|
|
149
|
+
if (matches) {
|
|
150
|
+
let patternScore = 0.1 * matches.length;
|
|
151
|
+
// Reduce score for technical contexts
|
|
152
|
+
if (isTechnicalContext && index > 1) {
|
|
153
|
+
patternScore *= 0.2; // Reduce by 80% for command names in technical fields
|
|
154
|
+
}
|
|
155
|
+
score += patternScore;
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return score;
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Calculate legitimacy score
|
|
162
|
+
*/
|
|
163
|
+
calculateLegitimacyScore(input) {
|
|
164
|
+
let score = 0;
|
|
165
|
+
// Natural language indicators
|
|
166
|
+
const words = input.split(/\s+/);
|
|
167
|
+
if (words.length > 3 && words.every(w => /^[a-zA-Z]+$/.test(w))) {
|
|
168
|
+
score += 0.3; // Looks like natural text
|
|
169
|
+
}
|
|
170
|
+
// No shell metacharacters
|
|
171
|
+
if (!/[;&|`$()<>]/.test(input)) {
|
|
172
|
+
score += 0.2;
|
|
173
|
+
}
|
|
174
|
+
// Reasonable length for user input
|
|
175
|
+
if (input.length > 10 && input.length < 200) {
|
|
176
|
+
score += 0.1;
|
|
177
|
+
}
|
|
178
|
+
return Math.min(score, 0.5);
|
|
179
|
+
}
|
|
180
|
+
getHighRiskPatternName(index) {
|
|
181
|
+
const names = [
|
|
182
|
+
'Command chaining',
|
|
183
|
+
'Command substitution ($())',
|
|
184
|
+
'Backtick substitution',
|
|
185
|
+
'Pipe to shell',
|
|
186
|
+
'Redirection to system paths',
|
|
187
|
+
'Encoded injection',
|
|
188
|
+
'Dangerous system commands',
|
|
189
|
+
'Network commands',
|
|
190
|
+
'Eval/exec functions',
|
|
191
|
+
];
|
|
192
|
+
return names[index] || `High-risk pattern ${index}`;
|
|
193
|
+
}
|
|
194
|
+
getHighRiskWeight(index) {
|
|
195
|
+
const weights = [0.9, 0.9, 0.9, 0.8, 0.7, 0.6, 0.9, 0.7, 0.9];
|
|
196
|
+
return weights[index] || 0.7;
|
|
197
|
+
}
|
|
198
|
+
logAttempt(input, result) {
|
|
199
|
+
console.warn('[CommandInjection] Attack detected:', {
|
|
200
|
+
timestamp: new Date().toISOString(),
|
|
201
|
+
input: input.substring(0, 100),
|
|
202
|
+
confidence: result.confidence,
|
|
203
|
+
patterns: result.detectedPatterns,
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
updateConfig(newConfig) {
|
|
207
|
+
this.config = { ...this.config, ...newConfig };
|
|
208
|
+
}
|
|
209
|
+
getConfig() {
|
|
210
|
+
return { ...this.config };
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
module.exports = CommandInjectionDetector;
|
|
215
|
+
//# sourceMappingURL=CommandInjectionDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CommandInjectionDetector.js","sources":["../../../../../../src/middleware/built-in/security/CommandInjectionDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* LDAP Injection Detection Module
|
|
5
|
+
*
|
|
6
|
+
* Detects and prevents LDAP injection attacks
|
|
7
|
+
*/
|
|
8
|
+
class LDAPInjectionDetector {
|
|
9
|
+
constructor(config = {}) {
|
|
10
|
+
// LDAP injection patterns
|
|
11
|
+
this.injectionPatterns = [
|
|
12
|
+
// LDAP filter metacharacters
|
|
13
|
+
/[*()\\|&]/g,
|
|
14
|
+
// Null byte
|
|
15
|
+
/\x00/g,
|
|
16
|
+
// LDAP filter injection attempts
|
|
17
|
+
/\)\s*\(\s*\|/gi, // )( | pattern
|
|
18
|
+
/\)\s*\(\s*&/gi, // )( & pattern
|
|
19
|
+
// Wildcard abuse
|
|
20
|
+
/\*{2,}/g,
|
|
21
|
+
// DN injection
|
|
22
|
+
/,\s*(cn|ou|dc|o)=/gi,
|
|
23
|
+
];
|
|
24
|
+
this.config = {
|
|
25
|
+
enabled: config.enabled ?? true,
|
|
26
|
+
strictMode: config.strictMode ?? false,
|
|
27
|
+
logAttempts: config.logAttempts ?? true,
|
|
28
|
+
blockOnDetection: config.blockOnDetection ?? true,
|
|
29
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
|
|
30
|
+
customPatterns: config.customPatterns ?? [],
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
detect(input) {
|
|
34
|
+
if (!input || typeof input !== 'string') {
|
|
35
|
+
return {
|
|
36
|
+
isMalicious: false,
|
|
37
|
+
confidence: 0,
|
|
38
|
+
detectedPatterns: [],
|
|
39
|
+
riskLevel: 'LOW',
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const result = {
|
|
43
|
+
isMalicious: false,
|
|
44
|
+
confidence: 0,
|
|
45
|
+
detectedPatterns: [],
|
|
46
|
+
sanitizedInput: input,
|
|
47
|
+
riskLevel: 'LOW',
|
|
48
|
+
};
|
|
49
|
+
let riskScore = 0;
|
|
50
|
+
this.injectionPatterns.forEach((pattern, index) => {
|
|
51
|
+
const matches = input.match(pattern);
|
|
52
|
+
if (matches) {
|
|
53
|
+
result.detectedPatterns.push(`LDAP metacharacter: ${matches.join(', ')}`);
|
|
54
|
+
riskScore += 0.3 * matches.length;
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
result.confidence = Math.min(riskScore, 1.0);
|
|
58
|
+
if (result.confidence >= 0.7) {
|
|
59
|
+
result.riskLevel = 'HIGH';
|
|
60
|
+
result.isMalicious = true;
|
|
61
|
+
}
|
|
62
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
63
|
+
result.riskLevel = 'MEDIUM';
|
|
64
|
+
result.isMalicious = this.config.strictMode;
|
|
65
|
+
}
|
|
66
|
+
if (result.confidence >= 0.3) {
|
|
67
|
+
result.sanitizedInput = this.sanitize(input);
|
|
68
|
+
}
|
|
69
|
+
if (this.config.logAttempts && result.confidence >= 0.6) {
|
|
70
|
+
console.warn('[LDAP] Injection attempt detected:', {
|
|
71
|
+
timestamp: new Date().toISOString(),
|
|
72
|
+
input: input.substring(0, 100),
|
|
73
|
+
confidence: result.confidence,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
return result;
|
|
77
|
+
}
|
|
78
|
+
sanitize(input) {
|
|
79
|
+
// Escape LDAP special characters
|
|
80
|
+
return input
|
|
81
|
+
.replace(/\\/g, '\\5c')
|
|
82
|
+
.replace(/\*/g, '\\2a')
|
|
83
|
+
.replace(/\(/g, '\\28')
|
|
84
|
+
.replace(/\)/g, '\\29')
|
|
85
|
+
.replace(/\x00/g, '\\00');
|
|
86
|
+
}
|
|
87
|
+
updateConfig(newConfig) {
|
|
88
|
+
this.config = { ...this.config, ...newConfig };
|
|
89
|
+
}
|
|
90
|
+
getConfig() {
|
|
91
|
+
return { ...this.config };
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
module.exports = LDAPInjectionDetector;
|
|
96
|
+
//# sourceMappingURL=LDAPInjectionDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LDAPInjectionDetector.js","sources":["../../../../../../src/middleware/built-in/security/LDAPInjectionDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Path Traversal Detection Module
|
|
5
|
+
*
|
|
6
|
+
* Detects and prevents directory traversal attacks with intelligent
|
|
7
|
+
* false positive avoidance for legitimate file paths
|
|
8
|
+
*/
|
|
9
|
+
class PathTraversalDetector {
|
|
10
|
+
constructor(config = {}) {
|
|
11
|
+
// High-risk path traversal patterns
|
|
12
|
+
this.highRiskPatterns = [
|
|
13
|
+
// Classic traversal with multiple levels
|
|
14
|
+
/(\.\.[\/\\]){2,}/g,
|
|
15
|
+
// URL encoded traversal
|
|
16
|
+
/(%2e%2e[\/\\]|%2e%2e%2f|%2e%2e%5c)/gi,
|
|
17
|
+
// Double URL encoded
|
|
18
|
+
/(%252e%252e[\/\\]|%252e%252e%252f)/gi,
|
|
19
|
+
// Unicode/UTF-8 encoded
|
|
20
|
+
/(\.\.%c0%af|\.\.%c1%9c)/gi,
|
|
21
|
+
// Null byte injection
|
|
22
|
+
/\.\.[\/\\].*%00/g,
|
|
23
|
+
// Absolute paths (Unix/Windows)
|
|
24
|
+
/^(\/|\\\\|[a-zA-Z]:\\)/,
|
|
25
|
+
// System directories
|
|
26
|
+
/(\/etc\/|\/proc\/|\/sys\/|\/dev\/|C:\\Windows\\|C:\\Program Files\\)/gi,
|
|
27
|
+
// Traversal with encoded slashes
|
|
28
|
+
/\.\.(%2f|%5c)/gi,
|
|
29
|
+
];
|
|
30
|
+
// Medium-risk patterns (context-dependent)
|
|
31
|
+
this.mediumRiskPatterns = [
|
|
32
|
+
// Single parent directory reference
|
|
33
|
+
/\.\.[\/\\]/g,
|
|
34
|
+
// Hidden files (Unix)
|
|
35
|
+
/\/\.[^\/]+/g,
|
|
36
|
+
// Backup files
|
|
37
|
+
/\.(bak|backup|old|tmp|swp)$/gi,
|
|
38
|
+
// Config files
|
|
39
|
+
/\.(conf|config|ini|env)$/gi,
|
|
40
|
+
];
|
|
41
|
+
this.config = {
|
|
42
|
+
enabled: config.enabled ?? true,
|
|
43
|
+
strictMode: config.strictMode ?? false,
|
|
44
|
+
logAttempts: config.logAttempts ?? true,
|
|
45
|
+
blockOnDetection: config.blockOnDetection ?? true,
|
|
46
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.6,
|
|
47
|
+
customPatterns: config.customPatterns ?? [],
|
|
48
|
+
allowedPaths: config.allowedPaths ?? [],
|
|
49
|
+
allowedExtensions: config.allowedExtensions ?? ['.jpg', '.png', '.pdf', '.txt'],
|
|
50
|
+
maxDepth: config.maxDepth ?? 3,
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Detect path traversal attempts
|
|
55
|
+
*/
|
|
56
|
+
detect(path, context) {
|
|
57
|
+
if (!path || typeof path !== 'string') {
|
|
58
|
+
return {
|
|
59
|
+
isMalicious: false,
|
|
60
|
+
confidence: 0,
|
|
61
|
+
detectedPatterns: [],
|
|
62
|
+
riskLevel: 'LOW',
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
const result = {
|
|
66
|
+
isMalicious: false,
|
|
67
|
+
confidence: 0,
|
|
68
|
+
detectedPatterns: [],
|
|
69
|
+
sanitizedInput: path,
|
|
70
|
+
riskLevel: 'LOW',
|
|
71
|
+
};
|
|
72
|
+
// Check if path is in allowed paths
|
|
73
|
+
if (this.isAllowedPath(path)) {
|
|
74
|
+
return result;
|
|
75
|
+
}
|
|
76
|
+
// High-risk pattern detection
|
|
77
|
+
let highRiskScore = 0;
|
|
78
|
+
this.highRiskPatterns.forEach((pattern, index) => {
|
|
79
|
+
const matches = path.match(pattern);
|
|
80
|
+
if (matches) {
|
|
81
|
+
const patternName = this.getHighRiskPatternName(index);
|
|
82
|
+
result.detectedPatterns.push(`${patternName}: ${matches.join(', ')}`);
|
|
83
|
+
highRiskScore += 0.8;
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
// Medium-risk pattern detection
|
|
87
|
+
let mediumRiskScore = 0;
|
|
88
|
+
this.mediumRiskPatterns.forEach((pattern) => {
|
|
89
|
+
const matches = path.match(pattern);
|
|
90
|
+
if (matches) {
|
|
91
|
+
mediumRiskScore += 0.2 * matches.length;
|
|
92
|
+
}
|
|
93
|
+
});
|
|
94
|
+
// Calculate depth
|
|
95
|
+
const depth = this.calculatePathDepth(path);
|
|
96
|
+
if (depth > this.config.maxDepth) {
|
|
97
|
+
result.detectedPatterns.push(`Excessive depth: ${depth}`);
|
|
98
|
+
mediumRiskScore += 0.3;
|
|
99
|
+
}
|
|
100
|
+
// Legitimacy checks
|
|
101
|
+
const legitimacyScore = this.calculateLegitimacyScore(path);
|
|
102
|
+
// Calculate final confidence
|
|
103
|
+
result.confidence = Math.max(0, highRiskScore + mediumRiskScore * 0.4 - legitimacyScore);
|
|
104
|
+
result.confidence = Math.min(result.confidence, 1.0);
|
|
105
|
+
// Determine risk level
|
|
106
|
+
if (result.confidence >= 0.8) {
|
|
107
|
+
result.riskLevel = 'CRITICAL';
|
|
108
|
+
result.isMalicious = true;
|
|
109
|
+
}
|
|
110
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
111
|
+
result.riskLevel = 'HIGH';
|
|
112
|
+
result.isMalicious = true;
|
|
113
|
+
}
|
|
114
|
+
else if (result.confidence >= 0.3) {
|
|
115
|
+
result.riskLevel = 'MEDIUM';
|
|
116
|
+
result.isMalicious = false;
|
|
117
|
+
}
|
|
118
|
+
// Sanitize path
|
|
119
|
+
if (result.confidence >= 0.3) {
|
|
120
|
+
result.sanitizedInput = this.sanitizePath(path);
|
|
121
|
+
}
|
|
122
|
+
// Log attempts
|
|
123
|
+
if (this.config.logAttempts && result.confidence >= 0.7) {
|
|
124
|
+
this.logAttempt(path, result);
|
|
125
|
+
}
|
|
126
|
+
return result;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* Sanitize path by removing traversal sequences
|
|
130
|
+
*/
|
|
131
|
+
sanitizePath(path) {
|
|
132
|
+
let sanitized = path;
|
|
133
|
+
// Remove all traversal sequences
|
|
134
|
+
sanitized = sanitized.replace(/\.\.[\/\\]/g, '');
|
|
135
|
+
// Remove URL encoded traversal
|
|
136
|
+
sanitized = sanitized.replace(/%2e%2e[\/\\%]/gi, '');
|
|
137
|
+
// Remove null bytes
|
|
138
|
+
sanitized = sanitized.replace(/%00/g, '');
|
|
139
|
+
// Normalize slashes
|
|
140
|
+
sanitized = sanitized.replace(/[\\]/g, '/');
|
|
141
|
+
// Remove duplicate slashes
|
|
142
|
+
sanitized = sanitized.replace(/\/+/g, '/');
|
|
143
|
+
// Remove leading slash if present
|
|
144
|
+
sanitized = sanitized.replace(/^\//, '');
|
|
145
|
+
return sanitized;
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Check if path is in allowed paths
|
|
149
|
+
*/
|
|
150
|
+
isAllowedPath(path) {
|
|
151
|
+
return this.config.allowedPaths.some(allowed => path.startsWith(allowed));
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Calculate path depth
|
|
155
|
+
*/
|
|
156
|
+
calculatePathDepth(path) {
|
|
157
|
+
const normalized = path.replace(/[\\]/g, '/');
|
|
158
|
+
const parts = normalized.split('/').filter(p => p && p !== '.');
|
|
159
|
+
return parts.length;
|
|
160
|
+
}
|
|
161
|
+
/**
|
|
162
|
+
* Calculate legitimacy score
|
|
163
|
+
*/
|
|
164
|
+
calculateLegitimacyScore(path) {
|
|
165
|
+
let score = 0;
|
|
166
|
+
// Check for allowed extensions
|
|
167
|
+
const hasAllowedExt = this.config.allowedExtensions.some(ext => path.toLowerCase().endsWith(ext));
|
|
168
|
+
if (hasAllowedExt) {
|
|
169
|
+
score += 0.3;
|
|
170
|
+
}
|
|
171
|
+
// Simple filename pattern (no traversal)
|
|
172
|
+
if (/^[a-zA-Z0-9_\-\.]+$/.test(path)) {
|
|
173
|
+
score += 0.3;
|
|
174
|
+
}
|
|
175
|
+
// Reasonable path depth
|
|
176
|
+
const depth = this.calculatePathDepth(path);
|
|
177
|
+
if (depth <= 2) {
|
|
178
|
+
score += 0.2;
|
|
179
|
+
}
|
|
180
|
+
return Math.min(score, 0.5);
|
|
181
|
+
}
|
|
182
|
+
getHighRiskPatternName(index) {
|
|
183
|
+
const names = [
|
|
184
|
+
'Multiple traversal sequences',
|
|
185
|
+
'URL encoded traversal',
|
|
186
|
+
'Double URL encoded traversal',
|
|
187
|
+
'Unicode encoded traversal',
|
|
188
|
+
'Null byte injection',
|
|
189
|
+
'Absolute path',
|
|
190
|
+
'System directory access',
|
|
191
|
+
'Encoded slash traversal',
|
|
192
|
+
];
|
|
193
|
+
return names[index] || `High-risk pattern ${index}`;
|
|
194
|
+
}
|
|
195
|
+
logAttempt(path, result) {
|
|
196
|
+
console.warn('[PathTraversal] Attack detected:', {
|
|
197
|
+
timestamp: new Date().toISOString(),
|
|
198
|
+
path: path.substring(0, 100),
|
|
199
|
+
confidence: result.confidence,
|
|
200
|
+
patterns: result.detectedPatterns,
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
updateConfig(newConfig) {
|
|
204
|
+
this.config = { ...this.config, ...newConfig };
|
|
205
|
+
}
|
|
206
|
+
getConfig() {
|
|
207
|
+
return { ...this.config };
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
module.exports = PathTraversalDetector;
|
|
212
|
+
//# sourceMappingURL=PathTraversalDetector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PathTraversalDetector.js","sources":["../../../../../../src/middleware/built-in/security/PathTraversalDetector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|