eslint-plugin-secure-coding 2.3.3 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/CHANGELOG.md +51 -1
  2. package/README.md +2 -2
  3. package/package.json +1 -1
  4. package/src/index.d.ts +32 -0
  5. package/src/index.js +416 -0
  6. package/src/rules/detect-child-process/index.d.ts +11 -0
  7. package/src/rules/detect-child-process/index.js +529 -0
  8. package/src/rules/detect-eval-with-expression/index.d.ts +9 -0
  9. package/src/rules/detect-eval-with-expression/index.js +392 -0
  10. package/src/rules/detect-mixed-content/index.d.ts +8 -0
  11. package/src/rules/detect-mixed-content/index.js +44 -0
  12. package/src/rules/detect-non-literal-fs-filename/index.d.ts +7 -0
  13. package/src/rules/detect-non-literal-fs-filename/index.js +454 -0
  14. package/src/rules/detect-non-literal-regexp/index.d.ts +9 -0
  15. package/src/rules/detect-non-literal-regexp/index.js +403 -0
  16. package/src/rules/detect-object-injection/index.d.ts +11 -0
  17. package/src/rules/detect-object-injection/index.js +560 -0
  18. package/src/rules/detect-suspicious-dependencies/index.d.ts +8 -0
  19. package/src/rules/detect-suspicious-dependencies/index.js +71 -0
  20. package/src/rules/detect-weak-password-validation/index.d.ts +6 -0
  21. package/src/rules/detect-weak-password-validation/index.js +58 -0
  22. package/src/rules/no-allow-arbitrary-loads/index.d.ts +8 -0
  23. package/src/rules/no-allow-arbitrary-loads/index.js +47 -0
  24. package/src/rules/no-arbitrary-file-access/index.d.ts +13 -0
  25. package/src/rules/no-arbitrary-file-access/index.js +195 -0
  26. package/src/rules/no-buffer-overread/index.d.ts +29 -0
  27. package/src/rules/no-buffer-overread/index.js +606 -0
  28. package/src/rules/no-clickjacking/index.d.ts +10 -0
  29. package/src/rules/no-clickjacking/index.js +396 -0
  30. package/src/rules/no-client-side-auth-logic/index.d.ts +6 -0
  31. package/src/rules/no-client-side-auth-logic/index.js +69 -0
  32. package/src/rules/no-credentials-in-query-params/index.d.ts +8 -0
  33. package/src/rules/no-credentials-in-query-params/index.js +57 -0
  34. package/src/rules/no-data-in-temp-storage/index.d.ts +6 -0
  35. package/src/rules/no-data-in-temp-storage/index.js +64 -0
  36. package/src/rules/no-debug-code-in-production/index.d.ts +8 -0
  37. package/src/rules/no-debug-code-in-production/index.js +51 -0
  38. package/src/rules/no-directive-injection/index.d.ts +12 -0
  39. package/src/rules/no-directive-injection/index.js +457 -0
  40. package/src/rules/no-disabled-certificate-validation/index.d.ts +6 -0
  41. package/src/rules/no-disabled-certificate-validation/index.js +61 -0
  42. package/src/rules/no-dynamic-dependency-loading/index.d.ts +8 -0
  43. package/src/rules/no-dynamic-dependency-loading/index.js +51 -0
  44. package/src/rules/no-electron-security-issues/index.d.ts +10 -0
  45. package/src/rules/no-electron-security-issues/index.js +423 -0
  46. package/src/rules/no-exposed-debug-endpoints/index.d.ts +6 -0
  47. package/src/rules/no-exposed-debug-endpoints/index.js +62 -0
  48. package/src/rules/no-exposed-sensitive-data/index.d.ts +11 -0
  49. package/src/rules/no-exposed-sensitive-data/index.js +340 -0
  50. package/src/rules/no-format-string-injection/index.d.ts +17 -0
  51. package/src/rules/no-format-string-injection/index.js +660 -0
  52. package/src/rules/no-graphql-injection/index.d.ts +12 -0
  53. package/src/rules/no-graphql-injection/index.js +411 -0
  54. package/src/rules/no-hardcoded-credentials/index.d.ts +26 -0
  55. package/src/rules/no-hardcoded-credentials/index.js +376 -0
  56. package/src/rules/no-hardcoded-session-tokens/index.d.ts +6 -0
  57. package/src/rules/no-hardcoded-session-tokens/index.js +59 -0
  58. package/src/rules/no-http-urls/index.d.ts +12 -0
  59. package/src/rules/no-http-urls/index.js +114 -0
  60. package/src/rules/no-improper-sanitization/index.d.ts +12 -0
  61. package/src/rules/no-improper-sanitization/index.js +411 -0
  62. package/src/rules/no-improper-type-validation/index.d.ts +10 -0
  63. package/src/rules/no-improper-type-validation/index.js +475 -0
  64. package/src/rules/no-insecure-comparison/index.d.ts +7 -0
  65. package/src/rules/no-insecure-comparison/index.js +193 -0
  66. package/src/rules/no-insecure-redirects/index.d.ts +7 -0
  67. package/src/rules/no-insecure-redirects/index.js +216 -0
  68. package/src/rules/no-insecure-websocket/index.d.ts +6 -0
  69. package/src/rules/no-insecure-websocket/index.js +61 -0
  70. package/src/rules/no-ldap-injection/index.d.ts +10 -0
  71. package/src/rules/no-ldap-injection/index.js +455 -0
  72. package/src/rules/no-missing-authentication/index.d.ts +13 -0
  73. package/src/rules/no-missing-authentication/index.js +333 -0
  74. package/src/rules/no-missing-cors-check/index.d.ts +9 -0
  75. package/src/rules/no-missing-cors-check/index.js +399 -0
  76. package/src/rules/no-missing-csrf-protection/index.d.ts +11 -0
  77. package/src/rules/no-missing-csrf-protection/index.js +180 -0
  78. package/src/rules/no-missing-security-headers/index.d.ts +7 -0
  79. package/src/rules/no-missing-security-headers/index.js +218 -0
  80. package/src/rules/no-password-in-url/index.d.ts +8 -0
  81. package/src/rules/no-password-in-url/index.js +54 -0
  82. package/src/rules/no-permissive-cors/index.d.ts +8 -0
  83. package/src/rules/no-permissive-cors/index.js +65 -0
  84. package/src/rules/no-pii-in-logs/index.d.ts +8 -0
  85. package/src/rules/no-pii-in-logs/index.js +70 -0
  86. package/src/rules/no-privilege-escalation/index.d.ts +13 -0
  87. package/src/rules/no-privilege-escalation/index.js +321 -0
  88. package/src/rules/no-redos-vulnerable-regex/index.d.ts +7 -0
  89. package/src/rules/no-redos-vulnerable-regex/index.js +306 -0
  90. package/src/rules/no-sensitive-data-exposure/index.d.ts +11 -0
  91. package/src/rules/no-sensitive-data-exposure/index.js +250 -0
  92. package/src/rules/no-sensitive-data-in-analytics/index.d.ts +8 -0
  93. package/src/rules/no-sensitive-data-in-analytics/index.js +62 -0
  94. package/src/rules/no-sensitive-data-in-cache/index.d.ts +8 -0
  95. package/src/rules/no-sensitive-data-in-cache/index.js +52 -0
  96. package/src/rules/no-toctou-vulnerability/index.d.ts +7 -0
  97. package/src/rules/no-toctou-vulnerability/index.js +208 -0
  98. package/src/rules/no-tracking-without-consent/index.d.ts +6 -0
  99. package/src/rules/no-tracking-without-consent/index.js +67 -0
  100. package/src/rules/no-unchecked-loop-condition/index.d.ts +12 -0
  101. package/src/rules/no-unchecked-loop-condition/index.js +646 -0
  102. package/src/rules/no-unencrypted-transmission/index.d.ts +11 -0
  103. package/src/rules/no-unencrypted-transmission/index.js +236 -0
  104. package/src/rules/no-unescaped-url-parameter/index.d.ts +9 -0
  105. package/src/rules/no-unescaped-url-parameter/index.js +355 -0
  106. package/src/rules/no-unlimited-resource-allocation/index.d.ts +12 -0
  107. package/src/rules/no-unlimited-resource-allocation/index.js +643 -0
  108. package/src/rules/no-unsafe-deserialization/index.d.ts +10 -0
  109. package/src/rules/no-unsafe-deserialization/index.js +491 -0
  110. package/src/rules/no-unsafe-dynamic-require/index.d.ts +5 -0
  111. package/src/rules/no-unsafe-dynamic-require/index.js +106 -0
  112. package/src/rules/no-unsafe-regex-construction/index.d.ts +9 -0
  113. package/src/rules/no-unsafe-regex-construction/index.js +291 -0
  114. package/src/rules/no-unvalidated-deeplinks/index.d.ts +6 -0
  115. package/src/rules/no-unvalidated-deeplinks/index.js +62 -0
  116. package/src/rules/no-unvalidated-user-input/index.d.ts +9 -0
  117. package/src/rules/no-unvalidated-user-input/index.js +420 -0
  118. package/src/rules/no-verbose-error-messages/index.d.ts +8 -0
  119. package/src/rules/no-verbose-error-messages/index.js +68 -0
  120. package/src/rules/no-weak-password-recovery/index.d.ts +12 -0
  121. package/src/rules/no-weak-password-recovery/index.js +424 -0
  122. package/src/rules/no-xpath-injection/index.d.ts +10 -0
  123. package/src/rules/no-xpath-injection/index.js +487 -0
  124. package/src/rules/no-xxe-injection/index.d.ts +7 -0
  125. package/src/rules/no-xxe-injection/index.js +266 -0
  126. package/src/rules/no-zip-slip/index.d.ts +9 -0
  127. package/src/rules/no-zip-slip/index.js +445 -0
  128. package/src/rules/require-backend-authorization/index.d.ts +6 -0
  129. package/src/rules/require-backend-authorization/index.js +60 -0
  130. package/src/rules/require-code-minification/index.d.ts +8 -0
  131. package/src/rules/require-code-minification/index.js +47 -0
  132. package/src/rules/require-csp-headers/index.d.ts +6 -0
  133. package/src/rules/require-csp-headers/index.js +64 -0
  134. package/src/rules/require-data-minimization/index.d.ts +8 -0
  135. package/src/rules/require-data-minimization/index.js +53 -0
  136. package/src/rules/require-dependency-integrity/index.d.ts +6 -0
  137. package/src/rules/require-dependency-integrity/index.js +64 -0
  138. package/src/rules/require-https-only/index.d.ts +8 -0
  139. package/src/rules/require-https-only/index.js +62 -0
  140. package/src/rules/require-mime-type-validation/index.d.ts +6 -0
  141. package/src/rules/require-mime-type-validation/index.js +66 -0
  142. package/src/rules/require-network-timeout/index.d.ts +8 -0
  143. package/src/rules/require-network-timeout/index.js +50 -0
  144. package/src/rules/require-package-lock/index.d.ts +8 -0
  145. package/src/rules/require-package-lock/index.js +63 -0
  146. package/src/rules/require-secure-credential-storage/index.d.ts +8 -0
  147. package/src/rules/require-secure-credential-storage/index.js +50 -0
  148. package/src/rules/require-secure-defaults/index.d.ts +8 -0
  149. package/src/rules/require-secure-defaults/index.js +47 -0
  150. package/src/rules/require-secure-deletion/index.d.ts +8 -0
  151. package/src/rules/require-secure-deletion/index.js +44 -0
  152. package/src/rules/require-storage-encryption/index.d.ts +8 -0
  153. package/src/rules/require-storage-encryption/index.js +50 -0
  154. package/src/rules/require-url-validation/index.d.ts +6 -0
  155. package/src/rules/require-url-validation/index.js +72 -0
  156. package/src/types/index.d.ts +106 -0
  157. package/src/types/index.js +16 -0
  158. package/src/index.ts +0 -605
  159. package/src/rules/__tests__/integration-demo.test.ts +0 -290
  160. package/src/rules/__tests__/integration-llm.test.ts +0 -89
  161. package/src/rules/database-injection/database-injection.test.ts +0 -456
  162. package/src/rules/database-injection/index.ts +0 -488
  163. package/src/rules/detect-child-process/detect-child-process.test.ts +0 -207
  164. package/src/rules/detect-child-process/index.ts +0 -634
  165. package/src/rules/detect-eval-with-expression/detect-eval-with-expression.test.ts +0 -416
  166. package/src/rules/detect-eval-with-expression/index.ts +0 -463
  167. package/src/rules/detect-mixed-content/detect-mixed-content.test.ts +0 -28
  168. package/src/rules/detect-mixed-content/index.ts +0 -52
  169. package/src/rules/detect-non-literal-fs-filename/detect-non-literal-fs-filename.test.ts +0 -269
  170. package/src/rules/detect-non-literal-fs-filename/index.ts +0 -551
  171. package/src/rules/detect-non-literal-regexp/detect-non-literal-regexp.test.ts +0 -189
  172. package/src/rules/detect-non-literal-regexp/index.ts +0 -490
  173. package/src/rules/detect-object-injection/detect-object-injection.test.ts +0 -440
  174. package/src/rules/detect-object-injection/index.ts +0 -674
  175. package/src/rules/detect-suspicious-dependencies/detect-suspicious-dependencies.test.ts +0 -32
  176. package/src/rules/detect-suspicious-dependencies/index.ts +0 -84
  177. package/src/rules/detect-weak-password-validation/detect-weak-password-validation.test.ts +0 -31
  178. package/src/rules/detect-weak-password-validation/index.ts +0 -68
  179. package/src/rules/no-allow-arbitrary-loads/index.ts +0 -54
  180. package/src/rules/no-allow-arbitrary-loads/no-allow-arbitrary-loads.test.ts +0 -28
  181. package/src/rules/no-arbitrary-file-access/index.ts +0 -238
  182. package/src/rules/no-arbitrary-file-access/no-arbitrary-file-access.test.ts +0 -119
  183. package/src/rules/no-buffer-overread/index.ts +0 -724
  184. package/src/rules/no-buffer-overread/no-buffer-overread.test.ts +0 -313
  185. package/src/rules/no-clickjacking/index.ts +0 -481
  186. package/src/rules/no-clickjacking/no-clickjacking.test.ts +0 -253
  187. package/src/rules/no-client-side-auth-logic/index.ts +0 -81
  188. package/src/rules/no-client-side-auth-logic/no-client-side-auth-logic.test.ts +0 -33
  189. package/src/rules/no-credentials-in-query-params/index.ts +0 -69
  190. package/src/rules/no-credentials-in-query-params/no-credentials-in-query-params.test.ts +0 -33
  191. package/src/rules/no-credentials-in-storage-api/index.ts +0 -64
  192. package/src/rules/no-credentials-in-storage-api/no-credentials-in-storage-api.test.ts +0 -31
  193. package/src/rules/no-data-in-temp-storage/index.ts +0 -75
  194. package/src/rules/no-data-in-temp-storage/no-data-in-temp-storage.test.ts +0 -33
  195. package/src/rules/no-debug-code-in-production/index.ts +0 -59
  196. package/src/rules/no-debug-code-in-production/no-debug-code-in-production.test.ts +0 -26
  197. package/src/rules/no-directive-injection/index.ts +0 -551
  198. package/src/rules/no-directive-injection/no-directive-injection.test.ts +0 -305
  199. package/src/rules/no-disabled-certificate-validation/index.ts +0 -72
  200. package/src/rules/no-disabled-certificate-validation/no-disabled-certificate-validation.test.ts +0 -33
  201. package/src/rules/no-document-cookie/index.ts +0 -113
  202. package/src/rules/no-document-cookie/no-document-cookie.test.ts +0 -382
  203. package/src/rules/no-dynamic-dependency-loading/index.ts +0 -60
  204. package/src/rules/no-dynamic-dependency-loading/no-dynamic-dependency-loading.test.ts +0 -27
  205. package/src/rules/no-electron-security-issues/index.ts +0 -504
  206. package/src/rules/no-electron-security-issues/no-electron-security-issues.test.ts +0 -324
  207. package/src/rules/no-exposed-debug-endpoints/index.ts +0 -73
  208. package/src/rules/no-exposed-debug-endpoints/no-exposed-debug-endpoints.test.ts +0 -40
  209. package/src/rules/no-exposed-sensitive-data/index.ts +0 -428
  210. package/src/rules/no-exposed-sensitive-data/no-exposed-sensitive-data.test.ts +0 -75
  211. package/src/rules/no-format-string-injection/index.ts +0 -801
  212. package/src/rules/no-format-string-injection/no-format-string-injection.test.ts +0 -437
  213. package/src/rules/no-graphql-injection/index.ts +0 -508
  214. package/src/rules/no-graphql-injection/no-graphql-injection.test.ts +0 -371
  215. package/src/rules/no-hardcoded-credentials/index.ts +0 -478
  216. package/src/rules/no-hardcoded-credentials/no-hardcoded-credentials.test.ts +0 -639
  217. package/src/rules/no-hardcoded-session-tokens/index.ts +0 -69
  218. package/src/rules/no-hardcoded-session-tokens/no-hardcoded-session-tokens.test.ts +0 -42
  219. package/src/rules/no-http-urls/index.ts +0 -131
  220. package/src/rules/no-http-urls/no-http-urls.test.ts +0 -60
  221. package/src/rules/no-improper-sanitization/index.ts +0 -502
  222. package/src/rules/no-improper-sanitization/no-improper-sanitization.test.ts +0 -156
  223. package/src/rules/no-improper-type-validation/index.ts +0 -572
  224. package/src/rules/no-improper-type-validation/no-improper-type-validation.test.ts +0 -372
  225. package/src/rules/no-insecure-comparison/index.ts +0 -232
  226. package/src/rules/no-insecure-comparison/no-insecure-comparison.test.ts +0 -218
  227. package/src/rules/no-insecure-cookie-settings/index.ts +0 -391
  228. package/src/rules/no-insecure-cookie-settings/no-insecure-cookie-settings.test.ts +0 -409
  229. package/src/rules/no-insecure-jwt/index.ts +0 -467
  230. package/src/rules/no-insecure-jwt/no-insecure-jwt.test.ts +0 -259
  231. package/src/rules/no-insecure-redirects/index.ts +0 -267
  232. package/src/rules/no-insecure-redirects/no-insecure-redirects.test.ts +0 -108
  233. package/src/rules/no-insecure-websocket/index.ts +0 -72
  234. package/src/rules/no-insecure-websocket/no-insecure-websocket.test.ts +0 -42
  235. package/src/rules/no-insufficient-postmessage-validation/index.ts +0 -497
  236. package/src/rules/no-insufficient-postmessage-validation/no-insufficient-postmessage-validation.test.ts +0 -360
  237. package/src/rules/no-insufficient-random/index.ts +0 -288
  238. package/src/rules/no-insufficient-random/no-insufficient-random.test.ts +0 -246
  239. package/src/rules/no-ldap-injection/index.ts +0 -547
  240. package/src/rules/no-ldap-injection/no-ldap-injection.test.ts +0 -317
  241. package/src/rules/no-missing-authentication/index.ts +0 -408
  242. package/src/rules/no-missing-authentication/no-missing-authentication.test.ts +0 -350
  243. package/src/rules/no-missing-cors-check/index.ts +0 -453
  244. package/src/rules/no-missing-cors-check/no-missing-cors-check.test.ts +0 -392
  245. package/src/rules/no-missing-csrf-protection/index.ts +0 -229
  246. package/src/rules/no-missing-csrf-protection/no-missing-csrf-protection.test.ts +0 -222
  247. package/src/rules/no-missing-security-headers/index.ts +0 -266
  248. package/src/rules/no-missing-security-headers/no-missing-security-headers.test.ts +0 -98
  249. package/src/rules/no-password-in-url/index.ts +0 -64
  250. package/src/rules/no-password-in-url/no-password-in-url.test.ts +0 -27
  251. package/src/rules/no-permissive-cors/index.ts +0 -78
  252. package/src/rules/no-permissive-cors/no-permissive-cors.test.ts +0 -28
  253. package/src/rules/no-pii-in-logs/index.ts +0 -83
  254. package/src/rules/no-pii-in-logs/no-pii-in-logs.test.ts +0 -26
  255. package/src/rules/no-postmessage-origin-wildcard/index.ts +0 -67
  256. package/src/rules/no-postmessage-origin-wildcard/no-postmessage-origin-wildcard.test.ts +0 -27
  257. package/src/rules/no-privilege-escalation/index.ts +0 -403
  258. package/src/rules/no-privilege-escalation/no-privilege-escalation.test.ts +0 -306
  259. package/src/rules/no-redos-vulnerable-regex/index.ts +0 -379
  260. package/src/rules/no-redos-vulnerable-regex/no-redos-vulnerable-regex.test.ts +0 -83
  261. package/src/rules/no-sensitive-data-exposure/index.ts +0 -294
  262. package/src/rules/no-sensitive-data-exposure/no-sensitive-data-exposure.test.ts +0 -262
  263. package/src/rules/no-sensitive-data-in-analytics/index.ts +0 -73
  264. package/src/rules/no-sensitive-data-in-analytics/no-sensitive-data-in-analytics.test.ts +0 -42
  265. package/src/rules/no-sensitive-data-in-cache/index.ts +0 -59
  266. package/src/rules/no-sensitive-data-in-cache/no-sensitive-data-in-cache.test.ts +0 -32
  267. package/src/rules/no-sql-injection/index.ts +0 -424
  268. package/src/rules/no-sql-injection/no-sql-injection.test.ts +0 -303
  269. package/src/rules/no-timing-attack/index.ts +0 -552
  270. package/src/rules/no-timing-attack/no-timing-attack.test.ts +0 -348
  271. package/src/rules/no-toctou-vulnerability/index.ts +0 -250
  272. package/src/rules/no-toctou-vulnerability/no-toctou-vulnerability.test.ts +0 -60
  273. package/src/rules/no-tracking-without-consent/index.ts +0 -78
  274. package/src/rules/no-tracking-without-consent/no-tracking-without-consent.test.ts +0 -34
  275. package/src/rules/no-unchecked-loop-condition/index.ts +0 -781
  276. package/src/rules/no-unchecked-loop-condition/no-unchecked-loop-condition.test.ts +0 -459
  277. package/src/rules/no-unencrypted-local-storage/index.ts +0 -73
  278. package/src/rules/no-unencrypted-local-storage/no-unencrypted-local-storage.test.ts +0 -41
  279. package/src/rules/no-unencrypted-transmission/index.ts +0 -296
  280. package/src/rules/no-unencrypted-transmission/no-unencrypted-transmission.test.ts +0 -287
  281. package/src/rules/no-unescaped-url-parameter/index.ts +0 -424
  282. package/src/rules/no-unescaped-url-parameter/no-unescaped-url-parameter.test.ts +0 -263
  283. package/src/rules/no-unlimited-resource-allocation/index.ts +0 -767
  284. package/src/rules/no-unlimited-resource-allocation/no-unlimited-resource-allocation.test.ts +0 -544
  285. package/src/rules/no-unsafe-deserialization/index.ts +0 -593
  286. package/src/rules/no-unsafe-deserialization/no-unsafe-deserialization.test.ts +0 -310
  287. package/src/rules/no-unsafe-dynamic-require/index.ts +0 -125
  288. package/src/rules/no-unsafe-dynamic-require/no-unsafe-dynamic-require.test.ts +0 -151
  289. package/src/rules/no-unsafe-regex-construction/index.ts +0 -370
  290. package/src/rules/no-unsafe-regex-construction/no-unsafe-regex-construction.test.ts +0 -181
  291. package/src/rules/no-unsanitized-html/index.ts +0 -400
  292. package/src/rules/no-unsanitized-html/no-unsanitized-html.test.ts +0 -488
  293. package/src/rules/no-unvalidated-deeplinks/index.ts +0 -73
  294. package/src/rules/no-unvalidated-deeplinks/no-unvalidated-deeplinks.test.ts +0 -29
  295. package/src/rules/no-unvalidated-user-input/index.ts +0 -498
  296. package/src/rules/no-unvalidated-user-input/no-unvalidated-user-input.test.ts +0 -463
  297. package/src/rules/no-verbose-error-messages/index.ts +0 -83
  298. package/src/rules/no-verbose-error-messages/no-verbose-error-messages.test.ts +0 -34
  299. package/src/rules/no-weak-crypto/index.ts +0 -447
  300. package/src/rules/no-weak-crypto/no-weak-crypto.test.ts +0 -297
  301. package/src/rules/no-weak-password-recovery/index.ts +0 -509
  302. package/src/rules/no-weak-password-recovery/no-weak-password-recovery.test.ts +0 -184
  303. package/src/rules/no-xpath-injection/index.ts +0 -596
  304. package/src/rules/no-xpath-injection/no-xpath-injection.test.ts +0 -405
  305. package/src/rules/no-xxe-injection/index.ts +0 -342
  306. package/src/rules/no-xxe-injection/no-xxe-injection.test.ts +0 -122
  307. package/src/rules/no-zip-slip/index.ts +0 -526
  308. package/src/rules/no-zip-slip/no-zip-slip.test.ts +0 -305
  309. package/src/rules/require-backend-authorization/index.ts +0 -71
  310. package/src/rules/require-backend-authorization/require-backend-authorization.test.ts +0 -31
  311. package/src/rules/require-code-minification/index.ts +0 -54
  312. package/src/rules/require-code-minification/require-code-minification.test.ts +0 -30
  313. package/src/rules/require-csp-headers/index.ts +0 -74
  314. package/src/rules/require-csp-headers/require-csp-headers.test.ts +0 -34
  315. package/src/rules/require-data-minimization/index.ts +0 -65
  316. package/src/rules/require-data-minimization/require-data-minimization.test.ts +0 -31
  317. package/src/rules/require-dependency-integrity/index.ts +0 -78
  318. package/src/rules/require-dependency-integrity/require-dependency-integrity.test.ts +0 -44
  319. package/src/rules/require-https-only/index.ts +0 -75
  320. package/src/rules/require-https-only/require-https-only.test.ts +0 -26
  321. package/src/rules/require-mime-type-validation/index.ts +0 -77
  322. package/src/rules/require-mime-type-validation/require-mime-type-validation.test.ts +0 -32
  323. package/src/rules/require-network-timeout/index.ts +0 -58
  324. package/src/rules/require-network-timeout/require-network-timeout.test.ts +0 -26
  325. package/src/rules/require-package-lock/index.ts +0 -75
  326. package/src/rules/require-package-lock/require-package-lock.test.ts +0 -27
  327. package/src/rules/require-secure-credential-storage/index.ts +0 -60
  328. package/src/rules/require-secure-credential-storage/require-secure-credential-storage.test.ts +0 -26
  329. package/src/rules/require-secure-defaults/index.ts +0 -54
  330. package/src/rules/require-secure-defaults/require-secure-defaults.test.ts +0 -26
  331. package/src/rules/require-secure-deletion/index.ts +0 -52
  332. package/src/rules/require-secure-deletion/require-secure-deletion.test.ts +0 -29
  333. package/src/rules/require-storage-encryption/index.ts +0 -60
  334. package/src/rules/require-storage-encryption/require-storage-encryption.test.ts +0 -26
  335. package/src/rules/require-url-validation/index.ts +0 -85
  336. package/src/rules/require-url-validation/require-url-validation.test.ts +0 -32
  337. package/src/types/index.ts +0 -235
@@ -0,0 +1,529 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.detectChildProcess = void 0;
4
+ const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
+ const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
+ const COMMAND_PATTERNS = [
7
+ {
8
+ method: 'exec',
9
+ dangerous: true,
10
+ vulnerability: 'command-injection',
11
+ safeAlternatives: ['execFile', 'spawn'],
12
+ example: {
13
+ bad: 'exec(`git clone ${repoUrl}`)',
14
+ good: [
15
+ 'execFile(\'git\', [\'clone\', repoUrl], {shell: false})',
16
+ 'spawn(\'git\', [\'clone\', repoUrl], {shell: false})'
17
+ ]
18
+ },
19
+ effort: '15-25 minutes'
20
+ },
21
+ {
22
+ method: 'execSync',
23
+ dangerous: true,
24
+ vulnerability: 'command-injection',
25
+ safeAlternatives: ['execFileSync', 'spawnSync'],
26
+ example: {
27
+ bad: 'execSync(`npm install ${packageName}`)',
28
+ good: [
29
+ 'execFileSync(\'npm\', [\'install\', packageName], {shell: false})',
30
+ 'spawnSync(\'npm\', [\'install\', packageName], {shell: false})'
31
+ ]
32
+ },
33
+ effort: '15-25 minutes'
34
+ },
35
+ {
36
+ method: 'spawn',
37
+ dangerous: false,
38
+ vulnerability: 'argument-injection',
39
+ safeAlternatives: ['spawn with validation'],
40
+ example: {
41
+ bad: 'spawn(\'bash\', [\'-c\', userCommand])',
42
+ good: [
43
+ 'spawn(validatedCommand, validatedArgs, {shell: false})',
44
+ '// Validate command and args first'
45
+ ]
46
+ },
47
+ effort: '20-30 minutes'
48
+ },
49
+ {
50
+ method: 'execFile',
51
+ dangerous: true,
52
+ vulnerability: 'command-injection',
53
+ safeAlternatives: ['spawn'],
54
+ example: {
55
+ bad: 'execFile(userCommand, userArgs, callback)',
56
+ good: [
57
+ 'spawn(validatedCommand, validatedArgs, {shell: false})',
58
+ '// Validate command and args first'
59
+ ]
60
+ },
61
+ effort: '10-15 minutes'
62
+ },
63
+ {
64
+ method: 'execFileSync',
65
+ dangerous: true,
66
+ vulnerability: 'command-injection',
67
+ safeAlternatives: ['spawnSync'],
68
+ example: {
69
+ bad: 'execFileSync(userCommand, userArgs)',
70
+ good: [
71
+ 'spawnSync(validatedCommand, validatedArgs, {shell: false})',
72
+ '// Validate command and args first'
73
+ ]
74
+ },
75
+ effort: '10-15 minutes'
76
+ },
77
+ {
78
+ method: 'spawnSync',
79
+ dangerous: false,
80
+ vulnerability: 'argument-injection',
81
+ safeAlternatives: ['spawnSync with validation'],
82
+ example: {
83
+ bad: 'spawnSync(\'bash\', [\'-c\', userCommand])',
84
+ good: [
85
+ 'spawnSync(validatedCommand, validatedArgs, {shell: false})',
86
+ '// Validate command and args first'
87
+ ]
88
+ },
89
+ effort: '15-20 minutes'
90
+ },
91
+ {
92
+ method: 'fork',
93
+ dangerous: true,
94
+ vulnerability: 'command-injection',
95
+ safeAlternatives: ['spawn'],
96
+ example: {
97
+ bad: 'fork(userScript)',
98
+ good: [
99
+ 'spawn(\'node\', [validatedScript], {shell: false})',
100
+ '// Validate script path first'
101
+ ]
102
+ },
103
+ effort: '15-20 minutes'
104
+ },
105
+ {
106
+ method: 'forkSync',
107
+ dangerous: true,
108
+ vulnerability: 'command-injection',
109
+ safeAlternatives: ['spawnSync'],
110
+ example: {
111
+ bad: 'forkSync(userScript)',
112
+ good: [
113
+ 'spawnSync(\'node\', [validatedScript], {shell: false, stdio: \'inherit\'})',
114
+ '// Validate script path first'
115
+ ]
116
+ },
117
+ effort: '15-20 minutes'
118
+ }
119
+ ];
120
+ exports.detectChildProcess = (0, eslint_devkit_2.createRule)({
121
+ name: 'detect-child-process',
122
+ meta: {
123
+ type: 'problem',
124
+ docs: {
125
+ description: 'Detects child_process usage that may allow command injection',
126
+ },
127
+ messages: {
128
+ // 🎯 Token optimization: 44% reduction (55→31 tokens) - removes ❌/✅/📚 labels
129
+ childProcessCommandInjection: (0, eslint_devkit_1.formatLLMMessage)({
130
+ icon: eslint_devkit_1.MessageIcons.WARNING,
131
+ issueName: 'Command injection',
132
+ cwe: 'CWE-78',
133
+ description: 'Command injection detected',
134
+ severity: 'CRITICAL',
135
+ fix: 'Use execFile/spawn with {shell: false} and array args',
136
+ documentationLink: 'https://owasp.org/www-community/attacks/Command_Injection',
137
+ }),
138
+ useExecFile: (0, eslint_devkit_1.formatLLMMessage)({
139
+ icon: eslint_devkit_1.MessageIcons.INFO,
140
+ issueName: 'Use execFile',
141
+ description: 'Use execFile() with argument array',
142
+ severity: 'LOW',
143
+ fix: 'execFile(cmd, [arg1, arg2], { shell: false })',
144
+ documentationLink: 'https://nodejs.org/api/child_process.html#child_processexecfilefile-args-options-callback',
145
+ }),
146
+ useSpawn: (0, eslint_devkit_1.formatLLMMessage)({
147
+ icon: eslint_devkit_1.MessageIcons.INFO,
148
+ issueName: 'Use spawn',
149
+ description: 'Use spawn() with separate arguments',
150
+ severity: 'LOW',
151
+ fix: 'spawn(cmd, [arg1, arg2], { shell: false })',
152
+ documentationLink: 'https://nodejs.org/api/child_process.html#child_processspawncommand-args-options',
153
+ }),
154
+ useSaferLibrary: (0, eslint_devkit_1.formatLLMMessage)({
155
+ icon: eslint_devkit_1.MessageIcons.INFO,
156
+ issueName: 'Use Safer Library',
157
+ description: 'Consider safer command execution libraries',
158
+ severity: 'LOW',
159
+ fix: 'Use execa, zx, or cross-spawn instead',
160
+ documentationLink: 'https://github.com/sindresorhus/execa',
161
+ }),
162
+ validateInput: (0, eslint_devkit_1.formatLLMMessage)({
163
+ icon: eslint_devkit_1.MessageIcons.INFO,
164
+ issueName: 'Validate Input',
165
+ description: 'Add input validation and sanitization',
166
+ severity: 'LOW',
167
+ fix: 'Validate user input before passing to command',
168
+ documentationLink: 'https://owasp.org/www-community/attacks/Command_Injection',
169
+ }),
170
+ useShellFalse: (0, eslint_devkit_1.formatLLMMessage)({
171
+ icon: eslint_devkit_1.MessageIcons.INFO,
172
+ issueName: 'Disable Shell',
173
+ description: 'Use shell: false option',
174
+ severity: 'LOW',
175
+ fix: '{ shell: false } to prevent shell interpretation',
176
+ documentationLink: 'https://nodejs.org/api/child_process.html#spawning-bat-and-cmd-files-on-windows',
177
+ }),
178
+ strategyValidate: (0, eslint_devkit_1.formatLLMMessage)({
179
+ icon: eslint_devkit_1.MessageIcons.STRATEGY,
180
+ issueName: 'Validate Strategy',
181
+ description: 'Comprehensive input validation',
182
+ severity: 'LOW',
183
+ fix: 'Add allowlist validation before command execution',
184
+ documentationLink: 'https://owasp.org/www-community/attacks/Command_Injection',
185
+ }),
186
+ strategySanitize: (0, eslint_devkit_1.formatLLMMessage)({
187
+ icon: eslint_devkit_1.MessageIcons.STRATEGY,
188
+ issueName: 'Sanitize Strategy',
189
+ description: 'Sanitize and escape command arguments',
190
+ severity: 'LOW',
191
+ fix: 'Escape special characters in command arguments',
192
+ documentationLink: 'https://owasp.org/www-community/attacks/Command_Injection',
193
+ }),
194
+ strategyRestrict: (0, eslint_devkit_1.formatLLMMessage)({
195
+ icon: eslint_devkit_1.MessageIcons.STRATEGY,
196
+ issueName: 'Restrict Strategy',
197
+ description: 'Restrict to predefined safe commands',
198
+ severity: 'LOW',
199
+ fix: 'Define allowlist of permitted commands',
200
+ documentationLink: 'https://owasp.org/www-community/attacks/Command_Injection',
201
+ })
202
+ },
203
+ schema: [
204
+ {
205
+ type: 'object',
206
+ properties: {
207
+ allowLiteralStrings: {
208
+ type: 'boolean',
209
+ default: false,
210
+ description: 'Allow exec() with literal strings'
211
+ },
212
+ allowLiteralSpawn: {
213
+ type: 'boolean',
214
+ default: false,
215
+ description: 'Allow spawn() with literal arguments'
216
+ },
217
+ additionalMethods: {
218
+ type: 'array',
219
+ items: { type: 'string' },
220
+ default: [],
221
+ description: 'Additional child_process methods to check'
222
+ },
223
+ strategy: {
224
+ type: 'string',
225
+ enum: ['validate', 'sanitize', 'restrict', 'auto'],
226
+ default: 'auto',
227
+ description: 'Strategy for fixing command injection (auto = smart detection)'
228
+ }
229
+ },
230
+ additionalProperties: false,
231
+ },
232
+ ],
233
+ },
234
+ defaultOptions: [
235
+ {
236
+ allowLiteralStrings: false,
237
+ allowLiteralSpawn: false,
238
+ additionalMethods: [],
239
+ strategy: 'auto'
240
+ },
241
+ ],
242
+ create(context) {
243
+ const options = context.options[0] || {};
244
+ const { allowLiteralStrings = false, allowLiteralSpawn = false, additionalMethods = [], } = options || {};
245
+ /**
246
+ * Child process methods that can be dangerous (Set for O(1) lookup)
247
+ */
248
+ const dangerousMethodsSet = new Set([
249
+ 'exec',
250
+ 'execSync',
251
+ 'execFile',
252
+ 'execFileSync',
253
+ 'spawn',
254
+ 'spawnSync',
255
+ 'fork',
256
+ 'forkSync',
257
+ ...additionalMethods
258
+ ]);
259
+ /**
260
+ * Track imported child_process identifiers so we can flag calls like
261
+ * `exec()` or `cp.exec()` in addition to `child_process.exec()`.
262
+ */
263
+ const moduleAliases = new Set(['child_process']);
264
+ const importedMethods = new Set();
265
+ /**
266
+ * Check if a node contains string interpolation or concatenation
267
+ */
268
+ const containsDynamicStrings = (node) => {
269
+ if (node.type === 'TemplateLiteral') {
270
+ return node.expressions.length > 0;
271
+ }
272
+ if (node.type === 'BinaryExpression' && node.operator === '+') {
273
+ return true;
274
+ }
275
+ // Check for variable references
276
+ if (node.type === 'Identifier') {
277
+ return true;
278
+ }
279
+ return false;
280
+ };
281
+ /**
282
+ * Check if arguments contain only literals (safe)
283
+ */
284
+ const hasOnlyLiteralArgs = (args) => {
285
+ return args.every(arg => arg.type === 'Literal' ||
286
+ (arg.type === 'ArrayExpression' &&
287
+ arg.elements.every((el) => el?.type === 'Literal')));
288
+ };
289
+ /**
290
+ * Extract command and arguments for analysis
291
+ */
292
+ const extractCommandInfo = (node) => {
293
+ let method = 'unknown';
294
+ if (node.callee.type === 'MemberExpression' &&
295
+ node.callee.property.type === 'Identifier') {
296
+ method = node.callee.property.name;
297
+ }
298
+ else if (node.callee.type === 'Identifier') {
299
+ method = node.callee.name;
300
+ }
301
+ const sourceCode = context.sourceCode || context.sourceCode;
302
+ const args = node.arguments.map((arg) => sourceCode.getText(arg)).join(', ');
303
+ const pattern = COMMAND_PATTERNS.find(p => p.method === method) || null;
304
+ // Check if arguments contain dynamic content
305
+ const isDynamic = node.arguments.some((arg) => containsDynamicStrings(arg));
306
+ return { method, args, pattern, isDynamic };
307
+ };
308
+ /**
309
+ * Generate refactoring steps based on the pattern
310
+ */
311
+ const generateRefactoringSteps = (pattern) => {
312
+ switch (pattern.method) {
313
+ case 'exec':
314
+ case 'execSync':
315
+ return [
316
+ ' 1. Replace exec() with execFile() or spawn()',
317
+ ' 2. Split command and arguments into separate array elements',
318
+ ' 3. Use {shell: false} option to prevent shell interpretation',
319
+ ' 4. Validate and sanitize all user inputs',
320
+ ' 5. Consider using execa library for better security'
321
+ ].join('\n');
322
+ case 'spawn':
323
+ return [
324
+ ' 1. Ensure first argument is a safe, validated command path',
325
+ ' 2. Pass arguments as separate array elements',
326
+ ' 3. Use {shell: false} to prevent shell injection',
327
+ ' 4. Validate command exists and is executable',
328
+ ' 5. Consider using cross-spawn for cross-platform safety'
329
+ ].join('\n');
330
+ case 'execFile':
331
+ return [
332
+ ' 1. Replace execFile() with spawn() for better security',
333
+ ' 2. Validate command path before execution',
334
+ ' 3. Ensure arguments are properly sanitized',
335
+ ' 4. Use {shell: false} option',
336
+ ' 5. Consider using execa library'
337
+ ].join('\n');
338
+ case 'execFileSync':
339
+ return [
340
+ ' 1. Replace execFileSync() with spawnSync() for better security',
341
+ ' 2. Validate command path before execution',
342
+ ' 3. Ensure arguments are properly sanitized',
343
+ ' 4. Use {shell: false} option',
344
+ ' 5. Consider using execa library'
345
+ ].join('\n');
346
+ case 'spawnSync':
347
+ return [
348
+ ' 1. Ensure first argument is a safe, validated command path',
349
+ ' 2. Pass arguments as separate array elements',
350
+ ' 3. Use {shell: false} to prevent shell injection',
351
+ ' 4. Validate command exists and is executable',
352
+ ' 5. Handle synchronous execution properly'
353
+ ].join('\n');
354
+ case 'fork':
355
+ return [
356
+ ' 1. Replace fork() with spawn() for Node.js scripts',
357
+ ' 2. Validate script path exists and is readable',
358
+ ' 3. Use spawn(\'node\', [scriptPath], options) instead',
359
+ ' 4. Add proper error handling',
360
+ ' 5. Consider using child_process.execFile() for simple scripts'
361
+ ].join('\n');
362
+ case 'forkSync':
363
+ return [
364
+ ' 1. Replace forkSync() with spawnSync() for Node.js scripts',
365
+ ' 2. Validate script path exists and is readable',
366
+ ' 3. Use spawnSync(\'node\', [scriptPath], options) instead',
367
+ ' 4. Add proper error handling and synchronous waiting',
368
+ ' 5. Consider using child_process.execFileSync() for simple scripts'
369
+ ].join('\n');
370
+ default:
371
+ return [
372
+ ' 1. Identify the specific command execution need',
373
+ ' 2. Choose appropriate child_process method',
374
+ ' 3. Use argument arrays instead of string interpolation',
375
+ ' 4. Add comprehensive input validation',
376
+ ' 5. Test with malicious inputs'
377
+ ].join('\n');
378
+ }
379
+ };
380
+ /**
381
+ * Determine risk level based on the call pattern
382
+ */
383
+ const determineRiskLevel = (pattern, isDynamic) => {
384
+ if (pattern?.dangerous && isDynamic) {
385
+ return 'critical';
386
+ }
387
+ if (pattern?.dangerous || isDynamic) {
388
+ return 'high';
389
+ }
390
+ return 'medium';
391
+ };
392
+ /**
393
+ * Determine whether the callee refers to a child_process API.
394
+ */
395
+ const getChildProcessCall = (node) => {
396
+ // child_process.exec(...)
397
+ if (node.callee.type === 'MemberExpression' &&
398
+ node.callee.property.type === 'Identifier') {
399
+ const methodName = node.callee.property.name;
400
+ if (!dangerousMethodsSet.has(methodName)) {
401
+ return null;
402
+ }
403
+ // child_process.exec(...) or alias.exec(...)
404
+ if (node.callee.object.type === 'Identifier' &&
405
+ moduleAliases.has(node.callee.object.name)) {
406
+ return { method: methodName, calleeNode: node.callee };
407
+ }
408
+ }
409
+ // exec(...) when imported directly from child_process
410
+ if (node.callee.type === 'Identifier' && dangerousMethodsSet.has(node.callee.name)) {
411
+ if (importedMethods.has(node.callee.name)) {
412
+ return { method: node.callee.name, calleeNode: node.callee };
413
+ }
414
+ }
415
+ return null;
416
+ };
417
+ /**
418
+ * Check child_process calls for security issues
419
+ */
420
+ const checkChildProcessCall = (node) => {
421
+ const detected = getChildProcessCall(node);
422
+ if (!detected) {
423
+ return;
424
+ }
425
+ const { method, args, pattern, isDynamic } = extractCommandInfo(node);
426
+ // Allow literal strings if configured
427
+ if (allowLiteralStrings && method === 'exec' && !isDynamic) {
428
+ return;
429
+ }
430
+ // Allow literal spawn if configured
431
+ if (allowLiteralSpawn && method === 'spawn' && hasOnlyLiteralArgs(node.arguments)) {
432
+ return;
433
+ }
434
+ // Report the security issue
435
+ const riskLevel = determineRiskLevel(pattern, isDynamic);
436
+ const steps = pattern ? generateRefactoringSteps(pattern) : 'Review and secure command execution';
437
+ const alternatives = pattern?.safeAlternatives.join(', ') || 'execFile, spawn with validation';
438
+ context.report({
439
+ node,
440
+ messageId: 'childProcessCommandInjection',
441
+ data: {
442
+ method,
443
+ args,
444
+ riskLevel,
445
+ vulnerability: pattern?.vulnerability || 'command injection',
446
+ alternatives,
447
+ steps,
448
+ effort: pattern?.effort || '15-30 minutes'
449
+ },
450
+ suggest: [
451
+ {
452
+ messageId: 'useExecFile',
453
+ fix: () => null
454
+ },
455
+ {
456
+ messageId: 'useSpawn',
457
+ fix: () => null
458
+ },
459
+ {
460
+ messageId: 'useSaferLibrary',
461
+ fix: () => null
462
+ },
463
+ {
464
+ messageId: 'validateInput',
465
+ fix: () => null
466
+ },
467
+ {
468
+ messageId: 'useShellFalse',
469
+ fix: () => null
470
+ }
471
+ ]
472
+ });
473
+ };
474
+ /**
475
+ * Track imports/requires of child_process to catch alias usage.
476
+ */
477
+ const trackChildProcessImport = (node) => {
478
+ if (node.source.value !== 'child_process') {
479
+ return;
480
+ }
481
+ for (const specifier of node.specifiers) {
482
+ if (specifier.type === 'ImportDefaultSpecifier' || specifier.type === 'ImportNamespaceSpecifier') {
483
+ moduleAliases.add(specifier.local.name);
484
+ }
485
+ if (specifier.type === 'ImportSpecifier') {
486
+ importedMethods.add(specifier.local.name);
487
+ }
488
+ }
489
+ };
490
+ /**
491
+ * Track CommonJS require patterns.
492
+ */
493
+ const trackChildProcessRequire = (node) => {
494
+ if (!node.init) {
495
+ return;
496
+ }
497
+ // const cp = require('child_process');
498
+ if (node.id.type === 'Identifier' &&
499
+ node.init.type === 'CallExpression' &&
500
+ node.init.callee.type === 'Identifier' &&
501
+ node.init.callee.name === 'require' &&
502
+ node.init.arguments[0] &&
503
+ node.init.arguments[0].type === 'Literal' &&
504
+ node.init.arguments[0].value === 'child_process') {
505
+ moduleAliases.add(node.id.name);
506
+ return;
507
+ }
508
+ // const { exec } = require('child_process');
509
+ if (node.id.type === 'ObjectPattern' &&
510
+ node.init?.type === 'CallExpression' &&
511
+ node.init.callee.type === 'Identifier' &&
512
+ node.init.callee.name === 'require' &&
513
+ node.init.arguments[0] &&
514
+ node.init.arguments[0].type === 'Literal' &&
515
+ node.init.arguments[0].value === 'child_process') {
516
+ for (const prop of node.id.properties) {
517
+ if (prop.type === 'Property' && prop.key.type === 'Identifier') {
518
+ importedMethods.add(prop.value.type === 'Identifier' ? prop.value.name : prop.key.name);
519
+ }
520
+ }
521
+ }
522
+ };
523
+ return {
524
+ CallExpression: checkChildProcessCall,
525
+ ImportDeclaration: trackChildProcessImport,
526
+ VariableDeclarator: trackChildProcessRequire
527
+ };
528
+ },
529
+ });
@@ -0,0 +1,9 @@
1
+ export interface Options {
2
+ /** Allow eval with literal strings. Default: false (stricter) */
3
+ allowLiteralStrings?: boolean;
4
+ /** Additional functions to treat as eval-like */
5
+ additionalEvalFunctions?: string[];
6
+ /** Strategy for fixing eval usage: 'remove', 'refactor', 'validate', or 'auto' */
7
+ strategy?: 'remove' | 'refactor' | 'validate' | 'auto';
8
+ }
9
+ export declare const detectEvalWithExpression: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;