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
@@ -1,526 +0,0 @@
1
- /**
2
- * ESLint Rule: no-zip-slip
3
- * Detects zip slip/archive extraction vulnerabilities (CWE-22)
4
- *
5
- * Zip slip vulnerabilities occur when extracting archives without properly
6
- * validating file paths, allowing attackers to write files outside the
7
- * intended extraction directory using path traversal sequences like "../".
8
- *
9
- * False Positive Reduction:
10
- * This rule uses security utilities to reduce false positives by detecting:
11
- * - Safe archive extraction patterns
12
- * - Path validation functions
13
- * - JSDoc annotations (@safe, @validated)
14
- * - Trusted extraction libraries
15
- */
16
- import type { TSESLint, TSESTree } from '@interlace/eslint-devkit';
17
- import { createRule } from '@interlace/eslint-devkit';
18
- import { formatLLMMessage, MessageIcons } from '@interlace/eslint-devkit';
19
- type MessageIds =
20
- | 'zipSlipVulnerability'
21
- | 'unsafeArchiveExtraction'
22
- | 'pathTraversalInArchive'
23
- | 'unvalidatedArchivePath'
24
- | 'dangerousArchiveDestination'
25
- | 'useSafeArchiveExtraction'
26
- | 'validateArchivePaths'
27
- | 'sanitizeArchiveNames'
28
- | 'strategyPathValidation'
29
- | 'strategySafeLibraries'
30
- | 'strategySandboxing';
31
-
32
- export interface Options {
33
- /** Archive extraction functions to check */
34
- archiveFunctions?: string[];
35
-
36
- /** Functions that safely validate archive paths */
37
- pathValidationFunctions?: string[];
38
-
39
- /** Safe archive extraction libraries */
40
- safeLibraries?: string[];
41
- }
42
-
43
- type RuleOptions = [Options?];
44
-
45
-
46
- export const noZipSlip = createRule<RuleOptions, MessageIds>({
47
- name: 'no-zip-slip',
48
- meta: {
49
- type: 'problem',
50
- docs: {
51
- description: 'Detects zip slip/archive extraction vulnerabilities',
52
- },
53
- fixable: 'code',
54
- hasSuggestions: true,
55
- messages: {
56
- zipSlipVulnerability: formatLLMMessage({
57
- icon: MessageIcons.SECURITY,
58
- issueName: 'Zip Slip Vulnerability',
59
- cwe: 'CWE-22',
60
- description: 'Archive extraction vulnerable to path traversal',
61
- severity: '{{severity}}',
62
- fix: '{{safeAlternative}}',
63
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
64
- }),
65
- unsafeArchiveExtraction: formatLLMMessage({
66
- icon: MessageIcons.SECURITY,
67
- issueName: 'Unsafe Archive Extraction',
68
- cwe: 'CWE-22',
69
- description: 'Archive extraction without path validation',
70
- severity: 'HIGH',
71
- fix: 'Use safe extraction libraries or validate all paths',
72
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
73
- }),
74
- pathTraversalInArchive: formatLLMMessage({
75
- icon: MessageIcons.SECURITY,
76
- issueName: 'Path Traversal in Archive',
77
- cwe: 'CWE-22',
78
- description: 'Archive contains path traversal sequences',
79
- severity: 'CRITICAL',
80
- fix: 'Reject archives with path traversal or sanitize paths',
81
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
82
- }),
83
- unvalidatedArchivePath: formatLLMMessage({
84
- icon: MessageIcons.SECURITY,
85
- issueName: 'Unvalidated Archive Path',
86
- cwe: 'CWE-22',
87
- description: 'Archive entry path used without validation',
88
- severity: 'HIGH',
89
- fix: 'Validate paths before extraction',
90
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
91
- }),
92
- dangerousArchiveDestination: formatLLMMessage({
93
- icon: MessageIcons.SECURITY,
94
- issueName: 'Dangerous Archive Destination',
95
- cwe: 'CWE-22',
96
- description: 'Archive extracted to sensitive location',
97
- severity: 'MEDIUM',
98
- fix: 'Extract to safe temporary directory',
99
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
100
- }),
101
- useSafeArchiveExtraction: formatLLMMessage({
102
- icon: MessageIcons.INFO,
103
- issueName: 'Use Safe Archive Extraction',
104
- description: 'Use libraries with built-in path validation',
105
- severity: 'LOW',
106
- fix: 'Use yauzl, safe-archive-extract, or similar safe libraries',
107
- documentationLink: 'https://www.npmjs.com/package/yauzl',
108
- }),
109
- validateArchivePaths: formatLLMMessage({
110
- icon: MessageIcons.INFO,
111
- issueName: 'Validate Archive Paths',
112
- description: 'Validate all archive entry paths',
113
- severity: 'LOW',
114
- fix: 'Check paths don\'t contain ../ and are within destination directory',
115
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
116
- }),
117
- sanitizeArchiveNames: formatLLMMessage({
118
- icon: MessageIcons.INFO,
119
- issueName: 'Sanitize Archive Names',
120
- description: 'Sanitize archive entry names',
121
- severity: 'LOW',
122
- fix: 'Use path.basename() or custom sanitization',
123
- documentationLink: 'https://nodejs.org/api/path.html#pathbasenamepath-ext',
124
- }),
125
- strategyPathValidation: formatLLMMessage({
126
- icon: MessageIcons.STRATEGY,
127
- issueName: 'Path Validation Strategy',
128
- description: 'Validate paths before any file operations',
129
- severity: 'LOW',
130
- fix: 'Check path.startsWith(destination) and no ../ sequences',
131
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
132
- }),
133
- strategySafeLibraries: formatLLMMessage({
134
- icon: MessageIcons.STRATEGY,
135
- issueName: 'Safe Libraries Strategy',
136
- description: 'Use archive libraries with built-in safety',
137
- severity: 'LOW',
138
- fix: 'Use yauzl, adm-zip with validation, or safe-archive-extract',
139
- documentationLink: 'https://www.npmjs.com/package/safe-archive-extract',
140
- }),
141
- strategySandboxing: formatLLMMessage({
142
- icon: MessageIcons.STRATEGY,
143
- issueName: 'Sandboxing Strategy',
144
- description: 'Extract archives in sandboxed environment',
145
- severity: 'LOW',
146
- fix: 'Use temporary directories and restrict permissions',
147
- documentationLink: 'https://nodejs.org/api/fs.html#fsopentempdirprefix-options-callback',
148
- })
149
- },
150
- schema: [
151
- {
152
- type: 'object',
153
- properties: {
154
- archiveFunctions: {
155
- type: 'array',
156
- items: { type: 'string' },
157
- default: ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'],
158
- },
159
- pathValidationFunctions: {
160
- type: 'array',
161
- items: { type: 'string' },
162
- default: ['validatePath', 'sanitizePath', 'checkPath', 'safePath'],
163
- },
164
- safeLibraries: {
165
- type: 'array',
166
- items: { type: 'string' },
167
- default: ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'],
168
- },
169
- },
170
- additionalProperties: false,
171
- },
172
- ],
173
- },
174
- defaultOptions: [
175
- {
176
- archiveFunctions: ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'],
177
- pathValidationFunctions: ['validatePath', 'sanitizePath', 'checkPath', 'safePath'],
178
- safeLibraries: ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'],
179
- },
180
- ],
181
- create(context: TSESLint.RuleContext<MessageIds, RuleOptions>) {
182
- const options = context.options[0] || {};
183
- const {
184
- archiveFunctions = ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'],
185
- pathValidationFunctions = ['validatePath', 'sanitizePath', 'checkPath', 'safePath'],
186
- safeLibraries = ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'],
187
- }: Options = options;
188
-
189
- const filename = context.filename || context.getFilename();
190
-
191
- // Safety checks are implemented directly in the handlers
192
-
193
- /**
194
- * Check if this is an archive extraction operation
195
- */
196
- const isArchiveExtraction = (node: TSESTree.CallExpression): boolean => {
197
- const callee = node.callee;
198
-
199
- // Check for archive method calls (e.g., zip.extractAllTo)
200
- if (callee.type === 'MemberExpression' &&
201
- callee.property.type === 'Identifier' &&
202
- archiveFunctions.includes(callee.property.name)) {
203
- return true;
204
- }
205
-
206
- // Check for standalone archive functions (e.g., extractArchive)
207
- if (callee.type === 'Identifier' &&
208
- archiveFunctions.includes(callee.name)) {
209
- return true;
210
- }
211
-
212
- return false;
213
- };
214
-
215
- /**
216
- * Check if path contains dangerous traversal sequences
217
- */
218
- const containsPathTraversal = (pathText: string): boolean => {
219
- // Check for ../ sequences
220
- return /\.\.\//.test(pathText) ||
221
- /\.\.\\/.test(pathText) || // Windows paths
222
- /^\.\./.test(pathText) || // Leading ..
223
- /\/\.\./.test(pathText); // Embedded /..
224
- };
225
-
226
-
227
- /**
228
- * Check if path has been validated
229
- */
230
- const isPathValidated = (pathNode: TSESTree.Node): boolean => {
231
- let current: TSESTree.Node | undefined = pathNode;
232
-
233
- while (current) {
234
- if (current.type === 'CallExpression' &&
235
- current.callee.type === 'Identifier' &&
236
- pathValidationFunctions.includes(current.callee.name)) {
237
- return true;
238
- }
239
- current = current.parent as TSESTree.Node;
240
- }
241
-
242
- return false;
243
- };
244
-
245
- /**
246
- * Check if this uses a safe library
247
- */
248
- const isSafeLibrary = (node: TSESTree.CallExpression): boolean => {
249
- const callee = node.callee;
250
-
251
- if (callee.type === 'MemberExpression' &&
252
- callee.object.type === 'Identifier' &&
253
- safeLibraries.includes(callee.object.name)) {
254
- return true;
255
- }
256
-
257
- return false;
258
- };
259
-
260
- /**
261
- * Check if destination is dangerous
262
- */
263
- const isDangerousDestination = (destText: string): boolean => {
264
- return destText.includes('/tmp') ||
265
- destText.includes('/var') ||
266
- destText.includes('/usr') ||
267
- destText.includes('/etc') ||
268
- destText.includes('/root') ||
269
- destText.includes('/home') ||
270
- destText.includes('C:\\Windows') ||
271
- destText.includes('C:\\Program Files') ||
272
- destText.includes('C:\\Users');
273
- };
274
-
275
- return {
276
- // Check archive extraction calls
277
- CallExpression(node: TSESTree.CallExpression) {
278
- if (isArchiveExtraction(node) && !isSafeLibrary(node)) {
279
- // Check for @safe annotations in the source
280
- const sourceCode = context.sourceCode;
281
- let hasSafeAnnotation = false;
282
-
283
- // Look for @safe comments in the source code
284
- const allComments = sourceCode.getAllComments();
285
- for (const comment of allComments) {
286
- if (comment.type === 'Block' && comment.value.includes('@safe')) {
287
- hasSafeAnnotation = true;
288
- break;
289
- }
290
- }
291
-
292
- if (hasSafeAnnotation) {
293
- return; // Skip reporting if marked as safe
294
- }
295
-
296
- // Check if destination is dangerous
297
- const args = node.arguments;
298
- let destArg: TSESTree.Node | undefined;
299
-
300
- // Determine which argument is the destination based on the function
301
- if (node.callee.type === 'MemberExpression' && node.callee.property.type === 'Identifier') {
302
- const methodName = node.callee.property.name;
303
- if (['extractAllTo', 'unzip'].includes(methodName)) {
304
- // Destination is the first argument
305
- destArg = args[0];
306
- } else if (archiveFunctions.includes(methodName)) {
307
- // For other archive functions, destination is typically the second argument
308
- destArg = args.length >= 2 ? args[1] : undefined;
309
- }
310
- } else if (node.callee.type === 'Identifier' && archiveFunctions.includes(node.callee.name)) {
311
- // For standalone functions like extractArchive(file, dest)
312
- destArg = args.length >= 2 ? args[1] : undefined;
313
- }
314
-
315
- const destText = destArg && destArg.type === 'Literal' && typeof destArg.value === 'string' ? destArg.value : '';
316
- const isDestDangerous = isDangerousDestination(destText);
317
- const isMethodCall = node.callee.type === 'MemberExpression';
318
-
319
- if (isMethodCall) {
320
- // Method calls report unsafeArchiveExtraction unless destination is a safe relative path
321
- const isSafeRelativePath = destText.startsWith('./') || destText.startsWith('../');
322
-
323
- if (!isSafeRelativePath) {
324
- context.report({
325
- node,
326
- messageId: 'unsafeArchiveExtraction',
327
- data: {
328
- filePath: filename,
329
- line: String(node.loc?.start.line ?? 0),
330
- },
331
- suggest: [
332
- {
333
- messageId: 'useSafeArchiveExtraction',
334
- fix: () => null,
335
- },
336
- ],
337
- });
338
- }
339
- // For safe relative paths, don't report any error
340
-
341
- // Additionally report dangerous destination for dangerous destinations
342
- if (isDestDangerous) {
343
- context.report({
344
- node: destArg || node,
345
- messageId: 'dangerousArchiveDestination',
346
- data: {
347
- filePath: filename,
348
- line: String(node.loc?.start.line ?? 0),
349
- },
350
- });
351
- }
352
- } else {
353
- // Standalone calls: report dangerousArchiveDestination for dangerous destinations, unsafeArchiveExtraction otherwise
354
- if (isDestDangerous) {
355
- context.report({
356
- node,
357
- messageId: 'dangerousArchiveDestination',
358
- data: {
359
- filePath: filename,
360
- line: String(node.loc?.start.line ?? 0),
361
- },
362
- });
363
- } else {
364
- context.report({
365
- node,
366
- messageId: 'unsafeArchiveExtraction',
367
- data: {
368
- filePath: filename,
369
- line: String(node.loc?.start.line ?? 0),
370
- },
371
- suggest: [
372
- {
373
- messageId: 'useSafeArchiveExtraction',
374
- fix: () => null
375
- },
376
- ],
377
- });
378
- }
379
- }
380
- }
381
-
382
- // Check for path.join or similar operations with archive entry names
383
- const callee = node.callee;
384
- if (callee.type === 'MemberExpression' &&
385
- callee.property.type === 'Identifier' &&
386
- ['join', 'resolve', 'relative', 'normalize'].includes(callee.property.name)) {
387
-
388
- // Check arguments for potential archive entry usage
389
- const args = node.arguments;
390
- for (const arg of args) {
391
- if (arg.type === 'MemberExpression' &&
392
- arg.property.type === 'Identifier' &&
393
- ['name', 'path', 'fileName', 'entryName', 'relativePath', 'filename', 'pathname'].includes(arg.property.name)) {
394
-
395
- // This looks like path.join(dest, entry.name) - check if validated
396
- if (!isPathValidated(arg)) {
397
- context.report({
398
- node: arg,
399
- messageId: 'unvalidatedArchivePath',
400
- data: {
401
- filePath: filename,
402
- line: String(node.loc?.start.line ?? 0),
403
- },
404
- });
405
- }
406
- }
407
- }
408
- }
409
- },
410
-
411
- // Check string literals for dangerous paths
412
- Literal(node: TSESTree.Literal) {
413
- if (typeof node.value !== 'string') {
414
- return;
415
- }
416
-
417
- const text = node.value;
418
-
419
- // Check for path traversal in strings that look like file paths
420
- if ((text.includes('/') || text.includes('\\')) && containsPathTraversal(text)) {
421
- // Check if this is in an archive-related context
422
- let current: TSESTree.Node | undefined = node;
423
- let isArchiveContext = false;
424
-
425
- while (current && !isArchiveContext) {
426
- if (current.type === 'CallExpression' && isArchiveExtraction(current)) {
427
- isArchiveContext = true;
428
- break;
429
- }
430
- if (current.type === 'VariableDeclarator' &&
431
- current.id.type === 'Identifier' &&
432
- (current.id.name.includes('archive') ||
433
- current.id.name.includes('zip') ||
434
- current.id.name.includes('tar') ||
435
- current.id.name.includes('path') ||
436
- current.id.name.includes('file') ||
437
- current.id.name.includes('entry'))) {
438
- isArchiveContext = true;
439
- break;
440
- }
441
- current = current.parent as TSESTree.Node;
442
- }
443
-
444
- // Also check if the variable name suggests archive usage
445
- const parent = node.parent;
446
- if (parent && parent.type === 'VariableDeclarator' && parent.id.type === 'Identifier') {
447
- const varName = parent.id.name.toLowerCase();
448
- if (varName.includes('archive') || varName.includes('zip') || varName.includes('tar') ||
449
- varName.includes('path') || varName.includes('file') || varName.includes('extract') ||
450
- varName.includes('entry')) {
451
- isArchiveContext = true;
452
- }
453
- }
454
-
455
- if (isArchiveContext) {
456
- context.report({
457
- node,
458
- messageId: 'pathTraversalInArchive',
459
- data: {
460
- filePath: filename,
461
- line: String(node.loc?.start.line ?? 0),
462
- },
463
- });
464
- }
465
- }
466
-
467
- // Dangerous destinations are handled by the CallExpression handler to avoid duplicates
468
- // Only check for dangerous destinations not related to archive extraction
469
- if (isDangerousDestination(text) && !containsPathTraversal(text)) {
470
- // Check if this is used as an extraction destination
471
- let current: TSESTree.Node | undefined = node;
472
- let isExtractionDest = false;
473
-
474
- while (current && !isExtractionDest) {
475
- if (current.type === 'CallExpression' && isArchiveExtraction(current)) {
476
- // Check if this node is a destination argument
477
- const args = current.arguments;
478
- const callee = current.callee;
479
- const isMethodCall = callee.type === 'MemberExpression';
480
-
481
- if ((isMethodCall && args.length >= 1 && args[0] === node) ||
482
- (!isMethodCall && args.length >= 2 && args[1] === node)) {
483
- isExtractionDest = true;
484
- break;
485
- }
486
- }
487
- current = current.parent as TSESTree.Node;
488
- }
489
-
490
- // Only report if not already handled by CallExpression handler
491
- if (!isExtractionDest) {
492
- context.report({
493
- node,
494
- messageId: 'dangerousArchiveDestination',
495
- data: {
496
- filePath: filename,
497
- line: String(node.loc?.start.line ?? 0),
498
- },
499
- });
500
- }
501
- }
502
- },
503
-
504
- // Check variable assignments
505
- VariableDeclarator(node: TSESTree.VariableDeclarator) {
506
- if (!node.init || node.id.type !== 'Identifier') {
507
- return;
508
- }
509
-
510
- const varName = node.id.name.toLowerCase();
511
-
512
- // Check if this variable holds archive-related data
513
- if (varName.includes('entry') || varName.includes('file') || varName.includes('path')) {
514
- if (node.init.type === 'MemberExpression' &&
515
- node.init.property.type === 'Identifier' &&
516
- ['name', 'path'].includes(node.init.property.name)) {
517
-
518
- // This looks like: const entryName = entry.name;
519
- // Check if this variable is used unsafely later
520
- // This is a simplified check - in practice we'd need more sophisticated analysis
521
- }
522
- }
523
- }
524
- };
525
- },
526
- });