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
@@ -1,445 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.noZipSlip = void 0;
4
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
5
- const eslint_devkit_2 = require("@interlace/eslint-devkit");
6
- exports.noZipSlip = (0, eslint_devkit_1.createRule)({
7
- name: 'no-zip-slip',
8
- meta: {
9
- type: 'problem',
10
- docs: {
11
- description: 'Detects zip slip/archive extraction vulnerabilities',
12
- },
13
- fixable: 'code',
14
- hasSuggestions: true,
15
- messages: {
16
- zipSlipVulnerability: (0, eslint_devkit_2.formatLLMMessage)({
17
- icon: eslint_devkit_2.MessageIcons.SECURITY,
18
- issueName: 'Zip Slip Vulnerability',
19
- cwe: 'CWE-22',
20
- description: 'Archive extraction vulnerable to path traversal',
21
- severity: '{{severity}}',
22
- fix: '{{safeAlternative}}',
23
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
24
- }),
25
- unsafeArchiveExtraction: (0, eslint_devkit_2.formatLLMMessage)({
26
- icon: eslint_devkit_2.MessageIcons.SECURITY,
27
- issueName: 'Unsafe Archive Extraction',
28
- cwe: 'CWE-22',
29
- description: 'Archive extraction without path validation',
30
- severity: 'HIGH',
31
- fix: 'Use safe extraction libraries or validate all paths',
32
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
33
- }),
34
- pathTraversalInArchive: (0, eslint_devkit_2.formatLLMMessage)({
35
- icon: eslint_devkit_2.MessageIcons.SECURITY,
36
- issueName: 'Path Traversal in Archive',
37
- cwe: 'CWE-22',
38
- description: 'Archive contains path traversal sequences',
39
- severity: 'CRITICAL',
40
- fix: 'Reject archives with path traversal or sanitize paths',
41
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
42
- }),
43
- unvalidatedArchivePath: (0, eslint_devkit_2.formatLLMMessage)({
44
- icon: eslint_devkit_2.MessageIcons.SECURITY,
45
- issueName: 'Unvalidated Archive Path',
46
- cwe: 'CWE-22',
47
- description: 'Archive entry path used without validation',
48
- severity: 'HIGH',
49
- fix: 'Validate paths before extraction',
50
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
51
- }),
52
- dangerousArchiveDestination: (0, eslint_devkit_2.formatLLMMessage)({
53
- icon: eslint_devkit_2.MessageIcons.SECURITY,
54
- issueName: 'Dangerous Archive Destination',
55
- cwe: 'CWE-22',
56
- description: 'Archive extracted to sensitive location',
57
- severity: 'MEDIUM',
58
- fix: 'Extract to safe temporary directory',
59
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
60
- }),
61
- useSafeArchiveExtraction: (0, eslint_devkit_2.formatLLMMessage)({
62
- icon: eslint_devkit_2.MessageIcons.INFO,
63
- issueName: 'Use Safe Archive Extraction',
64
- description: 'Use libraries with built-in path validation',
65
- severity: 'LOW',
66
- fix: 'Use yauzl, safe-archive-extract, or similar safe libraries',
67
- documentationLink: 'https://www.npmjs.com/package/yauzl',
68
- }),
69
- validateArchivePaths: (0, eslint_devkit_2.formatLLMMessage)({
70
- icon: eslint_devkit_2.MessageIcons.INFO,
71
- issueName: 'Validate Archive Paths',
72
- description: 'Validate all archive entry paths',
73
- severity: 'LOW',
74
- fix: 'Check paths don\'t contain ../ and are within destination directory',
75
- documentationLink: 'https://snyk.io/research/zip-slip-vulnerability',
76
- }),
77
- sanitizeArchiveNames: (0, eslint_devkit_2.formatLLMMessage)({
78
- icon: eslint_devkit_2.MessageIcons.INFO,
79
- issueName: 'Sanitize Archive Names',
80
- description: 'Sanitize archive entry names',
81
- severity: 'LOW',
82
- fix: 'Use path.basename() or custom sanitization',
83
- documentationLink: 'https://nodejs.org/api/path.html#pathbasenamepath-ext',
84
- }),
85
- strategyPathValidation: (0, eslint_devkit_2.formatLLMMessage)({
86
- icon: eslint_devkit_2.MessageIcons.STRATEGY,
87
- issueName: 'Path Validation Strategy',
88
- description: 'Validate paths before any file operations',
89
- severity: 'LOW',
90
- fix: 'Check path.startsWith(destination) and no ../ sequences',
91
- documentationLink: 'https://cwe.mitre.org/data/definitions/22.html',
92
- }),
93
- strategySafeLibraries: (0, eslint_devkit_2.formatLLMMessage)({
94
- icon: eslint_devkit_2.MessageIcons.STRATEGY,
95
- issueName: 'Safe Libraries Strategy',
96
- description: 'Use archive libraries with built-in safety',
97
- severity: 'LOW',
98
- fix: 'Use yauzl, adm-zip with validation, or safe-archive-extract',
99
- documentationLink: 'https://www.npmjs.com/package/safe-archive-extract',
100
- }),
101
- strategySandboxing: (0, eslint_devkit_2.formatLLMMessage)({
102
- icon: eslint_devkit_2.MessageIcons.STRATEGY,
103
- issueName: 'Sandboxing Strategy',
104
- description: 'Extract archives in sandboxed environment',
105
- severity: 'LOW',
106
- fix: 'Use temporary directories and restrict permissions',
107
- documentationLink: 'https://nodejs.org/api/fs.html#fsopentempdirprefix-options-callback',
108
- })
109
- },
110
- schema: [
111
- {
112
- type: 'object',
113
- properties: {
114
- archiveFunctions: {
115
- type: 'array',
116
- items: { type: 'string' },
117
- default: ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'],
118
- },
119
- pathValidationFunctions: {
120
- type: 'array',
121
- items: { type: 'string' },
122
- default: ['validatePath', 'sanitizePath', 'checkPath', 'safePath'],
123
- },
124
- safeLibraries: {
125
- type: 'array',
126
- items: { type: 'string' },
127
- default: ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'],
128
- },
129
- },
130
- additionalProperties: false,
131
- },
132
- ],
133
- },
134
- defaultOptions: [
135
- {
136
- archiveFunctions: ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'],
137
- pathValidationFunctions: ['validatePath', 'sanitizePath', 'checkPath', 'safePath'],
138
- safeLibraries: ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'],
139
- },
140
- ],
141
- create(context) {
142
- const options = context.options[0] || {};
143
- const { archiveFunctions = ['extract', 'extractAll', 'extractAllTo', 'unzip', 'untar', 'extractArchive'], pathValidationFunctions = ['validatePath', 'sanitizePath', 'checkPath', 'safePath'], safeLibraries = ['yauzl', 'safe-archive-extract', 'tar-stream', 'unzipper'], } = options;
144
- const filename = context.filename || context.getFilename();
145
- // Safety checks are implemented directly in the handlers
146
- /**
147
- * Check if this is an archive extraction operation
148
- */
149
- const isArchiveExtraction = (node) => {
150
- const callee = node.callee;
151
- // Check for archive method calls (e.g., zip.extractAllTo)
152
- if (callee.type === 'MemberExpression' &&
153
- callee.property.type === 'Identifier' &&
154
- archiveFunctions.includes(callee.property.name)) {
155
- return true;
156
- }
157
- // Check for standalone archive functions (e.g., extractArchive)
158
- if (callee.type === 'Identifier' &&
159
- archiveFunctions.includes(callee.name)) {
160
- return true;
161
- }
162
- return false;
163
- };
164
- /**
165
- * Check if path contains dangerous traversal sequences
166
- */
167
- const containsPathTraversal = (pathText) => {
168
- // Check for ../ sequences
169
- return /\.\.\//.test(pathText) ||
170
- /\.\.\\/.test(pathText) || // Windows paths
171
- /^\.\./.test(pathText) || // Leading ..
172
- /\/\.\./.test(pathText); // Embedded /..
173
- };
174
- /**
175
- * Check if path has been validated
176
- */
177
- const isPathValidated = (pathNode) => {
178
- let current = pathNode;
179
- while (current) {
180
- if (current.type === 'CallExpression' &&
181
- current.callee.type === 'Identifier' &&
182
- pathValidationFunctions.includes(current.callee.name)) {
183
- return true;
184
- }
185
- current = current.parent;
186
- }
187
- return false;
188
- };
189
- /**
190
- * Check if this uses a safe library
191
- */
192
- const isSafeLibrary = (node) => {
193
- const callee = node.callee;
194
- if (callee.type === 'MemberExpression' &&
195
- callee.object.type === 'Identifier' &&
196
- safeLibraries.includes(callee.object.name)) {
197
- return true;
198
- }
199
- return false;
200
- };
201
- /**
202
- * Check if destination is dangerous
203
- */
204
- const isDangerousDestination = (destText) => {
205
- return destText.includes('/tmp') ||
206
- destText.includes('/var') ||
207
- destText.includes('/usr') ||
208
- destText.includes('/etc') ||
209
- destText.includes('/root') ||
210
- destText.includes('/home') ||
211
- destText.includes('C:\\Windows') ||
212
- destText.includes('C:\\Program Files') ||
213
- destText.includes('C:\\Users');
214
- };
215
- return {
216
- // Check archive extraction calls
217
- CallExpression(node) {
218
- if (isArchiveExtraction(node) && !isSafeLibrary(node)) {
219
- // Check for @safe annotations in the source
220
- const sourceCode = context.sourceCode;
221
- let hasSafeAnnotation = false;
222
- // Look for @safe comments in the source code
223
- const allComments = sourceCode.getAllComments();
224
- for (const comment of allComments) {
225
- if (comment.type === 'Block' && comment.value.includes('@safe')) {
226
- hasSafeAnnotation = true;
227
- break;
228
- }
229
- }
230
- if (hasSafeAnnotation) {
231
- return; // Skip reporting if marked as safe
232
- }
233
- // Check if destination is dangerous
234
- const args = node.arguments;
235
- let destArg;
236
- // Determine which argument is the destination based on the function
237
- if (node.callee.type === 'MemberExpression' && node.callee.property.type === 'Identifier') {
238
- const methodName = node.callee.property.name;
239
- if (['extractAllTo', 'unzip'].includes(methodName)) {
240
- // Destination is the first argument
241
- destArg = args[0];
242
- }
243
- else if (archiveFunctions.includes(methodName)) {
244
- // For other archive functions, destination is typically the second argument
245
- destArg = args.length >= 2 ? args[1] : undefined;
246
- }
247
- }
248
- else if (node.callee.type === 'Identifier' && archiveFunctions.includes(node.callee.name)) {
249
- // For standalone functions like extractArchive(file, dest)
250
- destArg = args.length >= 2 ? args[1] : undefined;
251
- }
252
- const destText = destArg && destArg.type === 'Literal' && typeof destArg.value === 'string' ? destArg.value : '';
253
- const isDestDangerous = isDangerousDestination(destText);
254
- const isMethodCall = node.callee.type === 'MemberExpression';
255
- if (isMethodCall) {
256
- // Method calls report unsafeArchiveExtraction unless destination is a safe relative path
257
- const isSafeRelativePath = destText.startsWith('./') || destText.startsWith('../');
258
- if (!isSafeRelativePath) {
259
- context.report({
260
- node,
261
- messageId: 'unsafeArchiveExtraction',
262
- data: {
263
- filePath: filename,
264
- line: String(node.loc?.start.line ?? 0),
265
- },
266
- suggest: [
267
- {
268
- messageId: 'useSafeArchiveExtraction',
269
- fix: () => null,
270
- },
271
- ],
272
- });
273
- }
274
- // For safe relative paths, don't report any error
275
- // Additionally report dangerous destination for dangerous destinations
276
- if (isDestDangerous) {
277
- context.report({
278
- node: destArg || node,
279
- messageId: 'dangerousArchiveDestination',
280
- data: {
281
- filePath: filename,
282
- line: String(node.loc?.start.line ?? 0),
283
- },
284
- });
285
- }
286
- }
287
- else {
288
- // Standalone calls: report dangerousArchiveDestination for dangerous destinations, unsafeArchiveExtraction otherwise
289
- if (isDestDangerous) {
290
- context.report({
291
- node,
292
- messageId: 'dangerousArchiveDestination',
293
- data: {
294
- filePath: filename,
295
- line: String(node.loc?.start.line ?? 0),
296
- },
297
- });
298
- }
299
- else {
300
- context.report({
301
- node,
302
- messageId: 'unsafeArchiveExtraction',
303
- data: {
304
- filePath: filename,
305
- line: String(node.loc?.start.line ?? 0),
306
- },
307
- suggest: [
308
- {
309
- messageId: 'useSafeArchiveExtraction',
310
- fix: () => null
311
- },
312
- ],
313
- });
314
- }
315
- }
316
- }
317
- // Check for path.join or similar operations with archive entry names
318
- const callee = node.callee;
319
- if (callee.type === 'MemberExpression' &&
320
- callee.property.type === 'Identifier' &&
321
- ['join', 'resolve', 'relative', 'normalize'].includes(callee.property.name)) {
322
- // Check arguments for potential archive entry usage
323
- const args = node.arguments;
324
- for (const arg of args) {
325
- if (arg.type === 'MemberExpression' &&
326
- arg.property.type === 'Identifier' &&
327
- ['name', 'path', 'fileName', 'entryName', 'relativePath', 'filename', 'pathname'].includes(arg.property.name)) {
328
- // This looks like path.join(dest, entry.name) - check if validated
329
- if (!isPathValidated(arg)) {
330
- context.report({
331
- node: arg,
332
- messageId: 'unvalidatedArchivePath',
333
- data: {
334
- filePath: filename,
335
- line: String(node.loc?.start.line ?? 0),
336
- },
337
- });
338
- }
339
- }
340
- }
341
- }
342
- },
343
- // Check string literals for dangerous paths
344
- Literal(node) {
345
- if (typeof node.value !== 'string') {
346
- return;
347
- }
348
- const text = node.value;
349
- // Check for path traversal in strings that look like file paths
350
- if ((text.includes('/') || text.includes('\\')) && containsPathTraversal(text)) {
351
- // Check if this is in an archive-related context
352
- let current = node;
353
- let isArchiveContext = false;
354
- while (current && !isArchiveContext) {
355
- if (current.type === 'CallExpression' && isArchiveExtraction(current)) {
356
- isArchiveContext = true;
357
- break;
358
- }
359
- if (current.type === 'VariableDeclarator' &&
360
- current.id.type === 'Identifier' &&
361
- (current.id.name.includes('archive') ||
362
- current.id.name.includes('zip') ||
363
- current.id.name.includes('tar') ||
364
- current.id.name.includes('path') ||
365
- current.id.name.includes('file') ||
366
- current.id.name.includes('entry'))) {
367
- isArchiveContext = true;
368
- break;
369
- }
370
- current = current.parent;
371
- }
372
- // Also check if the variable name suggests archive usage
373
- const parent = node.parent;
374
- if (parent && parent.type === 'VariableDeclarator' && parent.id.type === 'Identifier') {
375
- const varName = parent.id.name.toLowerCase();
376
- if (varName.includes('archive') || varName.includes('zip') || varName.includes('tar') ||
377
- varName.includes('path') || varName.includes('file') || varName.includes('extract') ||
378
- varName.includes('entry')) {
379
- isArchiveContext = true;
380
- }
381
- }
382
- if (isArchiveContext) {
383
- context.report({
384
- node,
385
- messageId: 'pathTraversalInArchive',
386
- data: {
387
- filePath: filename,
388
- line: String(node.loc?.start.line ?? 0),
389
- },
390
- });
391
- }
392
- }
393
- // Dangerous destinations are handled by the CallExpression handler to avoid duplicates
394
- // Only check for dangerous destinations not related to archive extraction
395
- if (isDangerousDestination(text) && !containsPathTraversal(text)) {
396
- // Check if this is used as an extraction destination
397
- let current = node;
398
- let isExtractionDest = false;
399
- while (current && !isExtractionDest) {
400
- if (current.type === 'CallExpression' && isArchiveExtraction(current)) {
401
- // Check if this node is a destination argument
402
- const args = current.arguments;
403
- const callee = current.callee;
404
- const isMethodCall = callee.type === 'MemberExpression';
405
- if ((isMethodCall && args.length >= 1 && args[0] === node) ||
406
- (!isMethodCall && args.length >= 2 && args[1] === node)) {
407
- isExtractionDest = true;
408
- break;
409
- }
410
- }
411
- current = current.parent;
412
- }
413
- // Only report if not already handled by CallExpression handler
414
- if (!isExtractionDest) {
415
- context.report({
416
- node,
417
- messageId: 'dangerousArchiveDestination',
418
- data: {
419
- filePath: filename,
420
- line: String(node.loc?.start.line ?? 0),
421
- },
422
- });
423
- }
424
- }
425
- },
426
- // Check variable assignments
427
- VariableDeclarator(node) {
428
- if (!node.init || node.id.type !== 'Identifier') {
429
- return;
430
- }
431
- const varName = node.id.name.toLowerCase();
432
- // Check if this variable holds archive-related data
433
- if (varName.includes('entry') || varName.includes('file') || varName.includes('path')) {
434
- if (node.init.type === 'MemberExpression' &&
435
- node.init.property.type === 'Identifier' &&
436
- ['name', 'path'].includes(node.init.property.name)) {
437
- // This looks like: const entryName = entry.name;
438
- // Check if this variable is used unsafely later
439
- // This is a simplified check - in practice we'd need more sophisticated analysis
440
- }
441
- }
442
- }
443
- };
444
- },
445
- });
@@ -1,6 +0,0 @@
1
- /**
2
- * @fileoverview Require server-side authorization checks
3
- */
4
- export interface Options {
5
- }
6
- export declare const requireBackendAuthorization: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -1,60 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Require server-side authorization checks
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.requireBackendAuthorization = void 0;
7
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
8
- exports.requireBackendAuthorization = (0, eslint_devkit_1.createRule)({
9
- name: 'require-backend-authorization',
10
- meta: {
11
- type: 'problem',
12
- docs: {
13
- description: 'Require server-side authorization checks',
14
- },
15
- messages: {
16
- violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
17
- icon: eslint_devkit_1.MessageIcons.SECURITY,
18
- issueName: 'Client-Side Authorization',
19
- cwe: 'CWE-602',
20
- description: 'Authorization logic in client code - easily bypassed',
21
- severity: 'CRITICAL',
22
- fix: 'Move authorization checks to server-side API endpoints',
23
- documentationLink: 'https://cwe.mitre.org/data/definitions/602.html',
24
- })
25
- },
26
- schema: [],
27
- },
28
- defaultOptions: [],
29
- create(context) {
30
- function report(node) {
31
- context.report({ node, messageId: 'violationDetected' });
32
- }
33
- const authProperties = ['role', 'isAdmin', 'isAuthenticated', 'permissions', 'admin'];
34
- return {
35
- IfStatement(node) {
36
- // Detect role-based access in client-side if statements
37
- if (node.test.type === 'BinaryExpression') {
38
- const checkMember = (expr) => {
39
- if (expr.type === 'MemberExpression' &&
40
- expr.property.type === 'Identifier' &&
41
- authProperties.includes(expr.property.name)) {
42
- return true;
43
- }
44
- return false;
45
- };
46
- if (checkMember(node.test.left) ||
47
- checkMember(node.test.right)) {
48
- report(node);
49
- }
50
- }
51
- // Check for user.role or user.isAdmin access
52
- if (node.test.type === 'MemberExpression' &&
53
- node.test.property.type === 'Identifier' &&
54
- authProperties.includes(node.test.property.name)) {
55
- report(node);
56
- }
57
- },
58
- };
59
- },
60
- });
@@ -1,8 +0,0 @@
1
- /**
2
- * @fileoverview Require minification configuration
3
- * @see https://owasp.org/www-project-mobile-top-10/
4
- * @see https://cwe.mitre.org/data/definitions/656.html
5
- */
6
- export interface Options {
7
- }
8
- export declare const requireCodeMinification: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -1,47 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Require minification configuration
4
- * @see https://owasp.org/www-project-mobile-top-10/
5
- * @see https://cwe.mitre.org/data/definitions/656.html
6
- */
7
- Object.defineProperty(exports, "__esModule", { value: true });
8
- exports.requireCodeMinification = void 0;
9
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
10
- exports.requireCodeMinification = (0, eslint_devkit_1.createRule)({
11
- name: 'require-code-minification',
12
- meta: {
13
- type: 'problem',
14
- docs: {
15
- description: 'Require minification configuration',
16
- category: 'Security',
17
- recommended: true,
18
- owaspMobile: ['M7'],
19
- cweIds: ["CWE-656"],
20
- },
21
- messages: {
22
- violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
23
- icon: eslint_devkit_1.MessageIcons.SECURITY,
24
- issueName: 'violation Detected',
25
- cwe: 'CWE-656',
26
- description: 'Require minification configuration detected - Build config without minification',
27
- severity: 'LOW',
28
- fix: 'Review and apply secure practices',
29
- documentationLink: 'https://cwe.mitre.org/data/definitions/656.html',
30
- })
31
- },
32
- schema: [],
33
- },
34
- defaultOptions: [],
35
- create(context) {
36
- return {
37
- Property(node) {
38
- if (node.key.type === 'Identifier' &&
39
- node.key.name === 'minimize' &&
40
- node.value.type === 'Literal' &&
41
- node.value.value === false) {
42
- context.report({ node, messageId: 'violationDetected' });
43
- }
44
- },
45
- };
46
- },
47
- });
@@ -1,6 +0,0 @@
1
- /**
2
- * @fileoverview Require Content Security Policy
3
- */
4
- export interface Options {
5
- }
6
- export declare const requireCspHeaders: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;
@@ -1,64 +0,0 @@
1
- "use strict";
2
- /**
3
- * @fileoverview Require Content Security Policy
4
- */
5
- Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.requireCspHeaders = void 0;
7
- const eslint_devkit_1 = require("@interlace/eslint-devkit");
8
- exports.requireCspHeaders = (0, eslint_devkit_1.createRule)({
9
- name: 'require-csp-headers',
10
- meta: {
11
- type: 'problem',
12
- docs: {
13
- description: 'Require Content Security Policy headers',
14
- },
15
- messages: {
16
- violationDetected: (0, eslint_devkit_1.formatLLMMessage)({
17
- icon: eslint_devkit_1.MessageIcons.SECURITY,
18
- issueName: 'Missing CSP',
19
- cwe: 'CWE-1021',
20
- description: 'HTML response without Content-Security-Policy header',
21
- severity: 'MEDIUM',
22
- fix: 'Use helmet.contentSecurityPolicy() or set CSP header manually',
23
- documentationLink: 'https://cwe.mitre.org/data/definitions/1021.html',
24
- })
25
- },
26
- schema: [],
27
- },
28
- defaultOptions: [],
29
- create(context) {
30
- function report(node) {
31
- context.report({ node, messageId: 'violationDetected' });
32
- }
33
- return {
34
- CallExpression(node) {
35
- // Detect res.send(html) with HTML content without CSP
36
- if (node.callee.type === 'MemberExpression' &&
37
- node.callee.property.type === 'Identifier' &&
38
- node.callee.property.name === 'send') {
39
- const arg = node.arguments[0];
40
- // Check if sending HTML string
41
- if (arg && arg.type === 'TemplateLiteral') {
42
- const quasi = arg.quasis[0]?.value?.raw || '';
43
- if (quasi.includes('<html') || quasi.includes('<!DOCTYPE')) {
44
- report(node);
45
- }
46
- }
47
- if (arg && arg.type === 'Literal' && typeof arg.value === 'string') {
48
- if (arg.value.includes('<html') || arg.value.includes('<!DOCTYPE')) {
49
- report(node);
50
- }
51
- }
52
- }
53
- // Detect res.render() without CSP middleware
54
- if (node.callee.type === 'MemberExpression' &&
55
- node.callee.property.type === 'Identifier' &&
56
- node.callee.property.name === 'render') {
57
- // This is a heuristic - flag render calls as a reminder
58
- // In real projects, you'd check for helmet middleware
59
- report(node);
60
- }
61
- },
62
- };
63
- },
64
- });
@@ -1,8 +0,0 @@
1
- /**
2
- * @fileoverview Identify excessive data collection
3
- * @see https://owasp.org/www-project-mobile-top-10/
4
- * @see https://cwe.mitre.org/data/definitions/213.html
5
- */
6
- export interface Options {
7
- }
8
- export declare const requireDataMinimization: ESLintUtils.RuleModule<MessageIds, Options, unknown, ESLintUtils.RuleListener>;