eslint-plugin-secure-coding 2.3.2 → 2.3.3

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 (361) hide show
  1. package/README.md +1 -0
  2. package/package.json +3 -10
  3. package/src/index.ts +605 -0
  4. package/src/rules/__tests__/integration-demo.test.ts +290 -0
  5. package/src/rules/__tests__/integration-llm.test.ts +89 -0
  6. package/src/rules/database-injection/database-injection.test.ts +456 -0
  7. package/src/rules/database-injection/index.ts +488 -0
  8. package/src/rules/detect-child-process/detect-child-process.test.ts +207 -0
  9. package/src/rules/detect-child-process/index.ts +634 -0
  10. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +416 -0
  11. package/src/rules/detect-eval-with-expression/index.ts +463 -0
  12. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +28 -0
  13. package/src/rules/detect-mixed-content/index.ts +52 -0
  14. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +269 -0
  15. package/src/rules/detect-non-literal-fs-filename/index.ts +551 -0
  16. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +189 -0
  17. package/src/rules/detect-non-literal-regexp/index.ts +490 -0
  18. package/src/rules/detect-object-injection/detect-object-injection.test.ts +440 -0
  19. package/src/rules/detect-object-injection/index.ts +674 -0
  20. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +32 -0
  21. package/src/rules/detect-suspicious-dependencies/index.ts +84 -0
  22. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +31 -0
  23. package/src/rules/detect-weak-password-validation/index.ts +68 -0
  24. package/src/rules/no-allow-arbitrary-loads/index.ts +54 -0
  25. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +28 -0
  26. package/src/rules/no-arbitrary-file-access/index.ts +238 -0
  27. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +119 -0
  28. package/src/rules/no-buffer-overread/index.ts +724 -0
  29. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +313 -0
  30. package/src/rules/no-clickjacking/index.ts +481 -0
  31. package/src/rules/no-clickjacking/no-clickjacking.test.ts +253 -0
  32. package/src/rules/no-client-side-auth-logic/index.ts +81 -0
  33. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +33 -0
  34. package/src/rules/no-credentials-in-query-params/index.ts +69 -0
  35. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +33 -0
  36. package/src/rules/no-credentials-in-storage-api/index.ts +64 -0
  37. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +31 -0
  38. package/src/rules/no-data-in-temp-storage/index.ts +75 -0
  39. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +33 -0
  40. package/src/rules/no-debug-code-in-production/index.ts +59 -0
  41. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +26 -0
  42. package/src/rules/no-directive-injection/index.ts +551 -0
  43. package/src/rules/no-directive-injection/no-directive-injection.test.ts +305 -0
  44. package/src/rules/no-disabled-certificate-validation/index.ts +72 -0
  45. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +33 -0
  46. package/src/rules/no-document-cookie/index.ts +113 -0
  47. package/src/rules/no-document-cookie/no-document-cookie.test.ts +382 -0
  48. package/src/rules/no-dynamic-dependency-loading/index.ts +60 -0
  49. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +27 -0
  50. package/src/rules/no-electron-security-issues/index.ts +504 -0
  51. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +324 -0
  52. package/src/rules/no-exposed-debug-endpoints/index.ts +73 -0
  53. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +40 -0
  54. package/src/rules/no-exposed-sensitive-data/index.ts +428 -0
  55. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +75 -0
  56. package/src/rules/no-format-string-injection/index.ts +801 -0
  57. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +437 -0
  58. package/src/rules/no-graphql-injection/index.ts +508 -0
  59. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +371 -0
  60. package/src/rules/no-hardcoded-credentials/index.ts +478 -0
  61. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +639 -0
  62. package/src/rules/no-hardcoded-session-tokens/index.ts +69 -0
  63. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +42 -0
  64. package/src/rules/no-http-urls/index.ts +131 -0
  65. package/src/rules/no-http-urls/no-http-urls.test.ts +60 -0
  66. package/src/rules/no-improper-sanitization/index.ts +502 -0
  67. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +156 -0
  68. package/src/rules/no-improper-type-validation/index.ts +572 -0
  69. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +372 -0
  70. package/src/rules/no-insecure-comparison/index.ts +232 -0
  71. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +218 -0
  72. package/src/rules/no-insecure-cookie-settings/index.ts +391 -0
  73. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +409 -0
  74. package/src/rules/no-insecure-jwt/index.ts +467 -0
  75. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +259 -0
  76. package/src/rules/no-insecure-redirects/index.ts +267 -0
  77. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +108 -0
  78. package/src/rules/no-insecure-websocket/index.ts +72 -0
  79. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +42 -0
  80. package/src/rules/no-insufficient-postmessage-validation/index.ts +497 -0
  81. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +360 -0
  82. package/src/rules/no-insufficient-random/index.ts +288 -0
  83. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +246 -0
  84. package/src/rules/no-ldap-injection/index.ts +547 -0
  85. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +317 -0
  86. package/src/rules/no-missing-authentication/index.ts +408 -0
  87. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +350 -0
  88. package/src/rules/no-missing-cors-check/index.ts +453 -0
  89. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +392 -0
  90. package/src/rules/no-missing-csrf-protection/index.ts +229 -0
  91. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +222 -0
  92. package/src/rules/no-missing-security-headers/index.ts +266 -0
  93. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +98 -0
  94. package/src/rules/no-password-in-url/index.ts +64 -0
  95. package/src/rules/no-password-in-url/no-password-in-url.test.ts +27 -0
  96. package/src/rules/no-permissive-cors/index.ts +78 -0
  97. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +28 -0
  98. package/src/rules/no-pii-in-logs/index.ts +83 -0
  99. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +26 -0
  100. package/src/rules/no-postmessage-origin-wildcard/index.ts +67 -0
  101. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +27 -0
  102. package/src/rules/no-privilege-escalation/index.ts +403 -0
  103. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +306 -0
  104. package/src/rules/no-redos-vulnerable-regex/index.ts +379 -0
  105. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +83 -0
  106. package/src/rules/no-sensitive-data-exposure/index.ts +294 -0
  107. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +262 -0
  108. package/src/rules/no-sensitive-data-in-analytics/index.ts +73 -0
  109. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +42 -0
  110. package/src/rules/no-sensitive-data-in-cache/index.ts +59 -0
  111. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +32 -0
  112. package/src/rules/no-sql-injection/index.ts +424 -0
  113. package/src/rules/no-sql-injection/no-sql-injection.test.ts +303 -0
  114. package/src/rules/no-timing-attack/index.ts +552 -0
  115. package/src/rules/no-timing-attack/no-timing-attack.test.ts +348 -0
  116. package/src/rules/no-toctou-vulnerability/index.ts +250 -0
  117. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +60 -0
  118. package/src/rules/no-tracking-without-consent/index.ts +78 -0
  119. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +34 -0
  120. package/src/rules/no-unchecked-loop-condition/index.ts +781 -0
  121. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +459 -0
  122. package/src/rules/no-unencrypted-local-storage/index.ts +73 -0
  123. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +41 -0
  124. package/src/rules/no-unencrypted-transmission/index.ts +296 -0
  125. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +287 -0
  126. package/src/rules/no-unescaped-url-parameter/index.ts +424 -0
  127. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +263 -0
  128. package/src/rules/no-unlimited-resource-allocation/index.ts +767 -0
  129. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +544 -0
  130. package/src/rules/no-unsafe-deserialization/index.ts +593 -0
  131. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +310 -0
  132. package/src/rules/no-unsafe-dynamic-require/index.ts +125 -0
  133. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +151 -0
  134. package/src/rules/no-unsafe-regex-construction/index.ts +370 -0
  135. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +181 -0
  136. package/src/rules/no-unsanitized-html/index.ts +400 -0
  137. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +488 -0
  138. package/src/rules/no-unvalidated-deeplinks/index.ts +73 -0
  139. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +29 -0
  140. package/src/rules/no-unvalidated-user-input/index.ts +498 -0
  141. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +463 -0
  142. package/src/rules/no-verbose-error-messages/index.ts +83 -0
  143. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +34 -0
  144. package/src/rules/no-weak-crypto/index.ts +447 -0
  145. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +297 -0
  146. package/src/rules/no-weak-password-recovery/index.ts +509 -0
  147. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +184 -0
  148. package/src/rules/no-xpath-injection/index.ts +596 -0
  149. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +405 -0
  150. package/src/rules/no-xxe-injection/index.ts +342 -0
  151. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +122 -0
  152. package/src/rules/no-zip-slip/index.ts +526 -0
  153. package/src/rules/no-zip-slip/no-zip-slip.test.ts +305 -0
  154. package/src/rules/require-backend-authorization/index.ts +71 -0
  155. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +31 -0
  156. package/src/rules/require-code-minification/index.ts +54 -0
  157. package/src/rules/require-code-minification/require-code-minification.test.ts +30 -0
  158. package/src/rules/require-csp-headers/index.ts +74 -0
  159. package/src/rules/require-csp-headers/require-csp-headers.test.ts +34 -0
  160. package/src/rules/require-data-minimization/index.ts +65 -0
  161. package/src/rules/require-data-minimization/require-data-minimization.test.ts +31 -0
  162. package/src/rules/require-dependency-integrity/index.ts +78 -0
  163. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +44 -0
  164. package/src/rules/require-https-only/index.ts +75 -0
  165. package/src/rules/require-https-only/require-https-only.test.ts +26 -0
  166. package/src/rules/require-mime-type-validation/index.ts +77 -0
  167. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +32 -0
  168. package/src/rules/require-network-timeout/index.ts +58 -0
  169. package/src/rules/require-network-timeout/require-network-timeout.test.ts +26 -0
  170. package/src/rules/require-package-lock/index.ts +75 -0
  171. package/src/rules/require-package-lock/require-package-lock.test.ts +27 -0
  172. package/src/rules/require-secure-credential-storage/index.ts +60 -0
  173. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +26 -0
  174. package/src/rules/require-secure-defaults/index.ts +54 -0
  175. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +26 -0
  176. package/src/rules/require-secure-deletion/index.ts +52 -0
  177. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +29 -0
  178. package/src/rules/require-storage-encryption/index.ts +60 -0
  179. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +26 -0
  180. package/src/rules/require-url-validation/index.ts +85 -0
  181. package/src/rules/require-url-validation/require-url-validation.test.ts +32 -0
  182. package/src/types/{index.d.ts → index.ts} +157 -53
  183. package/src/index.d.ts +0 -32
  184. package/src/index.js +0 -465
  185. package/src/rules/database-injection/index.d.ts +0 -13
  186. package/src/rules/database-injection/index.js +0 -406
  187. package/src/rules/detect-child-process/index.d.ts +0 -11
  188. package/src/rules/detect-child-process/index.js +0 -529
  189. package/src/rules/detect-eval-with-expression/index.d.ts +0 -9
  190. package/src/rules/detect-eval-with-expression/index.js +0 -392
  191. package/src/rules/detect-mixed-content/index.d.ts +0 -8
  192. package/src/rules/detect-mixed-content/index.js +0 -44
  193. package/src/rules/detect-non-literal-fs-filename/index.d.ts +0 -7
  194. package/src/rules/detect-non-literal-fs-filename/index.js +0 -454
  195. package/src/rules/detect-non-literal-regexp/index.d.ts +0 -9
  196. package/src/rules/detect-non-literal-regexp/index.js +0 -403
  197. package/src/rules/detect-object-injection/index.d.ts +0 -11
  198. package/src/rules/detect-object-injection/index.js +0 -560
  199. package/src/rules/detect-suspicious-dependencies/index.d.ts +0 -8
  200. package/src/rules/detect-suspicious-dependencies/index.js +0 -71
  201. package/src/rules/detect-weak-password-validation/index.d.ts +0 -6
  202. package/src/rules/detect-weak-password-validation/index.js +0 -58
  203. package/src/rules/no-allow-arbitrary-loads/index.d.ts +0 -8
  204. package/src/rules/no-allow-arbitrary-loads/index.js +0 -47
  205. package/src/rules/no-arbitrary-file-access/index.d.ts +0 -13
  206. package/src/rules/no-arbitrary-file-access/index.js +0 -195
  207. package/src/rules/no-buffer-overread/index.d.ts +0 -29
  208. package/src/rules/no-buffer-overread/index.js +0 -606
  209. package/src/rules/no-clickjacking/index.d.ts +0 -10
  210. package/src/rules/no-clickjacking/index.js +0 -396
  211. package/src/rules/no-client-side-auth-logic/index.d.ts +0 -6
  212. package/src/rules/no-client-side-auth-logic/index.js +0 -69
  213. package/src/rules/no-credentials-in-query-params/index.d.ts +0 -8
  214. package/src/rules/no-credentials-in-query-params/index.js +0 -57
  215. package/src/rules/no-credentials-in-storage-api/index.d.ts +0 -6
  216. package/src/rules/no-credentials-in-storage-api/index.js +0 -54
  217. package/src/rules/no-data-in-temp-storage/index.d.ts +0 -6
  218. package/src/rules/no-data-in-temp-storage/index.js +0 -64
  219. package/src/rules/no-debug-code-in-production/index.d.ts +0 -8
  220. package/src/rules/no-debug-code-in-production/index.js +0 -51
  221. package/src/rules/no-directive-injection/index.d.ts +0 -12
  222. package/src/rules/no-directive-injection/index.js +0 -457
  223. package/src/rules/no-disabled-certificate-validation/index.d.ts +0 -6
  224. package/src/rules/no-disabled-certificate-validation/index.js +0 -61
  225. package/src/rules/no-document-cookie/index.d.ts +0 -5
  226. package/src/rules/no-document-cookie/index.js +0 -89
  227. package/src/rules/no-dynamic-dependency-loading/index.d.ts +0 -8
  228. package/src/rules/no-dynamic-dependency-loading/index.js +0 -51
  229. package/src/rules/no-electron-security-issues/index.d.ts +0 -10
  230. package/src/rules/no-electron-security-issues/index.js +0 -423
  231. package/src/rules/no-exposed-debug-endpoints/index.d.ts +0 -6
  232. package/src/rules/no-exposed-debug-endpoints/index.js +0 -62
  233. package/src/rules/no-exposed-sensitive-data/index.d.ts +0 -11
  234. package/src/rules/no-exposed-sensitive-data/index.js +0 -340
  235. package/src/rules/no-format-string-injection/index.d.ts +0 -17
  236. package/src/rules/no-format-string-injection/index.js +0 -660
  237. package/src/rules/no-graphql-injection/index.d.ts +0 -12
  238. package/src/rules/no-graphql-injection/index.js +0 -411
  239. package/src/rules/no-hardcoded-credentials/index.d.ts +0 -26
  240. package/src/rules/no-hardcoded-credentials/index.js +0 -376
  241. package/src/rules/no-hardcoded-session-tokens/index.d.ts +0 -6
  242. package/src/rules/no-hardcoded-session-tokens/index.js +0 -59
  243. package/src/rules/no-http-urls/index.d.ts +0 -12
  244. package/src/rules/no-http-urls/index.js +0 -114
  245. package/src/rules/no-improper-sanitization/index.d.ts +0 -12
  246. package/src/rules/no-improper-sanitization/index.js +0 -411
  247. package/src/rules/no-improper-type-validation/index.d.ts +0 -10
  248. package/src/rules/no-improper-type-validation/index.js +0 -475
  249. package/src/rules/no-insecure-comparison/index.d.ts +0 -7
  250. package/src/rules/no-insecure-comparison/index.js +0 -193
  251. package/src/rules/no-insecure-cookie-settings/index.d.ts +0 -9
  252. package/src/rules/no-insecure-cookie-settings/index.js +0 -306
  253. package/src/rules/no-insecure-jwt/index.d.ts +0 -10
  254. package/src/rules/no-insecure-jwt/index.js +0 -380
  255. package/src/rules/no-insecure-redirects/index.d.ts +0 -7
  256. package/src/rules/no-insecure-redirects/index.js +0 -216
  257. package/src/rules/no-insecure-websocket/index.d.ts +0 -6
  258. package/src/rules/no-insecure-websocket/index.js +0 -61
  259. package/src/rules/no-insufficient-postmessage-validation/index.d.ts +0 -14
  260. package/src/rules/no-insufficient-postmessage-validation/index.js +0 -392
  261. package/src/rules/no-insufficient-random/index.d.ts +0 -9
  262. package/src/rules/no-insufficient-random/index.js +0 -208
  263. package/src/rules/no-ldap-injection/index.d.ts +0 -10
  264. package/src/rules/no-ldap-injection/index.js +0 -455
  265. package/src/rules/no-missing-authentication/index.d.ts +0 -13
  266. package/src/rules/no-missing-authentication/index.js +0 -333
  267. package/src/rules/no-missing-cors-check/index.d.ts +0 -9
  268. package/src/rules/no-missing-cors-check/index.js +0 -399
  269. package/src/rules/no-missing-csrf-protection/index.d.ts +0 -11
  270. package/src/rules/no-missing-csrf-protection/index.js +0 -180
  271. package/src/rules/no-missing-security-headers/index.d.ts +0 -7
  272. package/src/rules/no-missing-security-headers/index.js +0 -218
  273. package/src/rules/no-password-in-url/index.d.ts +0 -8
  274. package/src/rules/no-password-in-url/index.js +0 -54
  275. package/src/rules/no-permissive-cors/index.d.ts +0 -8
  276. package/src/rules/no-permissive-cors/index.js +0 -65
  277. package/src/rules/no-pii-in-logs/index.d.ts +0 -8
  278. package/src/rules/no-pii-in-logs/index.js +0 -70
  279. package/src/rules/no-postmessage-origin-wildcard/index.d.ts +0 -8
  280. package/src/rules/no-postmessage-origin-wildcard/index.js +0 -56
  281. package/src/rules/no-privilege-escalation/index.d.ts +0 -13
  282. package/src/rules/no-privilege-escalation/index.js +0 -321
  283. package/src/rules/no-redos-vulnerable-regex/index.d.ts +0 -7
  284. package/src/rules/no-redos-vulnerable-regex/index.js +0 -306
  285. package/src/rules/no-sensitive-data-exposure/index.d.ts +0 -11
  286. package/src/rules/no-sensitive-data-exposure/index.js +0 -250
  287. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +0 -8
  288. package/src/rules/no-sensitive-data-in-analytics/index.js +0 -62
  289. package/src/rules/no-sensitive-data-in-cache/index.d.ts +0 -8
  290. package/src/rules/no-sensitive-data-in-cache/index.js +0 -52
  291. package/src/rules/no-sql-injection/index.d.ts +0 -10
  292. package/src/rules/no-sql-injection/index.js +0 -335
  293. package/src/rules/no-timing-attack/index.d.ts +0 -10
  294. package/src/rules/no-timing-attack/index.js +0 -447
  295. package/src/rules/no-toctou-vulnerability/index.d.ts +0 -7
  296. package/src/rules/no-toctou-vulnerability/index.js +0 -208
  297. package/src/rules/no-tracking-without-consent/index.d.ts +0 -6
  298. package/src/rules/no-tracking-without-consent/index.js +0 -67
  299. package/src/rules/no-unchecked-loop-condition/index.d.ts +0 -12
  300. package/src/rules/no-unchecked-loop-condition/index.js +0 -646
  301. package/src/rules/no-unencrypted-local-storage/index.d.ts +0 -8
  302. package/src/rules/no-unencrypted-local-storage/index.js +0 -61
  303. package/src/rules/no-unencrypted-transmission/index.d.ts +0 -11
  304. package/src/rules/no-unencrypted-transmission/index.js +0 -236
  305. package/src/rules/no-unescaped-url-parameter/index.d.ts +0 -9
  306. package/src/rules/no-unescaped-url-parameter/index.js +0 -355
  307. package/src/rules/no-unlimited-resource-allocation/index.d.ts +0 -12
  308. package/src/rules/no-unlimited-resource-allocation/index.js +0 -643
  309. package/src/rules/no-unsafe-deserialization/index.d.ts +0 -10
  310. package/src/rules/no-unsafe-deserialization/index.js +0 -491
  311. package/src/rules/no-unsafe-dynamic-require/index.d.ts +0 -5
  312. package/src/rules/no-unsafe-dynamic-require/index.js +0 -106
  313. package/src/rules/no-unsafe-regex-construction/index.d.ts +0 -9
  314. package/src/rules/no-unsafe-regex-construction/index.js +0 -291
  315. package/src/rules/no-unsanitized-html/index.d.ts +0 -9
  316. package/src/rules/no-unsanitized-html/index.js +0 -335
  317. package/src/rules/no-unvalidated-deeplinks/index.d.ts +0 -6
  318. package/src/rules/no-unvalidated-deeplinks/index.js +0 -62
  319. package/src/rules/no-unvalidated-user-input/index.d.ts +0 -9
  320. package/src/rules/no-unvalidated-user-input/index.js +0 -420
  321. package/src/rules/no-verbose-error-messages/index.d.ts +0 -8
  322. package/src/rules/no-verbose-error-messages/index.js +0 -68
  323. package/src/rules/no-weak-crypto/index.d.ts +0 -11
  324. package/src/rules/no-weak-crypto/index.js +0 -351
  325. package/src/rules/no-weak-password-recovery/index.d.ts +0 -12
  326. package/src/rules/no-weak-password-recovery/index.js +0 -424
  327. package/src/rules/no-xpath-injection/index.d.ts +0 -10
  328. package/src/rules/no-xpath-injection/index.js +0 -487
  329. package/src/rules/no-xxe-injection/index.d.ts +0 -7
  330. package/src/rules/no-xxe-injection/index.js +0 -266
  331. package/src/rules/no-zip-slip/index.d.ts +0 -9
  332. package/src/rules/no-zip-slip/index.js +0 -445
  333. package/src/rules/require-backend-authorization/index.d.ts +0 -6
  334. package/src/rules/require-backend-authorization/index.js +0 -60
  335. package/src/rules/require-code-minification/index.d.ts +0 -8
  336. package/src/rules/require-code-minification/index.js +0 -47
  337. package/src/rules/require-csp-headers/index.d.ts +0 -6
  338. package/src/rules/require-csp-headers/index.js +0 -64
  339. package/src/rules/require-data-minimization/index.d.ts +0 -8
  340. package/src/rules/require-data-minimization/index.js +0 -53
  341. package/src/rules/require-dependency-integrity/index.d.ts +0 -6
  342. package/src/rules/require-dependency-integrity/index.js +0 -64
  343. package/src/rules/require-https-only/index.d.ts +0 -8
  344. package/src/rules/require-https-only/index.js +0 -62
  345. package/src/rules/require-mime-type-validation/index.d.ts +0 -6
  346. package/src/rules/require-mime-type-validation/index.js +0 -66
  347. package/src/rules/require-network-timeout/index.d.ts +0 -8
  348. package/src/rules/require-network-timeout/index.js +0 -50
  349. package/src/rules/require-package-lock/index.d.ts +0 -8
  350. package/src/rules/require-package-lock/index.js +0 -63
  351. package/src/rules/require-secure-credential-storage/index.d.ts +0 -8
  352. package/src/rules/require-secure-credential-storage/index.js +0 -50
  353. package/src/rules/require-secure-defaults/index.d.ts +0 -8
  354. package/src/rules/require-secure-defaults/index.js +0 -47
  355. package/src/rules/require-secure-deletion/index.d.ts +0 -8
  356. package/src/rules/require-secure-deletion/index.js +0 -44
  357. package/src/rules/require-storage-encryption/index.d.ts +0 -8
  358. package/src/rules/require-storage-encryption/index.js +0 -50
  359. package/src/rules/require-url-validation/index.d.ts +0 -6
  360. package/src/rules/require-url-validation/index.js +0 -72
  361. package/src/types/index.js +0 -17
@@ -0,0 +1,342 @@
1
+ /**
2
+ * ESLint Rule: no-xxe-injection
3
+ * Detects XML External Entity (XXE) injection vulnerabilities (CWE-611)
4
+ *
5
+ * XXE injection occurs when XML parsers process external entity references,
6
+ * allowing attackers to:
7
+ * - Read sensitive local files
8
+ * - Make HTTP requests to internal services
9
+ * - Cause DoS through entity expansion (billion laughs)
10
+ * - Perform SSRF attacks
11
+ *
12
+ * False Positive Reduction:
13
+ * This rule uses security utilities to reduce false positives by detecting:
14
+ * - Safe XML libraries (libxmljs with secure config, xmldom with entity resolution disabled)
15
+ * - Proper parser configuration
16
+ * - JSDoc annotations (@safe, @xxe-safe)
17
+ * - Input validation and sanitization
18
+ */
19
+ import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
20
+ import { createRule } from '@interlace/eslint-devkit';
21
+ import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
22
+
23
+ type MessageIds =
24
+ | 'xxeInjection'
25
+ | 'unsafeXmlParser'
26
+ | 'externalEntityEnabled'
27
+ | 'untrustedXmlSource';
28
+
29
+ export interface Options {
30
+ /** Parser options that indicate safe configuration */
31
+ safeParserOptions?: string[];
32
+
33
+ /** Functions that validate/sanitize XML input */
34
+ xmlValidationFunctions?: string[];
35
+ }
36
+
37
+ type RuleOptions = [Options?];
38
+
39
+ export const noXxeInjection = createRule<RuleOptions, MessageIds>({
40
+ name: 'no-xxe-injection',
41
+ meta: {
42
+ type: 'problem',
43
+ docs: {
44
+ description: 'Detect XML External Entity (XXE) injection vulnerabilities',
45
+ url: 'https://cwe.mitre.org/data/definitions/611.html',
46
+ },
47
+ messages: {
48
+ xxeInjection: formatLLMMessage({
49
+ icon: MessageIcons.SECURITY,
50
+ issueName: 'XXE Injection',
51
+ cwe: 'CWE-611',
52
+ description: 'XML contains dangerous entity declarations',
53
+ severity: 'CRITICAL',
54
+ fix: 'Remove SYSTEM/PUBLIC entity declarations or use safe XML parser',
55
+ documentationLink: 'https://owasp.org/www-community/vulnerabilities/XML_External_Entity_(XXE)_Processing',
56
+ }),
57
+ unsafeXmlParser: formatLLMMessage({
58
+ icon: MessageIcons.SECURITY,
59
+ issueName: 'Unsafe XML Parser',
60
+ cwe: 'CWE-611',
61
+ description: 'Using unsafe XML parser without secure configuration',
62
+ severity: 'HIGH',
63
+ fix: 'Use libxmljs with noent: false or xmldom with entityResolver: null',
64
+ documentationLink: 'https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html',
65
+ }),
66
+ externalEntityEnabled: formatLLMMessage({
67
+ icon: MessageIcons.SECURITY,
68
+ issueName: 'External Entity Processing',
69
+ cwe: 'CWE-611',
70
+ description: 'External entity processing is enabled',
71
+ severity: 'CRITICAL',
72
+ fix: 'Disable external entity processing',
73
+ documentationLink: 'https://cwe.mitre.org/data/definitions/611.html',
74
+ }),
75
+ untrustedXmlSource: formatLLMMessage({
76
+ icon: MessageIcons.SECURITY,
77
+ issueName: 'Untrusted XML Source',
78
+ cwe: 'CWE-611',
79
+ description: 'XML from untrusted source without validation',
80
+ severity: 'HIGH',
81
+ fix: 'Validate and sanitize XML input before parsing',
82
+ documentationLink: 'https://cheatsheetseries.owasp.org/cheatsheets/XML_External_Entity_Prevention_Cheat_Sheet.html',
83
+ }),
84
+ },
85
+ schema: [
86
+ {
87
+ type: 'object',
88
+ properties: {
89
+ safeParserOptions: {
90
+ type: 'array',
91
+ items: { type: 'string' },
92
+ },
93
+ xmlValidationFunctions: {
94
+ type: 'array',
95
+ items: { type: 'string' },
96
+ },
97
+ },
98
+ additionalProperties: false,
99
+ },
100
+ ],
101
+ },
102
+ defaultOptions: [
103
+ {
104
+ safeParserOptions: ['noent', 'resolveExternals', 'expandEntityReferences', 'entityResolver'],
105
+ xmlValidationFunctions: ['validateXml', 'sanitizeXml', 'cleanXml', 'parseXmlSafe'],
106
+ },
107
+ ],
108
+ create(
109
+ context: TSESLint.RuleContext<MessageIds, RuleOptions>,
110
+ [options]: RuleOptions,
111
+ ) {
112
+ const {
113
+ safeParserOptions = ['noent', 'resolveExternals', 'expandEntityReferences', 'entityResolver'],
114
+ xmlValidationFunctions = ['validateXml', 'sanitizeXml', 'cleanXml', 'parseXmlSafe'],
115
+ } = options || {};
116
+
117
+ const filename = context.filename || context.getFilename();
118
+
119
+ /**
120
+ * Check if this is an XML parsing operation
121
+ */
122
+ const isXmlParsingCall = (node: TSESTree.CallExpression): boolean => {
123
+ const callee = node.callee;
124
+
125
+ // Check for XML library method calls
126
+ if (callee.type === 'MemberExpression' &&
127
+ callee.property.type === 'Identifier' &&
128
+ ['parse', 'parseFromString', 'parseString', 'parseXmlString', 'parseXML'].includes(callee.property.name)) {
129
+ return true;
130
+ }
131
+
132
+ // Check for constructor calls
133
+ if (callee.type === 'Identifier' &&
134
+ ['DOMParser', 'XMLHttpRequest', 'ActiveXObject'].includes(callee.name)) {
135
+ return true;
136
+ }
137
+
138
+ return false;
139
+ };
140
+
141
+ /**
142
+ * Check if parser options are secure
143
+ */
144
+ const hasSecureParserOptions = (optionsNode: TSESTree.Node): boolean => {
145
+ if (optionsNode.type !== 'ObjectExpression') {
146
+ return false;
147
+ }
148
+
149
+ // Check for secure options
150
+ for (const prop of optionsNode.properties) {
151
+ if (prop.type === 'Property' &&
152
+ prop.key.type === 'Identifier' &&
153
+ safeParserOptions.includes(prop.key.name)) {
154
+
155
+ // Check if the value is secure
156
+ if (prop.value.type === 'Literal' && prop.value.value === false) {
157
+ return true;
158
+ }
159
+ if (prop.value.type === 'Literal' && prop.value.value === null) {
160
+ return true;
161
+ }
162
+ }
163
+ }
164
+
165
+ return false;
166
+ };
167
+
168
+ /**
169
+ * Check if parser options enable dangerous features
170
+ */
171
+ const hasDangerousParserOptions = (optionsNode: TSESTree.Node): boolean => {
172
+ if (optionsNode.type !== 'ObjectExpression') {
173
+ return false;
174
+ }
175
+
176
+ // Check for dangerous options
177
+ for (const prop of optionsNode.properties) {
178
+ if (prop.type === 'Property' &&
179
+ prop.key.type === 'Identifier' &&
180
+ ['resolveExternals', 'expandEntityReferences', 'noent'].includes(prop.key.name)) {
181
+
182
+ // Check if the value enables dangerous features
183
+ if (prop.value.type === 'Literal' && prop.value.value === true) {
184
+ return true;
185
+ }
186
+ }
187
+ }
188
+
189
+ return false;
190
+ };
191
+
192
+ /**
193
+ * Check if input has been validated
194
+ */
195
+ const isXmlInputValidated = (xmlSource: TSESTree.Node): boolean => {
196
+ // Check if the input comes from a validation function
197
+ let current: TSESTree.Node | undefined = xmlSource;
198
+
199
+ while (current) {
200
+ if (current.type === 'CallExpression' &&
201
+ current.callee.type === 'Identifier' &&
202
+ xmlValidationFunctions.includes(current.callee.name)) {
203
+ return true;
204
+ }
205
+ current = current.parent as TSESTree.Node;
206
+ }
207
+
208
+ return false;
209
+ };
210
+
211
+ /**
212
+ * Check if XML contains dangerous entity declarations
213
+ */
214
+ const containsDangerousEntities = (xmlText: string): boolean => {
215
+ return /<!ENTITY/i.test(xmlText) &&
216
+ /SYSTEM\s+["']/i.test(xmlText);
217
+ };
218
+
219
+ /**
220
+ * Check if input source is untrusted
221
+ */
222
+ const isUntrustedXmlSource = (xmlSource: TSESTree.Node): boolean => {
223
+ // Check for user input sources
224
+ if (xmlSource.type === 'Identifier') {
225
+ const varName = xmlSource.name.toLowerCase();
226
+
227
+ // Consider variables with safe/validated names as trusted
228
+ if (['clean', 'safe', 'validated', 'sanitized', 'validatedxml', 'sanitizedxml'].some(safe =>
229
+ varName.includes(safe)
230
+ )) {
231
+ return false;
232
+ }
233
+
234
+ return ['req', 'request', 'body', 'query', 'params', 'input', 'xml', 'data'].some(keyword =>
235
+ varName.includes(keyword)
236
+ );
237
+ }
238
+
239
+ // Check for file system reads (potentially untrusted)
240
+ let current: TSESTree.Node | undefined = xmlSource;
241
+ while (current) {
242
+ if (current.type === 'CallExpression' &&
243
+ current.callee.type === 'MemberExpression' &&
244
+ current.callee.property.type === 'Identifier' &&
245
+ ['readFileSync', 'readFile', 'createReadStream'].includes(current.callee.property.name)) {
246
+ return true; // File input is potentially untrusted
247
+ }
248
+ current = current.parent as TSESTree.Node;
249
+ }
250
+
251
+ return false;
252
+ };
253
+
254
+ return {
255
+ // Check XML parsing calls
256
+ CallExpression(node: TSESTree.CallExpression) {
257
+ if (!isXmlParsingCall(node)) {
258
+ return;
259
+ }
260
+
261
+ const args = node.arguments;
262
+ if (args.length === 0) {
263
+ return;
264
+ }
265
+
266
+ // Check XML input source
267
+ const xmlInput = args[0];
268
+ const isUntrusted = isUntrustedXmlSource(xmlInput);
269
+ const isValidated = isXmlInputValidated(xmlInput);
270
+
271
+ // Check if this parser call uses secure options
272
+ const hasSecureOptions = args.length >= 2 && hasSecureParserOptions(args[1]);
273
+
274
+ // CRITICAL: Untrusted XML input without validation (only if parser is not secure)
275
+ if (isUntrusted && !isValidated && !hasSecureOptions) {
276
+ context.report({
277
+ node: xmlInput,
278
+ messageId: 'untrustedXmlSource',
279
+ data: {
280
+ filePath: filename,
281
+ line: String(node.loc?.start.line ?? 0),
282
+ },
283
+ });
284
+ }
285
+
286
+ // Check for dangerous parser options
287
+ if (args.length >= 2) {
288
+ const optionsArg = args[1];
289
+
290
+ if (hasDangerousParserOptions(optionsArg)) {
291
+ context.report({
292
+ node: optionsArg,
293
+ messageId: 'externalEntityEnabled',
294
+ data: {
295
+ filePath: filename,
296
+ line: String(node.loc?.start.line ?? 0),
297
+ },
298
+ });
299
+ return;
300
+ }
301
+
302
+ // DOMParser method safety is covered by constructor detection
303
+ // No need to report unsafeXmlParser for individual method calls
304
+ }
305
+ },
306
+
307
+ // Check XML parser constructor calls
308
+ NewExpression(node: TSESTree.NewExpression) {
309
+ const callee = node.callee;
310
+ if (callee.type !== 'Identifier' ||
311
+ !['DOMParser', 'XMLHttpRequest', 'ActiveXObject'].includes(callee.name)) {
312
+ return;
313
+ }
314
+
315
+ // Constructor calls for XML parsers are considered unsafe
316
+ context.report({
317
+ node,
318
+ messageId: 'unsafeXmlParser',
319
+ data: {
320
+ filePath: filename,
321
+ line: String(node.loc?.start.line ?? 0),
322
+ },
323
+ });
324
+ },
325
+
326
+ // Check for dangerous XML literals
327
+ Literal(node: TSESTree.Literal) {
328
+ if (typeof node.value === 'string' && containsDangerousEntities(node.value)) {
329
+ context.report({
330
+ node,
331
+ messageId: 'xxeInjection',
332
+ data: {
333
+ filePath: filename,
334
+ line: String(node.loc?.start.line ?? 0),
335
+ safeAlternative: 'Use sanitized XML or remove entity declarations',
336
+ },
337
+ });
338
+ }
339
+ },
340
+ };
341
+ },
342
+ });
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Comprehensive tests for no-xxe-injection rule
3
+ * Security: CWE-611 (XML External Entity Injection)
4
+ */
5
+ import { RuleTester } from '@typescript-eslint/rule-tester';
6
+ import { describe, it, afterAll } from 'vitest';
7
+ import parser from '@typescript-eslint/parser';
8
+ import { noXxeInjection } from './index';
9
+
10
+ // Configure RuleTester for Vitest
11
+ RuleTester.afterAll = afterAll;
12
+ RuleTester.it = it;
13
+ RuleTester.itOnly = it.only;
14
+ RuleTester.describe = describe;
15
+
16
+ // Use Flat Config format (ESLint 9+)
17
+ const ruleTester = new RuleTester({
18
+ languageOptions: {
19
+ parser,
20
+ ecmaVersion: 2022,
21
+ sourceType: 'module',
22
+ },
23
+ });
24
+
25
+ describe('no-xxe-injection', () => {
26
+ describe('Valid Code - Secure XML Parsing', () => {
27
+ ruleTester.run('valid - secure XML parsing', noXxeInjection, {
28
+ valid: [
29
+ // Secure libxmljs usage with noent: false
30
+ 'const libxml = require("libxmljs"); const doc = libxml.parseXmlString(xmlString, { noent: false });',
31
+
32
+ // Secure xmldom usage with entityResolver: null
33
+ 'const parser = new xmldom.DOMParser({ entityResolver: null });',
34
+
35
+ // Non-XML parsing (should not trigger)
36
+ 'const data = JSON.parse(jsonString);',
37
+
38
+ // Safe string literals without entities
39
+ 'const xml = "<root><child>Hello</child></root>";',
40
+
41
+ // Trusted libraries with custom config
42
+ 'myXmlParser.parse(xml, { noent: false });',
43
+
44
+ // Validated/sanitized inputs
45
+ {
46
+ code: 'const cleanXml = validateXml(req.body); parser.parse(cleanXml);',
47
+ options: [{ xmlValidationFunctions: ['validateXml'] }],
48
+ },
49
+ 'const safeXml = sanitizeXmlInput(userInput); libxmljs.parseXmlString(safeXml, { noent: false });',
50
+
51
+ // Internal/trusted XML sources
52
+ 'const configXml = fs.readFileSync("./config.xml", "utf8");',
53
+ ],
54
+ invalid: [],
55
+ });
56
+ });
57
+
58
+ describe('Invalid Code - XXE Vulnerabilities', () => {
59
+ ruleTester.run('invalid - XXE injection vulnerabilities', noXxeInjection, {
60
+ valid: [],
61
+ invalid: [
62
+ // Dangerous parser options - external entities enabled
63
+ {
64
+ code: 'parser.parse(xmlString, { resolveExternals: true });',
65
+ errors: [
66
+ { messageId: 'untrustedXmlSource' },
67
+ { messageId: 'externalEntityEnabled' },
68
+ ],
69
+ },
70
+ {
71
+ code: 'libxmljs.parseXmlString(xml, { noent: true });',
72
+ errors: [
73
+ { messageId: 'untrustedXmlSource' },
74
+ { messageId: 'externalEntityEnabled' },
75
+ ],
76
+ },
77
+ {
78
+ code: 'parser.parse(xml, { expandEntityReferences: true });',
79
+ errors: [
80
+ { messageId: 'untrustedXmlSource' },
81
+ { messageId: 'externalEntityEnabled' },
82
+ ],
83
+ },
84
+
85
+ // Untrusted XML sources from user input
86
+ {
87
+ code: 'const userXml = req.query.xml; libxmljs.parseXmlString(userXml);',
88
+ errors: [{ messageId: 'untrustedXmlSource' }],
89
+ },
90
+ {
91
+ code: 'const xmlData = fs.readFileSync(userFile, "utf8"); const doc = DOMParser.parse(xmlData);',
92
+ errors: [{ messageId: 'untrustedXmlSource' }],
93
+ },
94
+ {
95
+ code: 'const input = req.body; parser.parse(input);',
96
+ errors: [{ messageId: 'untrustedXmlSource' }],
97
+ },
98
+
99
+ // Unsafe XML parsers without proper configuration
100
+ {
101
+ code: 'const parser = new DOMParser(); const doc = parser.parseFromString(xmlString, "text/xml");',
102
+ errors: [
103
+ { messageId: 'unsafeXmlParser' },
104
+ { messageId: 'untrustedXmlSource' },
105
+ ],
106
+ },
107
+ {
108
+ code: 'new DOMParser();',
109
+ errors: [{ messageId: 'unsafeXmlParser' }],
110
+ },
111
+ {
112
+ code: 'new XMLHttpRequest();',
113
+ errors: [{ messageId: 'unsafeXmlParser' }],
114
+ },
115
+ {
116
+ code: 'new ActiveXObject("Microsoft.XMLDOM");',
117
+ errors: [{ messageId: 'unsafeXmlParser' }],
118
+ },
119
+ ],
120
+ });
121
+ });
122
+ });