eslint-plugin-secure-coding 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.
- package/AGENTS.md +196 -0
- package/CHANGELOG.md +105 -0
- package/LICENSE +23 -0
- package/README.md +377 -0
- package/package.json +80 -0
- package/src/index.d.ts +32 -0
- package/src/index.js +345 -0
- package/src/index.js.map +1 -0
- package/src/rules/security/database-injection.d.ts +13 -0
- package/src/rules/security/database-injection.js +407 -0
- package/src/rules/security/database-injection.js.map +1 -0
- package/src/rules/security/detect-child-process.d.ts +11 -0
- package/src/rules/security/detect-child-process.js +460 -0
- package/src/rules/security/detect-child-process.js.map +1 -0
- package/src/rules/security/detect-eval-with-expression.d.ts +9 -0
- package/src/rules/security/detect-eval-with-expression.js +393 -0
- package/src/rules/security/detect-eval-with-expression.js.map +1 -0
- package/src/rules/security/detect-non-literal-fs-filename.d.ts +7 -0
- package/src/rules/security/detect-non-literal-fs-filename.js +322 -0
- package/src/rules/security/detect-non-literal-fs-filename.js.map +1 -0
- package/src/rules/security/detect-non-literal-regexp.d.ts +9 -0
- package/src/rules/security/detect-non-literal-regexp.js +387 -0
- package/src/rules/security/detect-non-literal-regexp.js.map +1 -0
- package/src/rules/security/detect-object-injection.d.ts +11 -0
- package/src/rules/security/detect-object-injection.js +411 -0
- package/src/rules/security/detect-object-injection.js.map +1 -0
- package/src/rules/security/no-buffer-overread.d.ts +14 -0
- package/src/rules/security/no-buffer-overread.js +519 -0
- package/src/rules/security/no-buffer-overread.js.map +1 -0
- package/src/rules/security/no-clickjacking.d.ts +10 -0
- package/src/rules/security/no-clickjacking.js +381 -0
- package/src/rules/security/no-clickjacking.js.map +1 -0
- package/src/rules/security/no-directive-injection.d.ts +12 -0
- package/src/rules/security/no-directive-injection.js +446 -0
- package/src/rules/security/no-directive-injection.js.map +1 -0
- package/src/rules/security/no-document-cookie.d.ts +5 -0
- package/src/rules/security/no-document-cookie.js +90 -0
- package/src/rules/security/no-document-cookie.js.map +1 -0
- package/src/rules/security/no-electron-security-issues.d.ts +10 -0
- package/src/rules/security/no-electron-security-issues.js +421 -0
- package/src/rules/security/no-electron-security-issues.js.map +1 -0
- package/src/rules/security/no-exposed-sensitive-data.d.ts +11 -0
- package/src/rules/security/no-exposed-sensitive-data.js +341 -0
- package/src/rules/security/no-exposed-sensitive-data.js.map +1 -0
- package/src/rules/security/no-format-string-injection.d.ts +17 -0
- package/src/rules/security/no-format-string-injection.js +653 -0
- package/src/rules/security/no-format-string-injection.js.map +1 -0
- package/src/rules/security/no-graphql-injection.d.ts +12 -0
- package/src/rules/security/no-graphql-injection.js +410 -0
- package/src/rules/security/no-graphql-injection.js.map +1 -0
- package/src/rules/security/no-hardcoded-credentials.d.ts +26 -0
- package/src/rules/security/no-hardcoded-credentials.js +377 -0
- package/src/rules/security/no-hardcoded-credentials.js.map +1 -0
- package/src/rules/security/no-improper-sanitization.d.ts +12 -0
- package/src/rules/security/no-improper-sanitization.js +408 -0
- package/src/rules/security/no-improper-sanitization.js.map +1 -0
- package/src/rules/security/no-improper-type-validation.d.ts +10 -0
- package/src/rules/security/no-improper-type-validation.js +420 -0
- package/src/rules/security/no-improper-type-validation.js.map +1 -0
- package/src/rules/security/no-insecure-comparison.d.ts +7 -0
- package/src/rules/security/no-insecure-comparison.js +125 -0
- package/src/rules/security/no-insecure-comparison.js.map +1 -0
- package/src/rules/security/no-insecure-cookie-settings.d.ts +9 -0
- package/src/rules/security/no-insecure-cookie-settings.js +305 -0
- package/src/rules/security/no-insecure-cookie-settings.js.map +1 -0
- package/src/rules/security/no-insecure-jwt.d.ts +10 -0
- package/src/rules/security/no-insecure-jwt.js +338 -0
- package/src/rules/security/no-insecure-jwt.js.map +1 -0
- package/src/rules/security/no-insecure-redirects.d.ts +7 -0
- package/src/rules/security/no-insecure-redirects.js +215 -0
- package/src/rules/security/no-insecure-redirects.js.map +1 -0
- package/src/rules/security/no-insufficient-postmessage-validation.d.ts +14 -0
- package/src/rules/security/no-insufficient-postmessage-validation.js +390 -0
- package/src/rules/security/no-insufficient-postmessage-validation.js.map +1 -0
- package/src/rules/security/no-insufficient-random.d.ts +9 -0
- package/src/rules/security/no-insufficient-random.js +207 -0
- package/src/rules/security/no-insufficient-random.js.map +1 -0
- package/src/rules/security/no-ldap-injection.d.ts +10 -0
- package/src/rules/security/no-ldap-injection.js +449 -0
- package/src/rules/security/no-ldap-injection.js.map +1 -0
- package/src/rules/security/no-missing-authentication.d.ts +13 -0
- package/src/rules/security/no-missing-authentication.js +322 -0
- package/src/rules/security/no-missing-authentication.js.map +1 -0
- package/src/rules/security/no-missing-cors-check.d.ts +9 -0
- package/src/rules/security/no-missing-cors-check.js +449 -0
- package/src/rules/security/no-missing-cors-check.js.map +1 -0
- package/src/rules/security/no-missing-csrf-protection.d.ts +11 -0
- package/src/rules/security/no-missing-csrf-protection.js +183 -0
- package/src/rules/security/no-missing-csrf-protection.js.map +1 -0
- package/src/rules/security/no-missing-security-headers.d.ts +7 -0
- package/src/rules/security/no-missing-security-headers.js +217 -0
- package/src/rules/security/no-missing-security-headers.js.map +1 -0
- package/src/rules/security/no-privilege-escalation.d.ts +13 -0
- package/src/rules/security/no-privilege-escalation.js +321 -0
- package/src/rules/security/no-privilege-escalation.js.map +1 -0
- package/src/rules/security/no-redos-vulnerable-regex.d.ts +7 -0
- package/src/rules/security/no-redos-vulnerable-regex.js +307 -0
- package/src/rules/security/no-redos-vulnerable-regex.js.map +1 -0
- package/src/rules/security/no-sensitive-data-exposure.d.ts +11 -0
- package/src/rules/security/no-sensitive-data-exposure.js +251 -0
- package/src/rules/security/no-sensitive-data-exposure.js.map +1 -0
- package/src/rules/security/no-sql-injection.d.ts +10 -0
- package/src/rules/security/no-sql-injection.js +332 -0
- package/src/rules/security/no-sql-injection.js.map +1 -0
- package/src/rules/security/no-timing-attack.d.ts +10 -0
- package/src/rules/security/no-timing-attack.js +358 -0
- package/src/rules/security/no-timing-attack.js.map +1 -0
- package/src/rules/security/no-toctou-vulnerability.d.ts +7 -0
- package/src/rules/security/no-toctou-vulnerability.js +165 -0
- package/src/rules/security/no-toctou-vulnerability.js.map +1 -0
- package/src/rules/security/no-unchecked-loop-condition.d.ts +12 -0
- package/src/rules/security/no-unchecked-loop-condition.js +635 -0
- package/src/rules/security/no-unchecked-loop-condition.js.map +1 -0
- package/src/rules/security/no-unencrypted-transmission.d.ts +11 -0
- package/src/rules/security/no-unencrypted-transmission.js +237 -0
- package/src/rules/security/no-unencrypted-transmission.js.map +1 -0
- package/src/rules/security/no-unescaped-url-parameter.d.ts +9 -0
- package/src/rules/security/no-unescaped-url-parameter.js +266 -0
- package/src/rules/security/no-unescaped-url-parameter.js.map +1 -0
- package/src/rules/security/no-unlimited-resource-allocation.d.ts +12 -0
- package/src/rules/security/no-unlimited-resource-allocation.js +659 -0
- package/src/rules/security/no-unlimited-resource-allocation.js.map +1 -0
- package/src/rules/security/no-unsafe-deserialization.d.ts +10 -0
- package/src/rules/security/no-unsafe-deserialization.js +501 -0
- package/src/rules/security/no-unsafe-deserialization.js.map +1 -0
- package/src/rules/security/no-unsafe-dynamic-require.d.ts +5 -0
- package/src/rules/security/no-unsafe-dynamic-require.js +107 -0
- package/src/rules/security/no-unsafe-dynamic-require.js.map +1 -0
- package/src/rules/security/no-unsafe-regex-construction.d.ts +9 -0
- package/src/rules/security/no-unsafe-regex-construction.js +292 -0
- package/src/rules/security/no-unsafe-regex-construction.js.map +1 -0
- package/src/rules/security/no-unsanitized-html.d.ts +9 -0
- package/src/rules/security/no-unsanitized-html.js +347 -0
- package/src/rules/security/no-unsanitized-html.js.map +1 -0
- package/src/rules/security/no-unvalidated-user-input.d.ts +9 -0
- package/src/rules/security/no-unvalidated-user-input.js +418 -0
- package/src/rules/security/no-unvalidated-user-input.js.map +1 -0
- package/src/rules/security/no-weak-crypto.d.ts +11 -0
- package/src/rules/security/no-weak-crypto.js +350 -0
- package/src/rules/security/no-weak-crypto.js.map +1 -0
- package/src/rules/security/no-weak-password-recovery.d.ts +12 -0
- package/src/rules/security/no-weak-password-recovery.js +401 -0
- package/src/rules/security/no-weak-password-recovery.js.map +1 -0
- package/src/rules/security/no-xpath-injection.d.ts +10 -0
- package/src/rules/security/no-xpath-injection.js +487 -0
- package/src/rules/security/no-xpath-injection.js.map +1 -0
- package/src/rules/security/no-xxe-injection.d.ts +7 -0
- package/src/rules/security/no-xxe-injection.js +270 -0
- package/src/rules/security/no-xxe-injection.js.map +1 -0
- package/src/rules/security/no-zip-slip.d.ts +9 -0
- package/src/rules/security/no-zip-slip.js +446 -0
- package/src/rules/security/no-zip-slip.js.map +1 -0
- package/src/types/index.d.ts +131 -0
- package/src/types/index.js +18 -0
- package/src/types/index.js.map +1 -0
|
@@ -0,0 +1,487 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.noXpathInjection = void 0;
|
|
4
|
+
const eslint_devkit_1 = require("@interlace/eslint-devkit");
|
|
5
|
+
const eslint_devkit_2 = require("@interlace/eslint-devkit");
|
|
6
|
+
const eslint_devkit_3 = require("@interlace/eslint-devkit");
|
|
7
|
+
exports.noXpathInjection = (0, eslint_devkit_1.createRule)({
|
|
8
|
+
name: 'no-xpath-injection',
|
|
9
|
+
meta: {
|
|
10
|
+
type: 'problem',
|
|
11
|
+
docs: {
|
|
12
|
+
description: 'Detects XPath injection vulnerabilities',
|
|
13
|
+
},
|
|
14
|
+
fixable: 'code',
|
|
15
|
+
hasSuggestions: true,
|
|
16
|
+
messages: {
|
|
17
|
+
xpathInjection: (0, eslint_devkit_2.formatLLMMessage)({
|
|
18
|
+
icon: eslint_devkit_2.MessageIcons.SECURITY,
|
|
19
|
+
issueName: 'XPath Injection',
|
|
20
|
+
cwe: 'CWE-643',
|
|
21
|
+
description: 'XPath injection vulnerability detected',
|
|
22
|
+
severity: '{{severity}}',
|
|
23
|
+
fix: '{{safeAlternative}}',
|
|
24
|
+
documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
|
|
25
|
+
}),
|
|
26
|
+
unsafeXpathConcatenation: (0, eslint_devkit_2.formatLLMMessage)({
|
|
27
|
+
icon: eslint_devkit_2.MessageIcons.SECURITY,
|
|
28
|
+
issueName: 'Unsafe XPath Concatenation',
|
|
29
|
+
cwe: 'CWE-643',
|
|
30
|
+
description: 'Unsafe string concatenation in XPath expression',
|
|
31
|
+
severity: 'HIGH',
|
|
32
|
+
fix: 'Use parameterized XPath or escape user input',
|
|
33
|
+
documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
|
|
34
|
+
}),
|
|
35
|
+
unvalidatedXpathInput: (0, eslint_devkit_2.formatLLMMessage)({
|
|
36
|
+
icon: eslint_devkit_2.MessageIcons.SECURITY,
|
|
37
|
+
issueName: 'Unvalidated XPath Input',
|
|
38
|
+
cwe: 'CWE-643',
|
|
39
|
+
description: 'XPath query uses unvalidated user input',
|
|
40
|
+
severity: 'MEDIUM',
|
|
41
|
+
fix: 'Validate and sanitize XPath input before use',
|
|
42
|
+
documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
|
|
43
|
+
}),
|
|
44
|
+
dangerousXpathExpression: (0, eslint_devkit_2.formatLLMMessage)({
|
|
45
|
+
icon: eslint_devkit_2.MessageIcons.SECURITY,
|
|
46
|
+
issueName: 'Dangerous XPath Expression',
|
|
47
|
+
cwe: 'CWE-643',
|
|
48
|
+
description: 'XPath expression allows dangerous operations',
|
|
49
|
+
severity: 'MEDIUM',
|
|
50
|
+
fix: 'Restrict XPath to safe patterns and validate expressions',
|
|
51
|
+
documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
|
|
52
|
+
}),
|
|
53
|
+
useParameterizedXpath: (0, eslint_devkit_2.formatLLMMessage)({
|
|
54
|
+
icon: eslint_devkit_2.MessageIcons.INFO,
|
|
55
|
+
issueName: 'Use Parameterized XPath',
|
|
56
|
+
description: 'Use parameterized XPath queries',
|
|
57
|
+
severity: 'LOW',
|
|
58
|
+
fix: 'Construct XPath with proper escaping and validation',
|
|
59
|
+
documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
|
|
60
|
+
}),
|
|
61
|
+
escapeXpathInput: (0, eslint_devkit_2.formatLLMMessage)({
|
|
62
|
+
icon: eslint_devkit_2.MessageIcons.INFO,
|
|
63
|
+
issueName: 'Escape XPath Input',
|
|
64
|
+
description: 'Escape special characters in XPath input',
|
|
65
|
+
severity: 'LOW',
|
|
66
|
+
fix: 'Use xpath.escape() or equivalent escaping function',
|
|
67
|
+
documentationLink: 'https://www.npmjs.com/package/xpath-escape',
|
|
68
|
+
}),
|
|
69
|
+
validateXpathQueries: (0, eslint_devkit_2.formatLLMMessage)({
|
|
70
|
+
icon: eslint_devkit_2.MessageIcons.INFO,
|
|
71
|
+
issueName: 'Validate XPath Queries',
|
|
72
|
+
description: 'Validate XPath queries against allowed patterns',
|
|
73
|
+
severity: 'LOW',
|
|
74
|
+
fix: 'Whitelist allowed XPath operations and validate syntax',
|
|
75
|
+
documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
|
|
76
|
+
}),
|
|
77
|
+
strategyParameterizedQueries: (0, eslint_devkit_2.formatLLMMessage)({
|
|
78
|
+
icon: eslint_devkit_2.MessageIcons.STRATEGY,
|
|
79
|
+
issueName: 'Parameterized Queries Strategy',
|
|
80
|
+
description: 'Use parameterized XPath construction',
|
|
81
|
+
severity: 'LOW',
|
|
82
|
+
fix: 'Build XPath queries programmatically with escaped parameters',
|
|
83
|
+
documentationLink: 'https://owasp.org/www-community/attacks/XPATH_Injection',
|
|
84
|
+
}),
|
|
85
|
+
strategyInputValidation: (0, eslint_devkit_2.formatLLMMessage)({
|
|
86
|
+
icon: eslint_devkit_2.MessageIcons.STRATEGY,
|
|
87
|
+
issueName: 'Input Validation Strategy',
|
|
88
|
+
description: 'Validate XPath input at application boundary',
|
|
89
|
+
severity: 'LOW',
|
|
90
|
+
fix: 'Validate XPath syntax and restrict to safe operations',
|
|
91
|
+
documentationLink: 'https://cwe.mitre.org/data/definitions/643.html',
|
|
92
|
+
}),
|
|
93
|
+
strategySafeConstruction: (0, eslint_devkit_2.formatLLMMessage)({
|
|
94
|
+
icon: eslint_devkit_2.MessageIcons.STRATEGY,
|
|
95
|
+
issueName: 'Safe Construction Strategy',
|
|
96
|
+
description: 'Use safe XPath construction libraries',
|
|
97
|
+
severity: 'LOW',
|
|
98
|
+
fix: 'Use libraries that provide safe XPath building',
|
|
99
|
+
documentationLink: 'https://www.npmjs.com/package/xpath-builder',
|
|
100
|
+
})
|
|
101
|
+
},
|
|
102
|
+
schema: [
|
|
103
|
+
{
|
|
104
|
+
type: 'object',
|
|
105
|
+
properties: {
|
|
106
|
+
xpathFunctions: {
|
|
107
|
+
type: 'array',
|
|
108
|
+
items: { type: 'string' },
|
|
109
|
+
default: ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'],
|
|
110
|
+
},
|
|
111
|
+
safeXpathConstructors: {
|
|
112
|
+
type: 'array',
|
|
113
|
+
items: { type: 'string' },
|
|
114
|
+
default: ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'],
|
|
115
|
+
},
|
|
116
|
+
xpathValidationFunctions: {
|
|
117
|
+
type: 'array',
|
|
118
|
+
items: { type: 'string' },
|
|
119
|
+
default: ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'],
|
|
120
|
+
},
|
|
121
|
+
trustedSanitizers: {
|
|
122
|
+
type: 'array',
|
|
123
|
+
items: { type: 'string' },
|
|
124
|
+
default: [],
|
|
125
|
+
description: 'Additional function names to consider as XPath sanitizers',
|
|
126
|
+
},
|
|
127
|
+
trustedAnnotations: {
|
|
128
|
+
type: 'array',
|
|
129
|
+
items: { type: 'string' },
|
|
130
|
+
default: [],
|
|
131
|
+
description: 'Additional JSDoc annotations to consider as safe markers',
|
|
132
|
+
},
|
|
133
|
+
strictMode: {
|
|
134
|
+
type: 'boolean',
|
|
135
|
+
default: false,
|
|
136
|
+
description: 'Disable all false positive detection (strict mode)',
|
|
137
|
+
},
|
|
138
|
+
},
|
|
139
|
+
additionalProperties: false,
|
|
140
|
+
},
|
|
141
|
+
],
|
|
142
|
+
},
|
|
143
|
+
defaultOptions: [
|
|
144
|
+
{
|
|
145
|
+
xpathFunctions: ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'],
|
|
146
|
+
safeXpathConstructors: ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'],
|
|
147
|
+
xpathValidationFunctions: ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'],
|
|
148
|
+
trustedSanitizers: [],
|
|
149
|
+
trustedAnnotations: ['@xpath-safe'],
|
|
150
|
+
strictMode: false,
|
|
151
|
+
},
|
|
152
|
+
],
|
|
153
|
+
create(context) {
|
|
154
|
+
const options = context.options[0] || {};
|
|
155
|
+
const { xpathFunctions = ['evaluate', 'selectSingleNode', 'selectNodes', 'xpath', 'select'], safeXpathConstructors = ['buildXPath', 'createXPath', 'safeXPath', 'xpathBuilder'], xpathValidationFunctions = ['validateXPath', 'escapeXPath', 'sanitizeXPath', 'cleanXPath'], trustedSanitizers = [], trustedAnnotations = [], strictMode = false, } = options;
|
|
156
|
+
const sourceCode = context.sourceCode || context.sourceCode;
|
|
157
|
+
const filename = context.filename || context.getFilename();
|
|
158
|
+
// Create safety checker for false positive detection
|
|
159
|
+
const safetyChecker = (0, eslint_devkit_3.createSafetyChecker)({
|
|
160
|
+
trustedSanitizers,
|
|
161
|
+
trustedAnnotations,
|
|
162
|
+
trustedOrmPatterns: [],
|
|
163
|
+
strictMode,
|
|
164
|
+
});
|
|
165
|
+
// Track variables that have been validated/sanitized
|
|
166
|
+
const validatedVariables = new Set();
|
|
167
|
+
/**
|
|
168
|
+
* Check if this is an XPath-related operation
|
|
169
|
+
*/
|
|
170
|
+
const isXpathOperation = (node) => {
|
|
171
|
+
const callee = node.callee;
|
|
172
|
+
// Check for XPath method calls
|
|
173
|
+
if (callee.type === 'MemberExpression' &&
|
|
174
|
+
callee.property.type === 'Identifier' &&
|
|
175
|
+
xpathFunctions.includes(callee.property.name)) {
|
|
176
|
+
return true;
|
|
177
|
+
}
|
|
178
|
+
// Check for XPath library calls
|
|
179
|
+
if (callee.type === 'Identifier' && xpathFunctions.includes(callee.name)) {
|
|
180
|
+
return true;
|
|
181
|
+
}
|
|
182
|
+
return false;
|
|
183
|
+
};
|
|
184
|
+
/**
|
|
185
|
+
* Check if XPath expression contains dangerous patterns
|
|
186
|
+
*/
|
|
187
|
+
const containsDangerousXpath = (xpathText) => {
|
|
188
|
+
// Dangerous XPath patterns that allow traversal or injection
|
|
189
|
+
const dangerousPatterns = [
|
|
190
|
+
/\.\./, // Parent directory traversal
|
|
191
|
+
/\/\*/, // All children selector
|
|
192
|
+
/\[.*\*\]/, // Wildcard in predicates
|
|
193
|
+
/\/\//, // Descendant-or-self axis (can be dangerous in some contexts)
|
|
194
|
+
/text\(\)/, // Content extraction
|
|
195
|
+
/comment\(\)/, // Comment extraction
|
|
196
|
+
/processing-instruction\(\)/, // Processing instruction extraction
|
|
197
|
+
];
|
|
198
|
+
return dangerousPatterns.some(pattern => pattern.test(xpathText));
|
|
199
|
+
};
|
|
200
|
+
/**
|
|
201
|
+
* Check if string contains XPath interpolation
|
|
202
|
+
*/
|
|
203
|
+
const containsXpathInterpolation = (text) => {
|
|
204
|
+
return /\$\{[^}]+\}/.test(text) || /'[^']*\+[^+]*'/.test(text) || /"[^"]*\+[^+]*"/.test(text);
|
|
205
|
+
};
|
|
206
|
+
/**
|
|
207
|
+
* Check if XPath input is from untrusted source
|
|
208
|
+
*/
|
|
209
|
+
const isUntrustedXpathInput = (inputNode) => {
|
|
210
|
+
if (inputNode.type === 'MemberExpression') {
|
|
211
|
+
// Check patterns like req.query.*, req.body.*, req.params.*
|
|
212
|
+
if (inputNode.object.type === 'MemberExpression' &&
|
|
213
|
+
inputNode.object.object.type === 'Identifier' &&
|
|
214
|
+
inputNode.object.object.name === 'req' &&
|
|
215
|
+
inputNode.object.property.type === 'Identifier' &&
|
|
216
|
+
['query', 'body', 'params', 'param'].includes(inputNode.object.property.name)) {
|
|
217
|
+
return true;
|
|
218
|
+
}
|
|
219
|
+
// Check patterns like req.*
|
|
220
|
+
if (inputNode.object.type === 'Identifier' && inputNode.object.name === 'req') {
|
|
221
|
+
return true;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
if (inputNode.type !== 'Identifier') {
|
|
225
|
+
return false;
|
|
226
|
+
}
|
|
227
|
+
const varName = inputNode.name.toLowerCase();
|
|
228
|
+
if (['req', 'request', 'query', 'params', 'input', 'user', 'search'].some(keyword => varName.includes(keyword))) {
|
|
229
|
+
return true;
|
|
230
|
+
}
|
|
231
|
+
// Check if it comes from function parameters
|
|
232
|
+
let current = inputNode;
|
|
233
|
+
while (current) {
|
|
234
|
+
if (current.type === 'FunctionDeclaration' ||
|
|
235
|
+
current.type === 'FunctionExpression' ||
|
|
236
|
+
current.type === 'ArrowFunctionExpression') {
|
|
237
|
+
const func = current;
|
|
238
|
+
return func.params.some((param) => {
|
|
239
|
+
if (param.type === 'Identifier') {
|
|
240
|
+
return param.name === inputNode.name;
|
|
241
|
+
}
|
|
242
|
+
return false;
|
|
243
|
+
});
|
|
244
|
+
}
|
|
245
|
+
current = current.parent;
|
|
246
|
+
}
|
|
247
|
+
return false;
|
|
248
|
+
};
|
|
249
|
+
/**
|
|
250
|
+
* Check if XPath input has been validated
|
|
251
|
+
*/
|
|
252
|
+
const isXpathInputValidated = (inputNode) => {
|
|
253
|
+
let current = inputNode;
|
|
254
|
+
while (current) {
|
|
255
|
+
if (current.type === 'CallExpression' &&
|
|
256
|
+
current.callee.type === 'Identifier' &&
|
|
257
|
+
xpathValidationFunctions.includes(current.callee.name)) {
|
|
258
|
+
return true;
|
|
259
|
+
}
|
|
260
|
+
current = current.parent;
|
|
261
|
+
}
|
|
262
|
+
return false;
|
|
263
|
+
};
|
|
264
|
+
/**
|
|
265
|
+
* Check for safe annotation on containing statement or variable declaration
|
|
266
|
+
*/
|
|
267
|
+
const hasSafeAnnotationOnStatement = (node) => {
|
|
268
|
+
let current = node;
|
|
269
|
+
// Walk up to find VariableDeclaration, ExpressionStatement, FunctionDeclaration, or containing statement
|
|
270
|
+
while (current) {
|
|
271
|
+
if (current.type === 'VariableDeclaration' ||
|
|
272
|
+
current.type === 'ExpressionStatement' ||
|
|
273
|
+
current.type === 'FunctionDeclaration') {
|
|
274
|
+
// Check for JSDoc comments before this statement
|
|
275
|
+
const comments = sourceCode.getCommentsBefore(current);
|
|
276
|
+
for (const comment of comments) {
|
|
277
|
+
if (comment.type === 'Block' && comment.value.includes('@xpath-safe')) {
|
|
278
|
+
return true;
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
current = current.parent;
|
|
283
|
+
}
|
|
284
|
+
return false;
|
|
285
|
+
};
|
|
286
|
+
/**
|
|
287
|
+
* Check if XPath is constructed safely
|
|
288
|
+
*/
|
|
289
|
+
const isSafeXpathConstruction = (node) => {
|
|
290
|
+
let current = node;
|
|
291
|
+
while (current) {
|
|
292
|
+
if (current.type === 'CallExpression' &&
|
|
293
|
+
current.callee.type === 'Identifier' &&
|
|
294
|
+
safeXpathConstructors.includes(current.callee.name)) {
|
|
295
|
+
return true;
|
|
296
|
+
}
|
|
297
|
+
current = current.parent;
|
|
298
|
+
}
|
|
299
|
+
return false;
|
|
300
|
+
};
|
|
301
|
+
return {
|
|
302
|
+
// Check XPath function calls
|
|
303
|
+
CallExpression(node) {
|
|
304
|
+
if (!isXpathOperation(node)) {
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
const args = node.arguments;
|
|
308
|
+
if (args.length === 0) {
|
|
309
|
+
return;
|
|
310
|
+
}
|
|
311
|
+
// Check first argument (usually the XPath expression)
|
|
312
|
+
const xpathArg = args[0];
|
|
313
|
+
if (xpathArg.type === 'Literal' && typeof xpathArg.value === 'string') {
|
|
314
|
+
const xpathText = xpathArg.value;
|
|
315
|
+
// Check for dangerous XPath patterns
|
|
316
|
+
if (containsDangerousXpath(xpathText)) {
|
|
317
|
+
// FALSE POSITIVE REDUCTION: Skip if annotated as safe
|
|
318
|
+
if ((0, eslint_devkit_3.hasSafeAnnotation)(xpathArg, context, trustedAnnotations) || hasSafeAnnotationOnStatement(node)) {
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
context.report({
|
|
322
|
+
node: xpathArg,
|
|
323
|
+
messageId: 'dangerousXpathExpression',
|
|
324
|
+
data: {
|
|
325
|
+
filePath: filename,
|
|
326
|
+
line: String(node.loc?.start.line ?? 0),
|
|
327
|
+
},
|
|
328
|
+
});
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
else if (xpathArg.type === 'Identifier') {
|
|
332
|
+
// Check if XPath comes from untrusted input
|
|
333
|
+
if (isUntrustedXpathInput(xpathArg) && !isXpathInputValidated(xpathArg) &&
|
|
334
|
+
!(xpathArg.type === 'Identifier' && validatedVariables.has(xpathArg.name))) {
|
|
335
|
+
// FALSE POSITIVE REDUCTION
|
|
336
|
+
if ((0, eslint_devkit_3.hasSafeAnnotation)(xpathArg, context, trustedAnnotations) || safetyChecker.isSafe(xpathArg, context) || hasSafeAnnotationOnStatement(node)) {
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
context.report({
|
|
340
|
+
node: xpathArg,
|
|
341
|
+
messageId: 'unvalidatedXpathInput',
|
|
342
|
+
data: {
|
|
343
|
+
filePath: filename,
|
|
344
|
+
line: String(node.loc?.start.line ?? 0),
|
|
345
|
+
},
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
},
|
|
350
|
+
// Check template literals for XPath expressions
|
|
351
|
+
TemplateLiteral(node) {
|
|
352
|
+
const fullText = sourceCode.getText(node);
|
|
353
|
+
// Check if this looks like an XPath expression
|
|
354
|
+
if (!fullText.includes('/') && !fullText.includes('[') && !fullText.includes('@')) {
|
|
355
|
+
return;
|
|
356
|
+
}
|
|
357
|
+
// Check for interpolation in XPath-like expressions
|
|
358
|
+
if (containsXpathInterpolation(fullText)) {
|
|
359
|
+
// Check if any interpolated values are untrusted
|
|
360
|
+
const hasUntrustedInterpolation = node.expressions.some((expr) => isUntrustedXpathInput(expr) && !isXpathInputValidated(expr) && !(expr.type === 'Identifier' && validatedVariables.has(expr.name)));
|
|
361
|
+
if (hasUntrustedInterpolation) {
|
|
362
|
+
// FALSE POSITIVE REDUCTION: Check for safe annotation
|
|
363
|
+
if (hasSafeAnnotationOnStatement(node)) {
|
|
364
|
+
return;
|
|
365
|
+
}
|
|
366
|
+
context.report({
|
|
367
|
+
node,
|
|
368
|
+
messageId: 'unsafeXpathConcatenation',
|
|
369
|
+
data: {
|
|
370
|
+
filePath: filename,
|
|
371
|
+
line: String(node.loc?.start.line ?? 0),
|
|
372
|
+
},
|
|
373
|
+
suggest: [
|
|
374
|
+
{
|
|
375
|
+
messageId: 'useParameterizedXpath',
|
|
376
|
+
fix: () => null
|
|
377
|
+
},
|
|
378
|
+
],
|
|
379
|
+
});
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
// Check for dangerous patterns in template literals
|
|
383
|
+
if (containsDangerousXpath(fullText)) {
|
|
384
|
+
// FALSE POSITIVE REDUCTION: Check for safe annotation
|
|
385
|
+
if (hasSafeAnnotationOnStatement(node)) {
|
|
386
|
+
return;
|
|
387
|
+
}
|
|
388
|
+
context.report({
|
|
389
|
+
node,
|
|
390
|
+
messageId: 'dangerousXpathExpression',
|
|
391
|
+
data: {
|
|
392
|
+
filePath: filename,
|
|
393
|
+
line: String(node.loc?.start.line ?? 0),
|
|
394
|
+
},
|
|
395
|
+
});
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
// Check binary expressions (string concatenation)
|
|
399
|
+
BinaryExpression(node) {
|
|
400
|
+
if (node.operator !== '+') {
|
|
401
|
+
return;
|
|
402
|
+
}
|
|
403
|
+
const fullText = sourceCode.getText(node);
|
|
404
|
+
// Check if this looks like XPath construction
|
|
405
|
+
if (!fullText.includes('/') && !fullText.includes('[')) {
|
|
406
|
+
return;
|
|
407
|
+
}
|
|
408
|
+
// Check if either side contains XPath-like patterns
|
|
409
|
+
const leftText = sourceCode.getText(node.left);
|
|
410
|
+
const rightText = sourceCode.getText(node.right);
|
|
411
|
+
if ((leftText.includes('/') || leftText.includes('[')) ||
|
|
412
|
+
(rightText.includes('/') || rightText.includes('['))) {
|
|
413
|
+
// Check if untrusted input is involved
|
|
414
|
+
const leftUntrusted = isUntrustedXpathInput(node.left) && !isXpathInputValidated(node.left) && !(node.left.type === 'Identifier' && validatedVariables.has(node.left.name));
|
|
415
|
+
const rightUntrusted = isUntrustedXpathInput(node.right) && !isXpathInputValidated(node.right) && !(node.right.type === 'Identifier' && validatedVariables.has(node.right.name));
|
|
416
|
+
if (leftUntrusted || rightUntrusted) {
|
|
417
|
+
// FALSE POSITIVE REDUCTION
|
|
418
|
+
if (safetyChecker.isSafe(node, context) || hasSafeAnnotationOnStatement(node)) {
|
|
419
|
+
return;
|
|
420
|
+
}
|
|
421
|
+
context.report({
|
|
422
|
+
node,
|
|
423
|
+
messageId: 'xpathInjection',
|
|
424
|
+
data: {
|
|
425
|
+
filePath: filename,
|
|
426
|
+
line: String(node.loc?.start.line ?? 0),
|
|
427
|
+
severity: 'HIGH',
|
|
428
|
+
safeAlternative: 'Use parameterized XPath construction with input validation',
|
|
429
|
+
},
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
},
|
|
434
|
+
// Check variable assignments with XPath expressions
|
|
435
|
+
VariableDeclarator(node) {
|
|
436
|
+
if (!node.init || node.id.type !== 'Identifier') {
|
|
437
|
+
return;
|
|
438
|
+
}
|
|
439
|
+
const varName = node.id.name;
|
|
440
|
+
// Track variables that are assigned the result of sanitization functions
|
|
441
|
+
if (node.init.type === 'CallExpression' &&
|
|
442
|
+
node.init.callee.type === 'Identifier' &&
|
|
443
|
+
(xpathValidationFunctions.includes(node.init.callee.name) || trustedSanitizers.includes(node.init.callee.name))) {
|
|
444
|
+
validatedVariables.add(varName);
|
|
445
|
+
}
|
|
446
|
+
const varNameLower = varName.toLowerCase();
|
|
447
|
+
if (!varNameLower.includes('xpath') && !varNameLower.includes('query') && !varNameLower.includes('path')) {
|
|
448
|
+
return;
|
|
449
|
+
}
|
|
450
|
+
// Check if assigned value contains dangerous XPath
|
|
451
|
+
if (node.init.type === 'Literal' && typeof node.init.value === 'string') {
|
|
452
|
+
if (containsDangerousXpath(node.init.value)) {
|
|
453
|
+
// FALSE POSITIVE REDUCTION
|
|
454
|
+
if (safetyChecker.isSafe(node.init, context) || hasSafeAnnotationOnStatement(node)) {
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
context.report({
|
|
458
|
+
node: node.init,
|
|
459
|
+
messageId: 'dangerousXpathExpression',
|
|
460
|
+
data: {
|
|
461
|
+
filePath: filename,
|
|
462
|
+
line: String(node.loc?.start.line ?? 0),
|
|
463
|
+
},
|
|
464
|
+
});
|
|
465
|
+
}
|
|
466
|
+
}
|
|
467
|
+
else if (isUntrustedXpathInput(node.init) && !isSafeXpathConstruction(node.init)) {
|
|
468
|
+
// FALSE POSITIVE REDUCTION
|
|
469
|
+
if (safetyChecker.isSafe(node.init, context)) {
|
|
470
|
+
return;
|
|
471
|
+
}
|
|
472
|
+
context.report({
|
|
473
|
+
node: node.init,
|
|
474
|
+
messageId: 'xpathInjection',
|
|
475
|
+
data: {
|
|
476
|
+
filePath: filename,
|
|
477
|
+
line: String(node.loc?.start.line ?? 0),
|
|
478
|
+
severity: 'MEDIUM',
|
|
479
|
+
safeAlternative: 'Use safe XPath construction methods',
|
|
480
|
+
},
|
|
481
|
+
});
|
|
482
|
+
}
|
|
483
|
+
}
|
|
484
|
+
};
|
|
485
|
+
},
|
|
486
|
+
});
|
|
487
|
+
//# sourceMappingURL=no-xpath-injection.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"no-xpath-injection.js","sourceRoot":"","sources":["../../../../../../packages/eslint-plugin-secure-coding/src/rules/security/no-xpath-injection.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export interface Options {
|
|
2
|
+
/** Parser options that indicate safe configuration */
|
|
3
|
+
safeParserOptions?: string[];
|
|
4
|
+
/** Functions that validate/sanitize XML input */
|
|
5
|
+
xmlValidationFunctions?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare const noXxeInjection: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
|