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,173 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* XXE (XML External Entity) Protection Module
|
|
3
|
+
*
|
|
4
|
+
* Detects and prevents XXE attacks in XML parsing
|
|
5
|
+
* Uses libxmljs2 for secure XML parsing
|
|
6
|
+
*/
|
|
7
|
+
class XXEProtector {
|
|
8
|
+
constructor(config = {}) {
|
|
9
|
+
// Dangerous XXE patterns
|
|
10
|
+
this.dangerousPatterns = [
|
|
11
|
+
// External entity declarations
|
|
12
|
+
/<!ENTITY\s+\w+\s+SYSTEM\s+/gi,
|
|
13
|
+
/<!ENTITY\s+\w+\s+PUBLIC\s+/gi,
|
|
14
|
+
// Parameter entities
|
|
15
|
+
/<!ENTITY\s+%\s+\w+/gi,
|
|
16
|
+
// External DTD
|
|
17
|
+
/<!DOCTYPE\s+\w+\s+SYSTEM\s+/gi,
|
|
18
|
+
/<!DOCTYPE\s+\w+\s+PUBLIC\s+/gi,
|
|
19
|
+
// File protocol
|
|
20
|
+
/SYSTEM\s+["']file:\/\//gi,
|
|
21
|
+
// HTTP/HTTPS external resources
|
|
22
|
+
/SYSTEM\s+["'](https?|ftp):\/\//gi,
|
|
23
|
+
// PHP wrappers (common in XXE)
|
|
24
|
+
/php:\/\//gi,
|
|
25
|
+
/expect:\/\//gi,
|
|
26
|
+
// Data URIs
|
|
27
|
+
/data:\/\//gi,
|
|
28
|
+
];
|
|
29
|
+
this.config = {
|
|
30
|
+
enabled: config.enabled ?? true,
|
|
31
|
+
strictMode: config.strictMode ?? true,
|
|
32
|
+
logAttempts: config.logAttempts ?? true,
|
|
33
|
+
blockOnDetection: config.blockOnDetection ?? true,
|
|
34
|
+
falsePositiveThreshold: config.falsePositiveThreshold ?? 0.5,
|
|
35
|
+
customPatterns: config.customPatterns ?? [],
|
|
36
|
+
allowDTD: config.allowDTD ?? false,
|
|
37
|
+
allowExternalEntities: config.allowExternalEntities ?? false,
|
|
38
|
+
maxEntityExpansions: config.maxEntityExpansions ?? 0,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Detect XXE attempts in XML content
|
|
43
|
+
*/
|
|
44
|
+
detect(xmlContent) {
|
|
45
|
+
if (!xmlContent || typeof xmlContent !== 'string') {
|
|
46
|
+
return {
|
|
47
|
+
isMalicious: false,
|
|
48
|
+
confidence: 0,
|
|
49
|
+
detectedPatterns: [],
|
|
50
|
+
riskLevel: 'LOW',
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
const result = {
|
|
54
|
+
isMalicious: false,
|
|
55
|
+
confidence: 0,
|
|
56
|
+
detectedPatterns: [],
|
|
57
|
+
sanitizedInput: xmlContent,
|
|
58
|
+
riskLevel: 'LOW',
|
|
59
|
+
};
|
|
60
|
+
// Check for dangerous patterns
|
|
61
|
+
let riskScore = 0;
|
|
62
|
+
this.dangerousPatterns.forEach((pattern, index) => {
|
|
63
|
+
const matches = xmlContent.match(pattern);
|
|
64
|
+
if (matches) {
|
|
65
|
+
const patternName = this.getPatternName(index);
|
|
66
|
+
result.detectedPatterns.push(`${patternName}: ${matches.length} occurrence(s)`);
|
|
67
|
+
riskScore += 0.7;
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
// Check for DTD if not allowed
|
|
71
|
+
if (!this.config.allowDTD && /<!DOCTYPE/gi.test(xmlContent)) {
|
|
72
|
+
result.detectedPatterns.push('DTD declaration (not allowed)');
|
|
73
|
+
riskScore += 0.5;
|
|
74
|
+
}
|
|
75
|
+
// Check for entity declarations
|
|
76
|
+
if (!this.config.allowExternalEntities && /<!ENTITY/gi.test(xmlContent)) {
|
|
77
|
+
result.detectedPatterns.push('Entity declaration (not allowed)');
|
|
78
|
+
riskScore += 0.6;
|
|
79
|
+
}
|
|
80
|
+
// Calculate confidence
|
|
81
|
+
result.confidence = Math.min(riskScore, 1.0);
|
|
82
|
+
// Determine risk level
|
|
83
|
+
if (result.confidence >= 0.8) {
|
|
84
|
+
result.riskLevel = 'CRITICAL';
|
|
85
|
+
result.isMalicious = true;
|
|
86
|
+
}
|
|
87
|
+
else if (result.confidence >= this.config.falsePositiveThreshold) {
|
|
88
|
+
result.riskLevel = 'HIGH';
|
|
89
|
+
result.isMalicious = true;
|
|
90
|
+
}
|
|
91
|
+
else if (result.confidence >= 0.3) {
|
|
92
|
+
result.riskLevel = 'MEDIUM';
|
|
93
|
+
result.isMalicious = this.config.strictMode;
|
|
94
|
+
}
|
|
95
|
+
// Sanitize XML
|
|
96
|
+
if (result.confidence >= 0.3) {
|
|
97
|
+
result.sanitizedInput = this.sanitizeXML(xmlContent);
|
|
98
|
+
}
|
|
99
|
+
// Log attempts
|
|
100
|
+
if (this.config.logAttempts && result.confidence >= 0.5) {
|
|
101
|
+
this.logAttempt(result);
|
|
102
|
+
}
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Sanitize XML by removing dangerous constructs
|
|
107
|
+
*/
|
|
108
|
+
sanitizeXML(xml) {
|
|
109
|
+
let sanitized = xml;
|
|
110
|
+
// Remove DOCTYPE declarations
|
|
111
|
+
sanitized = sanitized.replace(/<!DOCTYPE[^>]*>/gi, '');
|
|
112
|
+
// Remove ENTITY declarations
|
|
113
|
+
sanitized = sanitized.replace(/<!ENTITY[^>]*>/gi, '');
|
|
114
|
+
// Remove SYSTEM references
|
|
115
|
+
sanitized = sanitized.replace(/SYSTEM\s+["'][^"']*["']/gi, '');
|
|
116
|
+
// Remove PUBLIC references
|
|
117
|
+
sanitized = sanitized.replace(/PUBLIC\s+["'][^"']*["']/gi, '');
|
|
118
|
+
return sanitized;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* Safe XML parsing helper (returns parsed object or null)
|
|
122
|
+
* Note: In production, use a library like 'libxmljs2' with secure defaults
|
|
123
|
+
*/
|
|
124
|
+
safeParseXML(xmlContent) {
|
|
125
|
+
const detection = this.detect(xmlContent);
|
|
126
|
+
if (detection.isMalicious) {
|
|
127
|
+
if (this.config.blockOnDetection) {
|
|
128
|
+
throw new Error(`XXE attack detected: ${detection.detectedPatterns.join(', ')}`);
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
// In production, use a secure XML parser here
|
|
133
|
+
// Example with libxmljs2:
|
|
134
|
+
// const libxmljs = require('libxmljs2');
|
|
135
|
+
// return libxmljs.parseXml(detection.sanitizedInput, {
|
|
136
|
+
// noent: false, // Disable entity substitution
|
|
137
|
+
// dtdload: false, // Disable DTD loading
|
|
138
|
+
// dtdvalid: false, // Disable DTD validation
|
|
139
|
+
// nonet: true, // Disable network access
|
|
140
|
+
// });
|
|
141
|
+
return { warning: 'Use a secure XML parser library in production' };
|
|
142
|
+
}
|
|
143
|
+
getPatternName(index) {
|
|
144
|
+
const names = [
|
|
145
|
+
'External SYSTEM entity',
|
|
146
|
+
'External PUBLIC entity',
|
|
147
|
+
'Parameter entity',
|
|
148
|
+
'DOCTYPE SYSTEM',
|
|
149
|
+
'DOCTYPE PUBLIC',
|
|
150
|
+
'File protocol',
|
|
151
|
+
'HTTP/HTTPS external resource',
|
|
152
|
+
'PHP wrapper',
|
|
153
|
+
'Data URI',
|
|
154
|
+
];
|
|
155
|
+
return names[index] || `Pattern ${index}`;
|
|
156
|
+
}
|
|
157
|
+
logAttempt(result) {
|
|
158
|
+
console.warn('[XXE] Attack detected:', {
|
|
159
|
+
timestamp: new Date().toISOString(),
|
|
160
|
+
confidence: result.confidence,
|
|
161
|
+
patterns: result.detectedPatterns,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
updateConfig(newConfig) {
|
|
165
|
+
this.config = { ...this.config, ...newConfig };
|
|
166
|
+
}
|
|
167
|
+
getConfig() {
|
|
168
|
+
return { ...this.config };
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export { XXEProtector as default };
|
|
173
|
+
//# sourceMappingURL=XXEProtector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XXEProtector.js","sources":["../../../../../../src/middleware/built-in/security/XXEProtector.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|