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.
Files changed (155) hide show
  1. package/AGENTS.md +196 -0
  2. package/CHANGELOG.md +105 -0
  3. package/LICENSE +23 -0
  4. package/README.md +377 -0
  5. package/package.json +80 -0
  6. package/src/index.d.ts +32 -0
  7. package/src/index.js +345 -0
  8. package/src/index.js.map +1 -0
  9. package/src/rules/security/database-injection.d.ts +13 -0
  10. package/src/rules/security/database-injection.js +407 -0
  11. package/src/rules/security/database-injection.js.map +1 -0
  12. package/src/rules/security/detect-child-process.d.ts +11 -0
  13. package/src/rules/security/detect-child-process.js +460 -0
  14. package/src/rules/security/detect-child-process.js.map +1 -0
  15. package/src/rules/security/detect-eval-with-expression.d.ts +9 -0
  16. package/src/rules/security/detect-eval-with-expression.js +393 -0
  17. package/src/rules/security/detect-eval-with-expression.js.map +1 -0
  18. package/src/rules/security/detect-non-literal-fs-filename.d.ts +7 -0
  19. package/src/rules/security/detect-non-literal-fs-filename.js +322 -0
  20. package/src/rules/security/detect-non-literal-fs-filename.js.map +1 -0
  21. package/src/rules/security/detect-non-literal-regexp.d.ts +9 -0
  22. package/src/rules/security/detect-non-literal-regexp.js +387 -0
  23. package/src/rules/security/detect-non-literal-regexp.js.map +1 -0
  24. package/src/rules/security/detect-object-injection.d.ts +11 -0
  25. package/src/rules/security/detect-object-injection.js +411 -0
  26. package/src/rules/security/detect-object-injection.js.map +1 -0
  27. package/src/rules/security/no-buffer-overread.d.ts +14 -0
  28. package/src/rules/security/no-buffer-overread.js +519 -0
  29. package/src/rules/security/no-buffer-overread.js.map +1 -0
  30. package/src/rules/security/no-clickjacking.d.ts +10 -0
  31. package/src/rules/security/no-clickjacking.js +381 -0
  32. package/src/rules/security/no-clickjacking.js.map +1 -0
  33. package/src/rules/security/no-directive-injection.d.ts +12 -0
  34. package/src/rules/security/no-directive-injection.js +446 -0
  35. package/src/rules/security/no-directive-injection.js.map +1 -0
  36. package/src/rules/security/no-document-cookie.d.ts +5 -0
  37. package/src/rules/security/no-document-cookie.js +90 -0
  38. package/src/rules/security/no-document-cookie.js.map +1 -0
  39. package/src/rules/security/no-electron-security-issues.d.ts +10 -0
  40. package/src/rules/security/no-electron-security-issues.js +421 -0
  41. package/src/rules/security/no-electron-security-issues.js.map +1 -0
  42. package/src/rules/security/no-exposed-sensitive-data.d.ts +11 -0
  43. package/src/rules/security/no-exposed-sensitive-data.js +341 -0
  44. package/src/rules/security/no-exposed-sensitive-data.js.map +1 -0
  45. package/src/rules/security/no-format-string-injection.d.ts +17 -0
  46. package/src/rules/security/no-format-string-injection.js +653 -0
  47. package/src/rules/security/no-format-string-injection.js.map +1 -0
  48. package/src/rules/security/no-graphql-injection.d.ts +12 -0
  49. package/src/rules/security/no-graphql-injection.js +410 -0
  50. package/src/rules/security/no-graphql-injection.js.map +1 -0
  51. package/src/rules/security/no-hardcoded-credentials.d.ts +26 -0
  52. package/src/rules/security/no-hardcoded-credentials.js +377 -0
  53. package/src/rules/security/no-hardcoded-credentials.js.map +1 -0
  54. package/src/rules/security/no-improper-sanitization.d.ts +12 -0
  55. package/src/rules/security/no-improper-sanitization.js +408 -0
  56. package/src/rules/security/no-improper-sanitization.js.map +1 -0
  57. package/src/rules/security/no-improper-type-validation.d.ts +10 -0
  58. package/src/rules/security/no-improper-type-validation.js +420 -0
  59. package/src/rules/security/no-improper-type-validation.js.map +1 -0
  60. package/src/rules/security/no-insecure-comparison.d.ts +7 -0
  61. package/src/rules/security/no-insecure-comparison.js +125 -0
  62. package/src/rules/security/no-insecure-comparison.js.map +1 -0
  63. package/src/rules/security/no-insecure-cookie-settings.d.ts +9 -0
  64. package/src/rules/security/no-insecure-cookie-settings.js +305 -0
  65. package/src/rules/security/no-insecure-cookie-settings.js.map +1 -0
  66. package/src/rules/security/no-insecure-jwt.d.ts +10 -0
  67. package/src/rules/security/no-insecure-jwt.js +338 -0
  68. package/src/rules/security/no-insecure-jwt.js.map +1 -0
  69. package/src/rules/security/no-insecure-redirects.d.ts +7 -0
  70. package/src/rules/security/no-insecure-redirects.js +215 -0
  71. package/src/rules/security/no-insecure-redirects.js.map +1 -0
  72. package/src/rules/security/no-insufficient-postmessage-validation.d.ts +14 -0
  73. package/src/rules/security/no-insufficient-postmessage-validation.js +390 -0
  74. package/src/rules/security/no-insufficient-postmessage-validation.js.map +1 -0
  75. package/src/rules/security/no-insufficient-random.d.ts +9 -0
  76. package/src/rules/security/no-insufficient-random.js +207 -0
  77. package/src/rules/security/no-insufficient-random.js.map +1 -0
  78. package/src/rules/security/no-ldap-injection.d.ts +10 -0
  79. package/src/rules/security/no-ldap-injection.js +449 -0
  80. package/src/rules/security/no-ldap-injection.js.map +1 -0
  81. package/src/rules/security/no-missing-authentication.d.ts +13 -0
  82. package/src/rules/security/no-missing-authentication.js +322 -0
  83. package/src/rules/security/no-missing-authentication.js.map +1 -0
  84. package/src/rules/security/no-missing-cors-check.d.ts +9 -0
  85. package/src/rules/security/no-missing-cors-check.js +449 -0
  86. package/src/rules/security/no-missing-cors-check.js.map +1 -0
  87. package/src/rules/security/no-missing-csrf-protection.d.ts +11 -0
  88. package/src/rules/security/no-missing-csrf-protection.js +183 -0
  89. package/src/rules/security/no-missing-csrf-protection.js.map +1 -0
  90. package/src/rules/security/no-missing-security-headers.d.ts +7 -0
  91. package/src/rules/security/no-missing-security-headers.js +217 -0
  92. package/src/rules/security/no-missing-security-headers.js.map +1 -0
  93. package/src/rules/security/no-privilege-escalation.d.ts +13 -0
  94. package/src/rules/security/no-privilege-escalation.js +321 -0
  95. package/src/rules/security/no-privilege-escalation.js.map +1 -0
  96. package/src/rules/security/no-redos-vulnerable-regex.d.ts +7 -0
  97. package/src/rules/security/no-redos-vulnerable-regex.js +307 -0
  98. package/src/rules/security/no-redos-vulnerable-regex.js.map +1 -0
  99. package/src/rules/security/no-sensitive-data-exposure.d.ts +11 -0
  100. package/src/rules/security/no-sensitive-data-exposure.js +251 -0
  101. package/src/rules/security/no-sensitive-data-exposure.js.map +1 -0
  102. package/src/rules/security/no-sql-injection.d.ts +10 -0
  103. package/src/rules/security/no-sql-injection.js +332 -0
  104. package/src/rules/security/no-sql-injection.js.map +1 -0
  105. package/src/rules/security/no-timing-attack.d.ts +10 -0
  106. package/src/rules/security/no-timing-attack.js +358 -0
  107. package/src/rules/security/no-timing-attack.js.map +1 -0
  108. package/src/rules/security/no-toctou-vulnerability.d.ts +7 -0
  109. package/src/rules/security/no-toctou-vulnerability.js +165 -0
  110. package/src/rules/security/no-toctou-vulnerability.js.map +1 -0
  111. package/src/rules/security/no-unchecked-loop-condition.d.ts +12 -0
  112. package/src/rules/security/no-unchecked-loop-condition.js +635 -0
  113. package/src/rules/security/no-unchecked-loop-condition.js.map +1 -0
  114. package/src/rules/security/no-unencrypted-transmission.d.ts +11 -0
  115. package/src/rules/security/no-unencrypted-transmission.js +237 -0
  116. package/src/rules/security/no-unencrypted-transmission.js.map +1 -0
  117. package/src/rules/security/no-unescaped-url-parameter.d.ts +9 -0
  118. package/src/rules/security/no-unescaped-url-parameter.js +266 -0
  119. package/src/rules/security/no-unescaped-url-parameter.js.map +1 -0
  120. package/src/rules/security/no-unlimited-resource-allocation.d.ts +12 -0
  121. package/src/rules/security/no-unlimited-resource-allocation.js +659 -0
  122. package/src/rules/security/no-unlimited-resource-allocation.js.map +1 -0
  123. package/src/rules/security/no-unsafe-deserialization.d.ts +10 -0
  124. package/src/rules/security/no-unsafe-deserialization.js +501 -0
  125. package/src/rules/security/no-unsafe-deserialization.js.map +1 -0
  126. package/src/rules/security/no-unsafe-dynamic-require.d.ts +5 -0
  127. package/src/rules/security/no-unsafe-dynamic-require.js +107 -0
  128. package/src/rules/security/no-unsafe-dynamic-require.js.map +1 -0
  129. package/src/rules/security/no-unsafe-regex-construction.d.ts +9 -0
  130. package/src/rules/security/no-unsafe-regex-construction.js +292 -0
  131. package/src/rules/security/no-unsafe-regex-construction.js.map +1 -0
  132. package/src/rules/security/no-unsanitized-html.d.ts +9 -0
  133. package/src/rules/security/no-unsanitized-html.js +347 -0
  134. package/src/rules/security/no-unsanitized-html.js.map +1 -0
  135. package/src/rules/security/no-unvalidated-user-input.d.ts +9 -0
  136. package/src/rules/security/no-unvalidated-user-input.js +418 -0
  137. package/src/rules/security/no-unvalidated-user-input.js.map +1 -0
  138. package/src/rules/security/no-weak-crypto.d.ts +11 -0
  139. package/src/rules/security/no-weak-crypto.js +350 -0
  140. package/src/rules/security/no-weak-crypto.js.map +1 -0
  141. package/src/rules/security/no-weak-password-recovery.d.ts +12 -0
  142. package/src/rules/security/no-weak-password-recovery.js +401 -0
  143. package/src/rules/security/no-weak-password-recovery.js.map +1 -0
  144. package/src/rules/security/no-xpath-injection.d.ts +10 -0
  145. package/src/rules/security/no-xpath-injection.js +487 -0
  146. package/src/rules/security/no-xpath-injection.js.map +1 -0
  147. package/src/rules/security/no-xxe-injection.d.ts +7 -0
  148. package/src/rules/security/no-xxe-injection.js +270 -0
  149. package/src/rules/security/no-xxe-injection.js.map +1 -0
  150. package/src/rules/security/no-zip-slip.d.ts +9 -0
  151. package/src/rules/security/no-zip-slip.js +446 -0
  152. package/src/rules/security/no-zip-slip.js.map +1 -0
  153. package/src/types/index.d.ts +131 -0
  154. package/src/types/index.js +18 -0
  155. 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>;