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,447 @@
1
+ /**
2
+ * ESLint Rule: no-weak-crypto
3
+ * Detects use of weak cryptography algorithms (MD5, SHA1, DES)
4
+ * CWE-327: Use of a Broken or Risky Cryptographic Algorithm
5
+ *
6
+ * @see https://cwe.mitre.org/data/definitions/327.html
7
+ * @see https://owasp.org/www-community/vulnerabilities/Weak_Cryptography
8
+ */
9
+ import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
10
+ import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
11
+ import { createRule } from '@interlace/eslint-devkit';
12
+
13
+ type MessageIds =
14
+ | 'weakCrypto'
15
+ | 'useSha256'
16
+ | 'useBcrypt'
17
+ | 'useScrypt'
18
+ | 'useArgon2'
19
+ | 'useAes256'
20
+ | 'strategyUpgrade'
21
+ | 'strategyMigrate'
22
+ | 'strategyPolicy'
23
+ | 'strategyAuto';
24
+
25
+ export interface Options {
26
+ /** Allow weak crypto in test files. Default: false */
27
+ allowInTests?: boolean;
28
+
29
+ /** Additional weak algorithms to detect. Default: [] */
30
+ additionalWeakAlgorithms?: string[];
31
+
32
+ /** Trusted crypto libraries. Default: ['crypto', 'crypto-js'] */
33
+ trustedLibraries?: string[];
34
+
35
+ /** Strategy for fixing weak crypto: 'upgrade', 'migrate', 'policy', 'auto' */
36
+ strategy?: 'upgrade' | 'migrate' | 'policy' | 'auto';
37
+ }
38
+
39
+ type RuleOptions = [Options?];
40
+
41
+ /**
42
+ * Weak cryptography patterns and their safe alternatives
43
+ */
44
+ interface WeakCryptoPattern {
45
+ /** Pattern to match (algorithm name, case-insensitive) */
46
+ pattern: RegExp;
47
+ /** Algorithm name for display */
48
+ name: string;
49
+ /** Category of weakness */
50
+ category: 'hash' | 'encryption' | 'password';
51
+ /** Safe alternatives */
52
+ alternatives: string[];
53
+ /** Example fix */
54
+ example: { bad: string; good: string };
55
+ /** Effort to fix */
56
+ effort: string;
57
+ }
58
+
59
+ const WEAK_CRYPTO_PATTERNS: WeakCryptoPattern[] = [
60
+ {
61
+ pattern: /\bmd5\b/i,
62
+ name: 'MD5',
63
+ category: 'hash',
64
+ alternatives: ['SHA-256', 'SHA-512', 'SHA-3'],
65
+ example: {
66
+ bad: 'crypto.createHash("md5").update(data)',
67
+ good: 'crypto.createHash("sha256").update(data)'
68
+ },
69
+ effort: '5 minutes'
70
+ },
71
+ {
72
+ pattern: /\bsha1\b/i,
73
+ name: 'SHA-1',
74
+ category: 'hash',
75
+ alternatives: ['SHA-256', 'SHA-512', 'SHA-3'],
76
+ example: {
77
+ bad: 'crypto.createHash("sha1").update(data)',
78
+ good: 'crypto.createHash("sha256").update(data)'
79
+ },
80
+ effort: '5 minutes'
81
+ },
82
+ {
83
+ pattern: /\bdes\b/i,
84
+ name: 'DES',
85
+ category: 'encryption',
86
+ alternatives: ['AES-256', 'ChaCha20-Poly1305'],
87
+ example: {
88
+ bad: 'crypto.createCipher("des", key)',
89
+ good: 'crypto.createCipheriv("aes-256-gcm", key, iv)'
90
+ },
91
+ effort: '15 minutes'
92
+ },
93
+ {
94
+ pattern: /\b3des\b|\btripledes\b/i,
95
+ name: '3DES',
96
+ category: 'encryption',
97
+ alternatives: ['AES-256', 'ChaCha20-Poly1305'],
98
+ example: {
99
+ bad: 'crypto.createCipher("des-ede3", key)',
100
+ good: 'crypto.createCipheriv("aes-256-gcm", key, iv)'
101
+ },
102
+ effort: '15 minutes'
103
+ },
104
+ {
105
+ pattern: /\brc4\b/i,
106
+ name: 'RC4',
107
+ category: 'encryption',
108
+ alternatives: ['AES-256', 'ChaCha20-Poly1305'],
109
+ example: {
110
+ bad: 'crypto.createCipher("rc4", key)',
111
+ good: 'crypto.createCipheriv("aes-256-gcm", key, iv)'
112
+ },
113
+ effort: '15 minutes'
114
+ }
115
+ ];
116
+
117
+ /**
118
+ * Check if a string contains a weak crypto algorithm
119
+ */
120
+ function containsWeakCrypto(
121
+ value: string,
122
+ additionalPatterns: string[]
123
+ ): WeakCryptoPattern | null {
124
+ // Check standard patterns
125
+ for (const pattern of WEAK_CRYPTO_PATTERNS) {
126
+ if (pattern.pattern.test(value)) {
127
+ return pattern;
128
+ }
129
+ }
130
+
131
+ // Check additional patterns
132
+ for (const additionalPattern of additionalPatterns) {
133
+ const regex = new RegExp(`\\b${additionalPattern}\\b`, 'i');
134
+ if (regex.test(value)) {
135
+ return {
136
+ pattern: regex,
137
+ name: additionalPattern,
138
+ category: 'hash',
139
+ alternatives: ['SHA-256', 'SHA-512'],
140
+ example: {
141
+ bad: `crypto.createHash("${additionalPattern}").update(data)`,
142
+ good: 'crypto.createHash("sha256").update(data)'
143
+ },
144
+ effort: '10 minutes'
145
+ };
146
+ }
147
+ }
148
+
149
+ return null;
150
+ }
151
+
152
+ /**
153
+ * Generate refactoring suggestions based on the weak crypto pattern
154
+ */
155
+ function generateRefactoringSteps(
156
+ pattern: WeakCryptoPattern,
157
+ context: string
158
+ ): { messageId: MessageIds; fix: string }[] {
159
+ const suggestions: { messageId: MessageIds; fix: string }[] = [];
160
+
161
+ if (pattern.category === 'hash') {
162
+ suggestions.push({
163
+ messageId: 'useSha256',
164
+ fix: `Use SHA-256: crypto.createHash("sha256").update(${context})`
165
+ });
166
+ } else if (pattern.category === 'encryption') {
167
+ suggestions.push({
168
+ messageId: 'useAes256',
169
+ fix: `Use AES-256-GCM: crypto.createCipheriv("aes-256-gcm", key, iv)`
170
+ });
171
+ }
172
+
173
+ if (pattern.category === 'password') {
174
+ suggestions.push({
175
+ messageId: 'useBcrypt',
176
+ fix: 'Use bcrypt: bcrypt.hash(password, 10)'
177
+ });
178
+ suggestions.push({
179
+ messageId: 'useScrypt',
180
+ fix: 'Use scrypt: crypto.scrypt(password, salt, 64)'
181
+ });
182
+ suggestions.push({
183
+ messageId: 'useArgon2',
184
+ fix: 'Use Argon2: argon2.hash(password)'
185
+ });
186
+ }
187
+
188
+ return suggestions;
189
+ }
190
+
191
+ export const noWeakCrypto = createRule<RuleOptions, MessageIds>({
192
+ name: 'no-weak-crypto',
193
+ meta: {
194
+ type: 'problem',
195
+ deprecated: true,
196
+ replacedBy: ['@see eslint-plugin-crypto for 24 crypto security rules'],
197
+ docs: {
198
+ description: 'Detects use of weak cryptography algorithms (MD5, SHA1, DES)',
199
+ },
200
+ hasSuggestions: true,
201
+ messages: {
202
+ weakCrypto: formatLLMMessage({
203
+ icon: MessageIcons.SECURITY,
204
+ issueName: 'Weak cryptography',
205
+ cwe: 'CWE-327',
206
+ description: 'Use of weak cryptography algorithm: {{algorithm}}',
207
+ severity: 'CRITICAL',
208
+ fix: '{{safeAlternative}}',
209
+ documentationLink: 'https://owasp.org/www-community/vulnerabilities/Weak_Cryptography',
210
+ }),
211
+ useSha256: formatLLMMessage({
212
+ icon: MessageIcons.INFO,
213
+ issueName: 'Use SHA-256',
214
+ description: 'Use SHA-256 for hashing',
215
+ severity: 'LOW',
216
+ fix: 'crypto.createHash("sha256").update(data)',
217
+ documentationLink: 'https://nodejs.org/api/crypto.html#cryptocreatehashmethod-options',
218
+ }),
219
+ useBcrypt: formatLLMMessage({
220
+ icon: MessageIcons.INFO,
221
+ issueName: 'Use bcrypt',
222
+ description: 'Use bcrypt for password hashing',
223
+ severity: 'LOW',
224
+ fix: 'bcrypt.hash(password, 10)',
225
+ documentationLink: 'https://github.com/kelektiv/node.bcrypt.js',
226
+ }),
227
+ useScrypt: formatLLMMessage({
228
+ icon: MessageIcons.INFO,
229
+ issueName: 'Use scrypt',
230
+ description: 'Use scrypt for password hashing',
231
+ severity: 'LOW',
232
+ fix: 'crypto.scrypt(password, salt, 64)',
233
+ documentationLink: 'https://nodejs.org/api/crypto.html#cryptoscryptpassword-salt-keylen-options-callback',
234
+ }),
235
+ useArgon2: formatLLMMessage({
236
+ icon: MessageIcons.INFO,
237
+ issueName: 'Use Argon2',
238
+ description: 'Use Argon2 for password hashing',
239
+ severity: 'LOW',
240
+ fix: 'argon2.hash(password)',
241
+ documentationLink: 'https://github.com/ranisalt/node-argon2',
242
+ }),
243
+ useAes256: formatLLMMessage({
244
+ icon: MessageIcons.INFO,
245
+ issueName: 'Use AES-256-GCM',
246
+ description: 'Use AES-256-GCM for encryption',
247
+ severity: 'LOW',
248
+ fix: 'Use crypto.createCipheriv("aes-256-gcm", key, iv)',
249
+ documentationLink: 'https://nodejs.org/api/crypto.html#cryptocreatecipherivalgorithm-key-iv-options',
250
+ }),
251
+ strategyAuto: formatLLMMessage({
252
+ icon: MessageIcons.INFO,
253
+ issueName: 'Auto-fix Strategy',
254
+ description: 'Automatically suggest the best replacement',
255
+ severity: 'LOW',
256
+ fix: 'Apply automatic fix suggestion',
257
+ documentationLink: 'https://owasp.org/www-community/vulnerabilities/Weak_Cryptography',
258
+ }),
259
+ strategyUpgrade: formatLLMMessage({
260
+ icon: MessageIcons.INFO,
261
+ issueName: 'Upgrade Strategy',
262
+ description: 'Upgrade to a stronger algorithm',
263
+ severity: 'LOW',
264
+ fix: 'Replace weak algorithm with stronger alternative',
265
+ documentationLink: 'https://owasp.org/www-community/vulnerabilities/Weak_Cryptography',
266
+ }),
267
+ strategyMigrate: formatLLMMessage({
268
+ icon: MessageIcons.INFO,
269
+ issueName: 'Migration Strategy',
270
+ description: 'Plan migration to stronger cryptography',
271
+ severity: 'LOW',
272
+ fix: 'Create migration plan for cryptographic upgrade',
273
+ documentationLink: 'https://owasp.org/www-community/vulnerabilities/Weak_Cryptography',
274
+ }),
275
+ strategyPolicy: formatLLMMessage({
276
+ icon: MessageIcons.INFO,
277
+ issueName: 'Policy Strategy',
278
+ description: 'Apply organizational security policy',
279
+ severity: 'LOW',
280
+ fix: 'crypto.createCipheriv("aes-256-gcm", key, iv)',
281
+ documentationLink: 'https://nodejs.org/api/crypto.html#cryptocreatecipherivalgorithm-key-iv-options',
282
+ }),
283
+ },
284
+ schema: [
285
+ {
286
+ type: 'object',
287
+ properties: {
288
+ allowInTests: {
289
+ type: 'boolean',
290
+ default: false,
291
+ description: 'Allow weak crypto in test files',
292
+ },
293
+ additionalWeakAlgorithms: {
294
+ type: 'array',
295
+ items: { type: 'string' },
296
+ default: [],
297
+ description: 'Additional weak algorithms to detect',
298
+ },
299
+ trustedLibraries: {
300
+ type: 'array',
301
+ items: { type: 'string' },
302
+ default: ['crypto', 'crypto-js'],
303
+ description: 'Trusted crypto libraries',
304
+ },
305
+ },
306
+ additionalProperties: false,
307
+ },
308
+ ],
309
+ },
310
+ defaultOptions: [
311
+ {
312
+ allowInTests: false,
313
+ additionalWeakAlgorithms: [],
314
+ trustedLibraries: ['crypto', 'crypto-js'],
315
+ },
316
+ ],
317
+ create(
318
+ context: TSESLint.RuleContext<MessageIds, RuleOptions>,
319
+ [options = {}]
320
+ ) {
321
+ const {
322
+ allowInTests = false,
323
+ additionalWeakAlgorithms = [],
324
+ trustedLibraries = ['crypto', 'crypto-js'],
325
+ } = options as Options;
326
+
327
+ const filename = context.getFilename();
328
+ const isTestFile = allowInTests && /\.(test|spec)\.(ts|tsx|js|jsx)$/.test(filename);
329
+
330
+ /**
331
+ * Check if a call expression uses weak crypto
332
+ */
333
+ function checkCallExpression(node: TSESTree.CallExpression) {
334
+ if (isTestFile) {
335
+ return;
336
+ }
337
+
338
+ // Check for crypto.createHash, crypto.createCipher, etc.
339
+ if (node.callee.type === 'MemberExpression') {
340
+ // Check if it's a crypto method call (e.g., crypto.createHash, crypto.createCipher)
341
+ if (
342
+ node.callee.object.type === 'Identifier' &&
343
+ node.callee.property.type === 'Identifier'
344
+ ) {
345
+ const objectName = node.callee.object.name;
346
+ const methodName = node.callee.property.name;
347
+
348
+ // Check if it's a crypto method from a trusted library
349
+ const isCryptoMethod =
350
+ (methodName === 'createHash' ||
351
+ methodName === 'createCipher' ||
352
+ methodName === 'createCipheriv') &&
353
+ (trustedLibraries.includes(objectName) || objectName === 'crypto');
354
+
355
+ if (isCryptoMethod) {
356
+ // Check arguments for weak algorithms
357
+ for (const arg of node.arguments) {
358
+ if (arg.type === 'Literal' && typeof arg.value === 'string') {
359
+ const weakPattern = containsWeakCrypto(
360
+ arg.value,
361
+ additionalWeakAlgorithms
362
+ );
363
+
364
+ if (weakPattern) {
365
+ const safeAlternative = weakPattern.alternatives[0];
366
+ const refactoringSteps = generateRefactoringSteps(
367
+ weakPattern,
368
+ 'data'
369
+ );
370
+
371
+ context.report({
372
+ node: arg,
373
+ messageId: 'weakCrypto',
374
+ data: {
375
+ algorithm: weakPattern.name,
376
+ safeAlternative: `Use ${safeAlternative}: ${weakPattern.example.good}`,
377
+ },
378
+ suggest: refactoringSteps.map(step => ({
379
+ messageId: step.messageId,
380
+ fix: (fixer: TSESLint.RuleFixer) => {
381
+ // Replace the weak algorithm with a safe one
382
+ if (weakPattern.category === 'hash') {
383
+ return fixer.replaceText(arg, `"sha256"`);
384
+ } else if (weakPattern.category === 'encryption') {
385
+ return fixer.replaceText(arg, `"aes-256-gcm"`);
386
+ }
387
+ return null;
388
+ },
389
+ })),
390
+ });
391
+ }
392
+ }
393
+ }
394
+ }
395
+ }
396
+ }
397
+
398
+ // Check for standalone crypto function calls (e.g., createHash, createCipher)
399
+ if (node.callee.type === 'Identifier') {
400
+ const calleeName = node.callee.name;
401
+
402
+ // Check for common crypto library patterns
403
+ if (calleeName === 'createHash' || calleeName === 'createCipher' || calleeName === 'createCipheriv') {
404
+ for (const arg of node.arguments) {
405
+ if (arg.type === 'Literal' && typeof arg.value === 'string') {
406
+ const weakPattern = containsWeakCrypto(
407
+ arg.value,
408
+ additionalWeakAlgorithms
409
+ );
410
+
411
+ if (weakPattern) {
412
+ const safeAlternative = weakPattern.alternatives[0];
413
+
414
+ context.report({
415
+ node: arg,
416
+ messageId: 'weakCrypto',
417
+ data: {
418
+ algorithm: weakPattern.name,
419
+ safeAlternative: `Use ${safeAlternative}: ${weakPattern.example.good}`,
420
+ },
421
+ suggest: [
422
+ {
423
+ messageId: weakPattern.category === 'hash' ? 'useSha256' : 'useAes256',
424
+ fix: (fixer: TSESLint.RuleFixer) => {
425
+ if (weakPattern.category === 'hash') {
426
+ return fixer.replaceText(arg, `"sha256"`);
427
+ } else if (weakPattern.category === 'encryption') {
428
+ return fixer.replaceText(arg, `"aes-256-gcm"`);
429
+ }
430
+ return null;
431
+ },
432
+ },
433
+ ],
434
+ });
435
+ }
436
+ }
437
+ }
438
+ }
439
+ }
440
+ }
441
+
442
+ return {
443
+ CallExpression: checkCallExpression,
444
+ };
445
+ },
446
+ });
447
+