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,379 @@
1
+ /**
2
+ * ESLint Rule: no-redos-vulnerable-regex
3
+ * Detects ReDoS-vulnerable regex patterns in literal regex patterns
4
+ * CWE-400: Uncontrolled Resource Consumption
5
+ *
6
+ * Complements detect-non-literal-regexp by checking literal regex patterns
7
+ *
8
+ * @see https://cwe.mitre.org/data/definitions/400.html
9
+ * @see https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS
10
+ */
11
+ import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
12
+ import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
13
+ import { createRule } from '@interlace/eslint-devkit';
14
+
15
+ type MessageIds =
16
+ | 'redosVulnerable'
17
+ | 'useAtomicGroups'
18
+ | 'usePossessiveQuantifiers'
19
+ | 'restructureRegex'
20
+ | 'useSafeLibrary';
21
+
22
+ export interface Options {
23
+ /** Allow certain common patterns. Default: false */
24
+ allowCommonPatterns?: boolean;
25
+
26
+ /** Maximum pattern length to analyze. Default: 500 */
27
+ maxPatternLength?: number;
28
+ }
29
+
30
+ type RuleOptions = [Options?];
31
+
32
+ // Type guard for regex literal nodes
33
+ const isRegExpLiteral = (
34
+ node: TSESTree.Node
35
+ ): node is TSESTree.Literal & { regex: { pattern: string; flags: string } } => {
36
+ return node.type === 'Literal' && Object.prototype.hasOwnProperty.call(node, 'regex');
37
+ };
38
+
39
+ /**
40
+ * ReDoS vulnerability patterns
41
+ */
42
+ interface ReDoSPattern {
43
+ pattern: RegExp;
44
+ name: string;
45
+ description: string;
46
+ example: { bad: string; good: string };
47
+ fix: string;
48
+ severity: 'critical' | 'high' | 'medium';
49
+ }
50
+
51
+ const REDOS_PATTERNS: ReDoSPattern[] = [
52
+ {
53
+ pattern: /\([^)]*\+\)\+|\([^)]*\*\)\*|\([^)]*\?\)\?/,
54
+ name: 'Nested Quantifiers',
55
+ description: 'Nested quantifiers like (a+)+, (a*)*, (a?)? cause exponential backtracking',
56
+ example: {
57
+ bad: '/(a+)+b/',
58
+ good: '/(?>a+)b/ or /a+b/'
59
+ },
60
+ fix: 'Use atomic groups (?>...) or restructure to avoid nesting',
61
+ severity: 'critical'
62
+ },
63
+ {
64
+ pattern: /\([^)]*\+[^)]*\)\+|\([^)]*\*[^)]*\)\*/,
65
+ name: 'Nested Repetition',
66
+ description: 'Quantifiers nested within groups with quantifiers',
67
+ example: {
68
+ bad: '/(x+)+y/',
69
+ good: '/x+y/'
70
+ },
71
+ fix: 'Flatten nested quantifiers',
72
+ severity: 'critical'
73
+ },
74
+ {
75
+ pattern: /\([^)]*\|[^)]*\)\+|\([^)]*\|[^)]*\)\*/,
76
+ name: 'Alternation with Quantifier',
77
+ description: 'Alternation groups with quantifiers can cause backtracking',
78
+ example: {
79
+ bad: '/(a|b)+c/',
80
+ good: '/[ab]+c/'
81
+ },
82
+ fix: 'Use character classes instead of alternation when possible',
83
+ severity: 'high'
84
+ },
85
+ {
86
+ pattern: /\.\*\.\*|\.\+\+\.\+/,
87
+ name: 'Nested Wildcards',
88
+ description: 'Nested wildcard quantifiers cause catastrophic backtracking',
89
+ example: {
90
+ bad: '/.*.*/',
91
+ good: '/.*/ or be more specific'
92
+ },
93
+ fix: 'Remove redundant wildcards or be more specific',
94
+ severity: 'critical'
95
+ },
96
+ {
97
+ pattern: /\([^)]*\)\{[0-9]+,\}[^)]*\([^)]*\)\{[0-9]+,\}/,
98
+ name: 'Multiple Repetition Groups',
99
+ description: 'Multiple repetition groups can cause exponential backtracking',
100
+ example: {
101
+ bad: '/(a{2,})+(b{2,})+/',
102
+ good: 'Restructure to avoid nested repetitions'
103
+ },
104
+ fix: 'Restructure regex to avoid nested repetitions',
105
+ severity: 'high'
106
+ }
107
+ ];
108
+
109
+ /**
110
+ * Check if a regex pattern contains ReDoS vulnerabilities
111
+ */
112
+ function hasReDoSVulnerability(pattern: string): ReDoSPattern | null {
113
+ for (const redosPattern of REDOS_PATTERNS) {
114
+ if (redosPattern.pattern.test(pattern)) {
115
+ return redosPattern;
116
+ }
117
+ }
118
+
119
+ // Additional checks for common ReDoS patterns
120
+ // Nested quantifiers: (a+)+, (a*)*, (a?)?
121
+ if (/(\([^)]*[+*?][^)]*\)[+*?])/.test(pattern)) {
122
+ return {
123
+ pattern: /\([^)]*[+*?][^)]*\)[+*?]/,
124
+ name: 'Nested Quantifier Pattern',
125
+ description: 'Pattern contains nested quantifiers that can cause exponential backtracking',
126
+ example: {
127
+ bad: pattern.substring(0, 30),
128
+ good: 'Restructure to avoid nested quantifiers'
129
+ },
130
+ fix: 'Use atomic groups or restructure regex',
131
+ severity: 'critical'
132
+ };
133
+ }
134
+
135
+ return null;
136
+ }
137
+
138
+ /**
139
+ * Generate fix suggestions based on the vulnerability
140
+ */
141
+ function generateFixSuggestions(vulnerability: ReDoSPattern): { messageId: MessageIds; description: string }[] {
142
+ const suggestions: { messageId: MessageIds; description: string }[] = [];
143
+
144
+ if (vulnerability.severity === 'critical' || vulnerability.name.includes('Nested')) {
145
+ suggestions.push({
146
+ messageId: 'useAtomicGroups',
147
+ description: vulnerability.fix
148
+ });
149
+ suggestions.push({
150
+ messageId: 'restructureRegex',
151
+ description: 'Restructure the regex to avoid nested quantifiers'
152
+ });
153
+ }
154
+
155
+ if (vulnerability.name.includes('Quantifier')) {
156
+ suggestions.push({
157
+ messageId: 'usePossessiveQuantifiers',
158
+ description: 'Use possessive quantifiers (*+, ++, ?+) if supported'
159
+ });
160
+ }
161
+
162
+ suggestions.push({
163
+ messageId: 'useSafeLibrary',
164
+ description: 'Consider using safe-regex library to validate patterns'
165
+ });
166
+
167
+ return suggestions;
168
+ }
169
+
170
+ export const noRedosVulnerableRegex = createRule<RuleOptions, MessageIds>({
171
+ name: 'no-redos-vulnerable-regex',
172
+ meta: {
173
+ type: 'problem',
174
+ docs: {
175
+ description: 'Detects ReDoS-vulnerable regex patterns in literal regex patterns',
176
+ },
177
+ hasSuggestions: true,
178
+ messages: {
179
+ redosVulnerable: formatLLMMessage({
180
+ icon: MessageIcons.SECURITY,
181
+ issueName: 'ReDoS vulnerable regex',
182
+ cwe: 'CWE-400',
183
+ description: '{{vulnerabilityName}}: {{description}}',
184
+ severity: '{{severity}}',
185
+ fix: '{{fix}}',
186
+ documentationLink: 'https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS',
187
+ }),
188
+ useAtomicGroups: formatLLMMessage({
189
+ icon: MessageIcons.INFO,
190
+ issueName: 'Use Atomic Groups',
191
+ description: 'Use atomic groups to prevent backtracking',
192
+ severity: 'LOW',
193
+ fix: '(?>...) to prevent backtracking',
194
+ documentationLink: 'https://www.regular-expressions.info/atomic.html',
195
+ }),
196
+ usePossessiveQuantifiers: formatLLMMessage({
197
+ icon: MessageIcons.INFO,
198
+ issueName: 'Use Possessive Quantifiers',
199
+ description: 'Use possessive quantifiers',
200
+ severity: 'LOW',
201
+ fix: '*+, ++, ?+ (if supported)',
202
+ documentationLink: 'https://www.regular-expressions.info/possessive.html',
203
+ }),
204
+ restructureRegex: formatLLMMessage({
205
+ icon: MessageIcons.INFO,
206
+ issueName: 'Restructure Regex',
207
+ description: 'Restructure to avoid nested quantifiers',
208
+ severity: 'LOW',
209
+ fix: 'Avoid (a+)+ patterns',
210
+ documentationLink: 'https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS',
211
+ }),
212
+ useSafeLibrary: formatLLMMessage({
213
+ icon: MessageIcons.INFO,
214
+ issueName: 'Use safe-regex',
215
+ description: 'Validate with safe-regex library',
216
+ severity: 'LOW',
217
+ fix: 'if (safeRegex(pattern)) { new RegExp(pattern) }',
218
+ documentationLink: 'https://github.com/substack/safe-regex',
219
+ }),
220
+ },
221
+ schema: [
222
+ {
223
+ type: 'object',
224
+ properties: {
225
+ allowCommonPatterns: {
226
+ type: 'boolean',
227
+ default: false,
228
+ description: 'Allow certain common patterns',
229
+ },
230
+ maxPatternLength: {
231
+ type: 'number',
232
+ default: 500,
233
+ minimum: 1,
234
+ description: 'Maximum pattern length to analyze',
235
+ },
236
+ },
237
+ additionalProperties: false,
238
+ },
239
+ ],
240
+ },
241
+ defaultOptions: [
242
+ {
243
+ allowCommonPatterns: false,
244
+ maxPatternLength: 500,
245
+ },
246
+ ],
247
+ create(context: TSESLint.RuleContext<MessageIds, RuleOptions>, [options = {}]) {
248
+ const {
249
+ allowCommonPatterns = false, maxPatternLength = 500
250
+ }: Options = options || {};
251
+
252
+ /**
253
+ * Check literal regex patterns for ReDoS vulnerabilities
254
+ */
255
+ function checkLiteralRegExp(node: TSESTree.Node) {
256
+ if (!isRegExpLiteral(node)) {
257
+ return;
258
+ }
259
+
260
+ const pattern = node.regex.pattern;
261
+
262
+ // Skip if pattern is too long (performance)
263
+ if (pattern.length > maxPatternLength) {
264
+ return;
265
+ }
266
+
267
+ const vulnerability = hasReDoSVulnerability(pattern);
268
+
269
+ if (!vulnerability) {
270
+ return;
271
+ }
272
+
273
+ // Allow common patterns if configured
274
+ if (allowCommonPatterns && (vulnerability.severity === 'medium' || vulnerability.name === 'Alternation with Quantifier')) {
275
+ return;
276
+ }
277
+
278
+ const suggestions = generateFixSuggestions(vulnerability);
279
+ const severity = vulnerability.severity.toUpperCase() as 'CRITICAL' | 'HIGH' | 'MEDIUM';
280
+
281
+ context.report({
282
+ node,
283
+ messageId: 'redosVulnerable',
284
+ data: {
285
+ vulnerabilityName: vulnerability.name,
286
+ description: vulnerability.description,
287
+ severity,
288
+ fix: vulnerability.fix,
289
+ },
290
+ suggest: suggestions.map(suggestion => ({
291
+ messageId: suggestion.messageId,
292
+ fix: () => null, // Complex refactoring, cannot auto-fix
293
+ })),
294
+ });
295
+ }
296
+
297
+ /**
298
+ * Check new RegExp() calls for ReDoS vulnerabilities
299
+ */
300
+ function checkNewRegExp(node: TSESTree.CallExpression | TSESTree.NewExpression) {
301
+ // Check for new RegExp(pattern) or RegExp(pattern)
302
+ let callee: TSESTree.Expression;
303
+
304
+ if (node.type === 'NewExpression') {
305
+ callee = node.callee;
306
+ } else if (node.type === 'CallExpression') {
307
+ callee = node.callee;
308
+ } else {
309
+ /* c8 ignore next */
310
+ return;
311
+ }
312
+
313
+ const isRegExp = callee.type === 'Identifier' && callee.name === 'RegExp';
314
+
315
+ if (!isRegExp) {
316
+ /* c8 ignore next */
317
+ return;
318
+ }
319
+
320
+ // Check if first argument is a string literal
321
+ if (node.arguments.length === 0) {
322
+ /* c8 ignore next */
323
+ return;
324
+ }
325
+
326
+ const firstArg = node.arguments[0];
327
+ if (firstArg.type !== 'Literal' || typeof firstArg.value !== 'string') {
328
+ /* c8 ignore next */
329
+ return;
330
+ }
331
+
332
+ const pattern = firstArg.value;
333
+
334
+ // Skip if pattern is too long (performance)
335
+ if (pattern.length > maxPatternLength) {
336
+ /* c8 ignore next */
337
+ return;
338
+ }
339
+
340
+ const vulnerability = hasReDoSVulnerability(pattern);
341
+
342
+ if (!vulnerability) {
343
+ /* c8 ignore next */
344
+ return;
345
+ }
346
+
347
+ // Allow common patterns if configured
348
+ if (allowCommonPatterns && (vulnerability.severity === 'medium' || vulnerability.name === 'Alternation with Quantifier')) {
349
+ /* c8 ignore next */
350
+ return;
351
+ }
352
+
353
+ const suggestions = generateFixSuggestions(vulnerability);
354
+ const severity = vulnerability.severity.toUpperCase() as 'CRITICAL' | 'HIGH' | 'MEDIUM';
355
+
356
+ context.report({
357
+ node,
358
+ messageId: 'redosVulnerable',
359
+ data: {
360
+ vulnerabilityName: vulnerability.name,
361
+ description: vulnerability.description,
362
+ severity,
363
+ fix: vulnerability.fix,
364
+ },
365
+ suggest: suggestions.map(suggestion => ({
366
+ messageId: suggestion.messageId,
367
+ fix: () => null, // Complex refactoring, cannot auto-fix
368
+ })),
369
+ });
370
+ }
371
+
372
+ return {
373
+ Literal: checkLiteralRegExp,
374
+ CallExpression: checkNewRegExp,
375
+ NewExpression: checkNewRegExp,
376
+ };
377
+ },
378
+ });
379
+
@@ -0,0 +1,83 @@
1
+ /**
2
+ * Tests for no-redos-vulnerable-regex rule
3
+ * Security: CWE-400 (Uncontrolled Resource Consumption - ReDoS)
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 { noRedosVulnerableRegex } 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
+ const ruleTester = new RuleTester({
17
+ languageOptions: {
18
+ parser,
19
+ ecmaVersion: 2022,
20
+ sourceType: 'module',
21
+ },
22
+ });
23
+
24
+ describe('no-redos-vulnerable-regex', () => {
25
+ describe('Valid Code', () => {
26
+ ruleTester.run('valid - safe regex patterns', noRedosVulnerableRegex, {
27
+ valid: [
28
+ 'const regex = /^[a-z]+$/;',
29
+ 'const emailRegex = /^[^@]+@[^@]+$/;',
30
+ 'new RegExp("^[0-9]+$");',
31
+ ],
32
+ invalid: [],
33
+ });
34
+ });
35
+
36
+ describe('Invalid Code - ReDoS Vulnerable Patterns', () => {
37
+ ruleTester.run('invalid - vulnerable regex patterns', noRedosVulnerableRegex, {
38
+ valid: [],
39
+ invalid: [
40
+ {
41
+ code: 'const regex = /(a+)+b/;',
42
+ errors: [{ messageId: 'redosVulnerable' }],
43
+ },
44
+ {
45
+ code: 'const pattern = new RegExp("(x+)+y");',
46
+ errors: [{ messageId: 'redosVulnerable' }],
47
+ },
48
+ ],
49
+ });
50
+ });
51
+
52
+ describe('Options Coverage', () => {
53
+ ruleTester.run('options - allowCommonPatterns bypasses alternation', noRedosVulnerableRegex, {
54
+ valid: [
55
+ {
56
+ code: 'const regex = /(a|b)+c/;',
57
+ options: [{ allowCommonPatterns: true }],
58
+ },
59
+ ],
60
+ invalid: [],
61
+ });
62
+
63
+ ruleTester.run('options - maxPatternLength skips overly long patterns', noRedosVulnerableRegex, {
64
+ valid: [
65
+ {
66
+ code: `const regex = /${'a'.repeat(600)}+/;`,
67
+ options: [{ maxPatternLength: 100 }],
68
+ },
69
+ ],
70
+ invalid: [],
71
+ });
72
+
73
+ ruleTester.run('invalid - RegExp call expression', noRedosVulnerableRegex, {
74
+ valid: [],
75
+ invalid: [
76
+ {
77
+ code: 'RegExp("(a+)+b");',
78
+ errors: [{ messageId: 'redosVulnerable' }],
79
+ },
80
+ ],
81
+ });
82
+ });
83
+ });