@critiq/rules 0.1.0 → 0.2.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 (299) hide show
  1. package/README.md +1 -1
  2. package/catalog.yaml +617 -0
  3. package/package.json +1 -1
  4. package/rules/go/go.correctness.defer-close-before-check.rule.yaml +44 -0
  5. package/rules/go/go.correctness.defer-in-loop.rule.yaml +47 -0
  6. package/rules/go/go.correctness.nil-context-passed.rule.yaml +43 -0
  7. package/rules/go/go.correctness.nil-map-assignment.rule.yaml +42 -0
  8. package/rules/go/go.correctness.time-tick-leak.rule.yaml +44 -0
  9. package/rules/go/go.correctness.unused-append-result.rule.yaml +43 -0
  10. package/rules/go/go.correctness.waitgroup-add-in-goroutine.rule.yaml +45 -0
  11. package/rules/go/go.security.bind-all-interfaces.rule.yaml +57 -0
  12. package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +10 -0
  13. package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +10 -0
  14. package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +10 -0
  15. package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +10 -0
  16. package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +10 -0
  17. package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +10 -0
  18. package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +10 -0
  19. package/rules/go/go.security.insecure-rand-seed.rule.yaml +55 -0
  20. package/rules/go/go.security.insecure-ssh-host-key.rule.yaml +57 -0
  21. package/rules/go/go.security.insecure-ssl-protocol.rule.yaml +56 -0
  22. package/rules/go/go.security.insecure-temp-file.rule.yaml +57 -0
  23. package/rules/go/go.security.jwt-without-verification.rule.yaml +56 -0
  24. package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +10 -0
  25. package/rules/go/go.security.pprof-exposed.rule.yaml +56 -0
  26. package/rules/go/go.security.sensitive-data-egress.rule.yaml +10 -0
  27. package/rules/go/go.security.tar-path-traversal.rule.yaml +10 -0
  28. package/rules/go/go.security.template-unescaped-request-value.rule.yaml +10 -0
  29. package/rules/go/go.security.tls-missing-min-version.rule.yaml +55 -0
  30. package/rules/go/go.security.unsafe-package-import.rule.yaml +55 -0
  31. package/rules/go/go.security.weak-bcrypt-cost.rule.yaml +56 -0
  32. package/rules/go/go.security.weak-crypto-import.rule.yaml +57 -0
  33. package/rules/go/go.security.weak-rsa-key-size.rule.yaml +57 -0
  34. package/rules/go/go.security.weak-tls-cipher.rule.yaml +56 -0
  35. package/rules/java/java.correctness.catch-null-pointer.rule.yaml +40 -0
  36. package/rules/java/java.correctness.empty-catch.rule.yaml +40 -0
  37. package/rules/java/java.correctness.equals-on-array.rule.yaml +40 -0
  38. package/rules/java/java.correctness.return-in-finally.rule.yaml +40 -0
  39. package/rules/java/java.correctness.sync-on-string-literal.rule.yaml +40 -0
  40. package/rules/java/java.correctness.unsafe-optional-get.rule.yaml +40 -0
  41. package/rules/java/java.security.android-screenshot-exposure.rule.yaml +13 -0
  42. package/rules/java/java.security.android-world-readable-mode.rule.yaml +13 -0
  43. package/rules/java/java.security.hibernate-sql-concatenation.rule.yaml +62 -0
  44. package/rules/java/java.security.insecure-cipher-mode.rule.yaml +52 -0
  45. package/rules/java/java.security.insecure-network-protocol.rule.yaml +52 -0
  46. package/rules/java/java.security.insecure-ssl-context.rule.yaml +52 -0
  47. package/rules/java/java.security.jpa-concatenated-query.rule.yaml +13 -0
  48. package/rules/java/java.security.jwt-without-verification.rule.yaml +53 -0
  49. package/rules/java/java.security.null-cipher.rule.yaml +52 -0
  50. package/rules/java/java.security.permissive-cors.rule.yaml +53 -0
  51. package/rules/java/java.security.predictable-securerandom.rule.yaml +59 -0
  52. package/rules/java/java.security.reflected-output-from-request.rule.yaml +10 -0
  53. package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +13 -0
  54. package/rules/java/java.security.shell-runtime-exec.rule.yaml +58 -0
  55. package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +13 -0
  56. package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +13 -0
  57. package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +13 -0
  58. package/rules/java/java.security.spring-debug-exposure.rule.yaml +13 -0
  59. package/rules/java/java.security.spring-permit-all-default.rule.yaml +13 -0
  60. package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +13 -0
  61. package/rules/java/java.security.template-unescaped-user-output.rule.yaml +10 -0
  62. package/rules/java/java.security.trust-all-certificates.rule.yaml +52 -0
  63. package/rules/java/java.security.unsafe-jackson-deserialization.rule.yaml +59 -0
  64. package/rules/java/java.security.weak-rsa-key-size.rule.yaml +54 -0
  65. package/rules/java/java.security.xxe-document-builder.rule.yaml +59 -0
  66. package/rules/java/java.security.xxe-xml-input-factory.rule.yaml +59 -0
  67. package/rules/php/php.correctness.duplicate-array-key.rule.yaml +36 -0
  68. package/rules/php/php.correctness.error-suppression-operator.rule.yaml +36 -0
  69. package/rules/php/php.correctness.nullsafe-returned-by-reference.rule.yaml +36 -0
  70. package/rules/php/php.correctness.switch-multiple-default.rule.yaml +36 -0
  71. package/rules/php/php.correctness.unreachable-after-return.rule.yaml +36 -0
  72. package/rules/php/php.security.debug-function-exposure.rule.yaml +55 -0
  73. package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +10 -0
  74. package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +10 -0
  75. package/rules/php/php.security.insecure-session-id-generation.rule.yaml +51 -0
  76. package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +10 -0
  77. package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +13 -0
  78. package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +13 -0
  79. package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +13 -0
  80. package/rules/php/php.security.no-dynamic-eval.rule.yaml +52 -0
  81. package/rules/php/php.security.sensitive-data-egress.rule.yaml +10 -0
  82. package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +13 -0
  83. package/rules/php/php.security.symfony-debug-exposure.rule.yaml +13 -0
  84. package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +10 -0
  85. package/rules/php/php.security.unsafe-include-with-user-input.rule.yaml +52 -0
  86. package/rules/php/php.security.weak-cipher.rule.yaml +51 -0
  87. package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +13 -0
  88. package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +13 -0
  89. package/rules/php/php.security.xml-external-entity.rule.yaml +53 -0
  90. package/rules/python/py.correctness.assert-on-tuple.rule.yaml +33 -0
  91. package/rules/python/py.correctness.bare-except.rule.yaml +33 -0
  92. package/rules/python/py.correctness.broad-exception-handler.rule.yaml +33 -0
  93. package/rules/python/py.correctness.dangerous-mutable-default.rule.yaml +33 -0
  94. package/rules/python/py.correctness.duplicate-dict-key.rule.yaml +33 -0
  95. package/rules/python/py.security.bind-all-interfaces.rule.yaml +55 -0
  96. package/rules/python/py.security.debugger-import.rule.yaml +55 -0
  97. package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +13 -0
  98. package/rules/python/py.security.django-format-html-unsafe.rule.yaml +56 -0
  99. package/rules/python/py.security.django-mark-safe.rule.yaml +56 -0
  100. package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +13 -0
  101. package/rules/python/py.security.django-security-middleware-missing.rule.yaml +60 -0
  102. package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +13 -0
  103. package/rules/python/py.security.drf-allow-any-default.rule.yaml +13 -0
  104. package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +13 -0
  105. package/rules/python/py.security.dynamic-code-execution.rule.yaml +55 -0
  106. package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +13 -0
  107. package/rules/python/py.security.flask-debug-enabled.rule.yaml +56 -0
  108. package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +13 -0
  109. package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +13 -0
  110. package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +13 -0
  111. package/rules/python/py.security.insecure-temp-file.rule.yaml +55 -0
  112. package/rules/python/py.security.insecure-yaml-load.rule.yaml +55 -0
  113. package/rules/python/py.security.jinja-autoescape-disabled.rule.yaml +58 -0
  114. package/rules/python/py.security.subprocess-shell-enabled.rule.yaml +55 -0
  115. package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +13 -0
  116. package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +13 -0
  117. package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +13 -0
  118. package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +13 -0
  119. package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +13 -0
  120. package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +13 -0
  121. package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +13 -0
  122. package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +10 -0
  123. package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +10 -0
  124. package/rules/rust/rust.correctness.block-on-in-async.rule.yaml +48 -0
  125. package/rules/rust/rust.correctness.forget-join-handle.rule.yaml +48 -0
  126. package/rules/rust/rust.correctness.mutex-held-across-await.rule.yaml +48 -0
  127. package/rules/rust/rust.correctness.std-mutex-in-async-fn.rule.yaml +48 -0
  128. package/rules/rust/rust.correctness.thread-sleep-in-async.rule.yaml +48 -0
  129. package/rules/rust/rust.correctness.unbounded-channel.rule.yaml +49 -0
  130. package/rules/rust/rust.correctness.unchecked-index.rule.yaml +46 -0
  131. package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +13 -0
  132. package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +13 -0
  133. package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +13 -0
  134. package/rules/rust/rust.security.bind-all-interfaces.rule.yaml +57 -0
  135. package/rules/rust/rust.security.insecure-ssh-host-key.rule.yaml +57 -0
  136. package/rules/rust/rust.security.insecure-ssl-protocol.rule.yaml +57 -0
  137. package/rules/rust/rust.security.insecure-temp-file.rule.yaml +57 -0
  138. package/rules/rust/rust.security.insecure-yaml-load.rule.yaml +57 -0
  139. package/rules/rust/rust.security.jwt-without-verification.rule.yaml +57 -0
  140. package/rules/rust/rust.security.panic-in-async-handler.rule.yaml +57 -0
  141. package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +13 -0
  142. package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +13 -0
  143. package/rules/rust/rust.security.shell-command-spawn.rule.yaml +57 -0
  144. package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +13 -0
  145. package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +10 -0
  146. package/rules/rust/rust.security.tls-missing-min-version.rule.yaml +57 -0
  147. package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +13 -0
  148. package/rules/rust/rust.security.weak-crypto-import.rule.yaml +55 -0
  149. package/rules/rust/rust.security.weak-rsa-key-size.rule.yaml +57 -0
  150. package/rules/rust/rust.security.weak-tls-cipher.rule.yaml +57 -0
  151. package/rules/shared/security.archive-path-traversal.rule.yaml +10 -0
  152. package/rules/shared/security.external-file-upload.rule.yaml +10 -0
  153. package/rules/shared/security.insecure-http-transport.rule.yaml +10 -0
  154. package/rules/shared/security.no-command-execution-with-request-input.rule.yaml +10 -0
  155. package/rules/shared/security.no-hardcoded-credentials.rule.yaml +10 -0
  156. package/rules/shared/security.no-request-path-file-read.rule.yaml +10 -0
  157. package/rules/shared/security.no-sensitive-data-in-logs-and-telemetry.rule.yaml +10 -0
  158. package/rules/shared/security.no-sql-interpolation.rule.yaml +10 -0
  159. package/rules/shared/security.permissive-file-permissions.rule.yaml +10 -0
  160. package/rules/shared/security.sensitive-data-egress.rule.yaml +10 -0
  161. package/rules/shared/security.tls-verification-disabled.rule.yaml +10 -0
  162. package/rules/shared/security.unsafe-deserialization.rule.yaml +10 -0
  163. package/rules/shared/security.weak-hash-algorithm.rule.yaml +10 -0
  164. package/rules/typescript/ts.correctness.array-callback-missing-return.rule.yaml +35 -0
  165. package/rules/typescript/ts.correctness.array-sort-without-compare.rule.yaml +35 -0
  166. package/rules/typescript/ts.correctness.control-flow-in-finally.rule.yaml +35 -0
  167. package/rules/typescript/ts.correctness.duplicate-if-else-condition.rule.yaml +35 -0
  168. package/rules/typescript/ts.correctness.for-in-on-array.rule.yaml +35 -0
  169. package/rules/typescript/ts.correctness.infinite-loop.rule.yaml +32 -0
  170. package/rules/typescript/ts.correctness.invalid-await-expression.rule.yaml +32 -0
  171. package/rules/typescript/ts.correctness.invalid-typeof-comparison.rule.yaml +35 -0
  172. package/rules/typescript/ts.correctness.missing-async-on-promise-method.rule.yaml +32 -0
  173. package/rules/typescript/ts.correctness.missing-super-call.rule.yaml +35 -0
  174. package/rules/typescript/ts.correctness.no-floating-promise-in-function.rule.yaml +32 -0
  175. package/rules/typescript/ts.correctness.no-misused-promises.rule.yaml +32 -0
  176. package/rules/typescript/ts.correctness.promise-reject-non-error.rule.yaml +35 -0
  177. package/rules/typescript/ts.correctness.this-before-super.rule.yaml +35 -0
  178. package/rules/typescript/ts.correctness.unnecessary-return-await.rule.yaml +32 -0
  179. package/rules/typescript/ts.correctness.use-number-is-nan.rule.yaml +35 -0
  180. package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +13 -0
  181. package/rules/typescript/ts.performance.no-await-in-loop.rule.yaml +32 -0
  182. package/rules/typescript/ts.quality.no-empty-function.rule.yaml +32 -0
  183. package/rules/typescript/ts.react.no-bind-in-jsx-props.rule.yaml +36 -0
  184. package/rules/typescript/ts.react.no-children-prop.rule.yaml +34 -0
  185. package/rules/typescript/ts.react.no-direct-state-mutation.rule.yaml +34 -0
  186. package/rules/typescript/ts.react.no-duplicate-jsx-attributes.rule.yaml +34 -0
  187. package/rules/typescript/ts.react.no-jsx-props-spread.rule.yaml +35 -0
  188. package/rules/typescript/ts.react.no-set-state-in-component-did-mount.rule.yaml +34 -0
  189. package/rules/typescript/ts.react.no-set-state-in-component-did-update.rule.yaml +34 -0
  190. package/rules/typescript/ts.react.no-target-blank-without-rel.rule.yaml +46 -0
  191. package/rules/typescript/ts.react.no-this-in-function-component.rule.yaml +34 -0
  192. package/rules/typescript/ts.runtime.no-process-exit.rule.yaml +44 -0
  193. package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +10 -0
  194. package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +13 -0
  195. package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +16 -0
  196. package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +16 -0
  197. package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +16 -0
  198. package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +16 -0
  199. package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +13 -0
  200. package/rules/typescript/ts.security.bind-to-all-interfaces.rule.yaml +10 -0
  201. package/rules/typescript/ts.security.browser-token-storage.rule.yaml +10 -0
  202. package/rules/typescript/ts.security.dangerous-insert-html.rule.yaml +10 -0
  203. package/rules/typescript/ts.security.dangerously-set-inner-html.rule.yaml +10 -0
  204. package/rules/typescript/ts.security.datadog-browser-track-user-interactions.rule.yaml +10 -0
  205. package/rules/typescript/ts.security.debug-mode-enabled.rule.yaml +10 -0
  206. package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +10 -0
  207. package/rules/typescript/ts.security.dynamodb-query-injection.rule.yaml +10 -0
  208. package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +10 -0
  209. package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +10 -0
  210. package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +10 -0
  211. package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +13 -0
  212. package/rules/typescript/ts.security.exposed-directory-listing.rule.yaml +10 -0
  213. package/rules/typescript/ts.security.express-cookie-missing-http-only.rule.yaml +16 -0
  214. package/rules/typescript/ts.security.express-default-cookie-config.rule.yaml +16 -0
  215. package/rules/typescript/ts.security.express-default-session-config.rule.yaml +16 -0
  216. package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +16 -0
  217. package/rules/typescript/ts.security.express-insecure-cookie.rule.yaml +16 -0
  218. package/rules/typescript/ts.security.express-missing-helmet.rule.yaml +16 -0
  219. package/rules/typescript/ts.security.express-nosql-injection.rule.yaml +16 -0
  220. package/rules/typescript/ts.security.express-permissive-cookie-config.rule.yaml +16 -0
  221. package/rules/typescript/ts.security.express-permissive-cors.rule.yaml +52 -0
  222. package/rules/typescript/ts.security.express-reduce-fingerprint.rule.yaml +16 -0
  223. package/rules/typescript/ts.security.express-static-assets-after-session.rule.yaml +16 -0
  224. package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +16 -0
  225. package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +16 -0
  226. package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +16 -0
  227. package/rules/typescript/ts.security.external-file-upload.rule.yaml +10 -0
  228. package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +16 -0
  229. package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +16 -0
  230. package/rules/typescript/ts.security.file-generation.rule.yaml +10 -0
  231. package/rules/typescript/ts.security.format-string-using-user-input.rule.yaml +10 -0
  232. package/rules/typescript/ts.security.frontend-only-authorization.rule.yaml +10 -0
  233. package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +16 -0
  234. package/rules/typescript/ts.security.handlebars-no-escape.rule.yaml +10 -0
  235. package/rules/typescript/ts.security.hardcoded-auth-secret.rule.yaml +10 -0
  236. package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +10 -0
  237. package/rules/typescript/ts.security.import-using-user-input.rule.yaml +10 -0
  238. package/rules/typescript/ts.security.information-leakage.rule.yaml +10 -0
  239. package/rules/typescript/ts.security.insecure-allow-origin.rule.yaml +10 -0
  240. package/rules/typescript/ts.security.insecure-auth-cookie-flags.rule.yaml +10 -0
  241. package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +10 -0
  242. package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +10 -0
  243. package/rules/typescript/ts.security.insecure-password-hash-configuration.rule.yaml +10 -0
  244. package/rules/typescript/ts.security.insecure-websocket-transport.rule.yaml +10 -0
  245. package/rules/typescript/ts.security.insufficiently-random-values.rule.yaml +10 -0
  246. package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +10 -0
  247. package/rules/typescript/ts.security.jwt-not-revoked.rule.yaml +10 -0
  248. package/rules/typescript/ts.security.jwt-sensitive-claims.rule.yaml +10 -0
  249. package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +10 -0
  250. package/rules/typescript/ts.security.log-injection.rule.yaml +10 -0
  251. package/rules/typescript/ts.security.manual-html-sanitization.rule.yaml +10 -0
  252. package/rules/typescript/ts.security.missing-authorization-before-sensitive-action.rule.yaml +10 -0
  253. package/rules/typescript/ts.security.missing-integrity-check.rule.yaml +10 -0
  254. package/rules/typescript/ts.security.missing-message-origin-check.rule.yaml +10 -0
  255. package/rules/typescript/ts.security.missing-ownership-validation.rule.yaml +10 -0
  256. package/rules/typescript/ts.security.missing-request-timeout-or-retry.rule.yaml +10 -0
  257. package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +16 -0
  258. package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +16 -0
  259. package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +16 -0
  260. package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +16 -0
  261. package/rules/typescript/ts.security.no-alert-confirm-prompt.rule.yaml +44 -0
  262. package/rules/typescript/ts.security.no-arguments-callee.rule.yaml +44 -0
  263. package/rules/typescript/ts.security.no-assign-mutable-export.rule.yaml +45 -0
  264. package/rules/typescript/ts.security.no-dynamic-execution.rule.yaml +10 -0
  265. package/rules/typescript/ts.security.no-fs-readfile-sync-in-handler.rule.yaml +46 -0
  266. package/rules/typescript/ts.security.no-global-native-reassignment.rule.yaml +44 -0
  267. package/rules/typescript/ts.security.no-innerhtml-assignment.rule.yaml +10 -0
  268. package/rules/typescript/ts.security.no-javascript-url.rule.yaml +44 -0
  269. package/rules/typescript/ts.security.no-native-prototype-extension.rule.yaml +44 -0
  270. package/rules/typescript/ts.security.no-sync-child-process-exec.rule.yaml +45 -0
  271. package/rules/typescript/ts.security.no-throw-literal.rule.yaml +44 -0
  272. package/rules/typescript/ts.security.no-with-statement.rule.yaml +44 -0
  273. package/rules/typescript/ts.security.non-literal-fs-filename.rule.yaml +10 -0
  274. package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +13 -0
  275. package/rules/typescript/ts.security.observable-timing-discrepancy.rule.yaml +10 -0
  276. package/rules/typescript/ts.security.open-redirect.rule.yaml +10 -0
  277. package/rules/typescript/ts.security.permissive-allow-origin.rule.yaml +10 -0
  278. package/rules/typescript/ts.security.permissive-file-permissions.rule.yaml +10 -0
  279. package/rules/typescript/ts.security.postmessage-wildcard-origin.rule.yaml +10 -0
  280. package/rules/typescript/ts.security.predictable-token-generation.rule.yaml +10 -0
  281. package/rules/typescript/ts.security.raw-html-using-user-input.rule.yaml +10 -0
  282. package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +10 -0
  283. package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +10 -0
  284. package/rules/typescript/ts.security.sensitive-data-in-exception.rule.yaml +10 -0
  285. package/rules/typescript/ts.security.sensitive-data-written-to-file.rule.yaml +10 -0
  286. package/rules/typescript/ts.security.ssrf.rule.yaml +10 -0
  287. package/rules/typescript/ts.security.token-or-session-not-validated.rule.yaml +10 -0
  288. package/rules/typescript/ts.security.ui-redress.rule.yaml +10 -0
  289. package/rules/typescript/ts.security.unsafe-dirname-path-concat.rule.yaml +44 -0
  290. package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +10 -0
  291. package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +10 -0
  292. package/rules/typescript/ts.security.unsanitized-http-response.rule.yaml +10 -0
  293. package/rules/typescript/ts.security.unvalidated-external-input.rule.yaml +10 -0
  294. package/rules/typescript/ts.security.user-controlled-sendfile.rule.yaml +10 -0
  295. package/rules/typescript/ts.security.user-controlled-view-render.rule.yaml +10 -0
  296. package/rules/typescript/ts.security.weak-cipher-or-mode.rule.yaml +10 -0
  297. package/rules/typescript/ts.security.weak-key-strength.rule.yaml +10 -0
  298. package/rules/typescript/ts.security.weak-tls-version.rule.yaml +10 -0
  299. package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +10 -0
@@ -0,0 +1,32 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.correctness.unnecessary-return-await
5
+ title: Unnecessary Return Await
6
+ summary: Remove redundant return await
7
+ rationale: Remove redundant return await:return await in async functions outside try/catch adds stack overhead without changing behavior.
8
+ tags:
9
+ - correctness
10
+ - rules-catalog
11
+ stability: stable
12
+ appliesTo: block
13
+ scope:
14
+ languages:
15
+ - typescript
16
+ - javascript
17
+ match:
18
+ fact:
19
+ kind: async.unnecessary-return-await
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: correctness
24
+ severity: low
25
+ confidence: 0.85
26
+ tags:
27
+ - correctness
28
+ message:
29
+ title: Unnecessary Return Await
30
+ summary: "`${captures.issue.text}` matches ts.correctness.unnecessary-return-await."
31
+ remediation:
32
+ summary: Remove redundant return await:return await in async functions outside try/catch adds stack overhead without changing behavior.
@@ -0,0 +1,35 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.correctness.use-number-is-nan
5
+ title: Use Number.isNaN for NaN checks
6
+ summary: Do not compare values to NaN with `===` or `==`.
7
+ rationale: NaN is not equal to itself; identity comparisons are always false.
8
+ tags:
9
+ - correctness
10
+ - language
11
+ - rules-catalog
12
+ - crq-cor-029
13
+ stability: stable
14
+ appliesTo: file
15
+ scope:
16
+ languages:
17
+ - typescript
18
+ - javascript
19
+ match:
20
+ fact:
21
+ kind: language.use-number-is-nan
22
+ bind: issue
23
+ emit:
24
+ finding:
25
+ category: correctness.language
26
+ severity: medium
27
+ confidence: 0.95
28
+ tags:
29
+ - correctness
30
+ - language
31
+ message:
32
+ title: Replace NaN identity comparison
33
+ summary: "`${captures.issue.text}` compares to NaN with an equality operator."
34
+ remediation:
35
+ summary: Use `Number.isNaN(value)` (or `Number.isNaN` after coercion) instead of `value === NaN`.
@@ -5,6 +5,18 @@ metadata:
5
5
  title: Authenticate Next.js Server Actions before mutations
6
6
  summary: Server Actions that mutate state must validate sessions locally before reaching privileged sinks.
7
7
  rationale: Server Actions behave like public POST endpoints and inherit the same authentication obligations as route handlers.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-862
13
+ title: Missing Authorization
14
+ - kind: owasp
15
+ title: Authorization Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Authorization_Cheat_Sheet.html
17
+ - kind: url
18
+ title: Node.js security best practices
19
+ url: https://nodejs.org/en/learn/getting-started/security-best-practices
8
20
  tags:
9
21
  - security
10
22
  - next
@@ -33,3 +45,4 @@ emit:
33
45
  remediation:
34
46
  summary: >-
35
47
  Call your auth/session helper before mutations and enforce ownership inside database predicates.
48
+
@@ -0,0 +1,32 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.performance.no-await-in-loop
5
+ title: No Await In Loop
6
+ summary: Avoid await inside loops
7
+ rationale: Avoid await inside loops:sequential awaits in loops multiply latency; batch work or use Promise.all when safe.
8
+ tags:
9
+ - performance
10
+ - rules-catalog
11
+ stability: stable
12
+ appliesTo: block
13
+ scope:
14
+ languages:
15
+ - typescript
16
+ - javascript
17
+ match:
18
+ fact:
19
+ kind: performance.no-await-in-loop
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: performance
24
+ severity: medium
25
+ confidence: 0.85
26
+ tags:
27
+ - performance
28
+ message:
29
+ title: No Await In Loop
30
+ summary: "`${captures.issue.text}` matches ts.performance.no-await-in-loop."
31
+ remediation:
32
+ summary: Avoid await inside loops:sequential awaits in loops multiply latency; batch work or use Promise.all when safe.
@@ -0,0 +1,32 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.quality.no-empty-function
5
+ title: No Empty Function
6
+ summary: Avoid empty function bodies
7
+ rationale: Avoid empty function bodies:empty implementations hide missing logic; use a comment, throw, or remove the stub.
8
+ tags:
9
+ - quality
10
+ - rules-catalog
11
+ stability: stable
12
+ appliesTo: file
13
+ scope:
14
+ languages:
15
+ - typescript
16
+ - javascript
17
+ match:
18
+ fact:
19
+ kind: quality.empty-function
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality
24
+ severity: low
25
+ confidence: 0.85
26
+ tags:
27
+ - quality
28
+ message:
29
+ title: No Empty Function
30
+ summary: "`${captures.issue.text}` matches ts.quality.no-empty-function."
31
+ remediation:
32
+ summary: Avoid empty function bodies:empty implementations hide missing logic; use a comment, throw, or remove the stub.
@@ -0,0 +1,36 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-bind-in-jsx-props
5
+ title: Avoid inline functions and bind in JSX props
6
+ summary: Creating `function` handlers or `.bind()` calls inside JSX forces new function identities every render and makes memoized children re-render unnecessarily.
7
+ rationale: Stable handler references keep render work predictable and make dependency lists in memoized components meaningful.
8
+ tags:
9
+ - react
10
+ - performance
11
+ - ui
12
+ - rules-catalog
13
+ stability: experimental
14
+ appliesTo: function
15
+ scope:
16
+ languages:
17
+ - typescript
18
+ - javascript
19
+ match:
20
+ fact:
21
+ kind: ui.react.bind-in-jsx-prop
22
+ bind: issue
23
+ emit:
24
+ finding:
25
+ category: performance.ui
26
+ severity: medium
27
+ confidence: 0.78
28
+ tags:
29
+ - react
30
+ - performance
31
+ - ui
32
+ message:
33
+ title: Hoist JSX event handlers out of render
34
+ summary: "`${captures.issue.text}` creates a new handler on every render."
35
+ remediation:
36
+ summary: Define handlers on the class instance, bind once in the constructor, or use useCallback for function components.
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-children-prop
5
+ title: Prefer nested JSX children over the children prop
6
+ summary: Passing `children` as a named prop is harder to read than composing elements between opening and closing tags.
7
+ rationale: Nested children match React composition idioms and keep component APIs consistent across the tree.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.children-prop
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: maintainability.ui
25
+ severity: low
26
+ confidence: 0.8
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Nest JSX children instead of using the children prop
32
+ summary: "`${captures.issue.text}` passes children through a prop attribute."
33
+ remediation:
34
+ summary: Place child elements between the component tags or accept `children` through normal function parameters without a JSX prop.
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-direct-state-mutation
5
+ title: Do not mutate React state directly
6
+ summary: Assigning to `this.state` bypasses React change detection and produces stale UI.
7
+ rationale: State updates must flow through setState or hooks so React can schedule renders and enforce immutability guarantees.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.direct-state-mutation
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: correctness.ui
25
+ severity: high
26
+ confidence: 0.88
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Update React state with setState
32
+ summary: "`${captures.issue.text}` mutates state directly."
33
+ remediation:
34
+ summary: Call setState with the next value or replace the state object immutably instead of assigning into this.state.
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-duplicate-jsx-attributes
5
+ title: Remove duplicate JSX attributes
6
+ summary: Repeating the same prop on a JSX element makes the last value win silently and hides author intent.
7
+ rationale: Duplicate attributes are usually copy-paste mistakes that change runtime behavior without type errors.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.duplicate-jsx-attribute
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: correctness.ui
25
+ severity: medium
26
+ confidence: 0.9
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Keep only one JSX attribute with the same name
32
+ summary: "`${captures.issue.text}` appears more than once on the same JSX element."
33
+ remediation:
34
+ summary: Remove the duplicate attribute or merge the values into a single prop expression.
@@ -0,0 +1,35 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-jsx-props-spread
5
+ title: Avoid spreading props onto JSX elements
6
+ summary: Unfiltered prop spreads hide which attributes reach the DOM and defeat static analysis of event handlers and accessibility props.
7
+ rationale: Explicit prop forwarding documents the component contract and avoids accidentally passing invalid or sensitive attributes downstream.
8
+ tags:
9
+ - react
10
+ - performance
11
+ - ui
12
+ - rules-catalog
13
+ stability: experimental
14
+ appliesTo: function
15
+ scope:
16
+ languages:
17
+ - typescript
18
+ - javascript
19
+ match:
20
+ fact:
21
+ kind: ui.react.jsx-props-spread
22
+ bind: issue
23
+ emit:
24
+ finding:
25
+ category: maintainability.ui
26
+ severity: low
27
+ confidence: 0.75
28
+ tags:
29
+ - react
30
+ - ui
31
+ message:
32
+ title: Forward JSX props explicitly
33
+ summary: "`${captures.issue.text}` spreads props onto a JSX element."
34
+ remediation:
35
+ summary: Destructure the props you intend to pass, whitelist safe attributes, or use a typed wrapper component.
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-set-state-in-component-did-mount
5
+ title: Avoid setState in componentDidMount
6
+ summary: Synchronous state updates during mount trigger an extra render before the browser paints the initial tree.
7
+ rationale: Initial state belongs in the constructor or class field initializers so the first render already reflects the mounted view.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.set-state-in-component-did-mount
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: correctness.ui
25
+ severity: medium
26
+ confidence: 0.82
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Initialize state before mount completes
32
+ summary: "`${captures.issue.text}` calls setState inside componentDidMount."
33
+ remediation:
34
+ summary: Move the initial value into state initialization or derive it from props with a guarded update strategy.
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-set-state-in-component-did-update
5
+ title: Guard setState in componentDidUpdate
6
+ summary: Unconditional setState in componentDidUpdate can recurse through renders when props or state change on every pass.
7
+ rationale: Updates should compare against prevProps or prevState so the component only re-renders when inputs actually changed.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.set-state-in-component-did-update
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: correctness.ui
25
+ severity: medium
26
+ confidence: 0.8
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Compare previous inputs before updating state
32
+ summary: "`${captures.issue.text}` calls setState inside componentDidUpdate without a prevProps or prevState guard."
33
+ remediation:
34
+ summary: Wrap the update in a conditional that compares prevProps or prevState, or move synchronization into getDerivedStateFromProps.
@@ -0,0 +1,46 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-target-blank-without-rel
5
+ title: Add rel=noopener to target=_blank links
6
+ summary: Opening links in a new tab without rel=noopener lets the destination page access window.opener.
7
+ rationale: Untrusted destinations can navigate or phish the opener tab unless noopener severs that relationship.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-79
13
+ title: Cross-site Scripting (XSS)
14
+ - kind: owasp
15
+ title: Cross Site Scripting Prevention Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
17
+ tags:
18
+ - react
19
+ - security
20
+ - ui
21
+ - rules-catalog
22
+ stability: experimental
23
+ appliesTo: function
24
+ scope:
25
+ languages:
26
+ - typescript
27
+ - javascript
28
+ match:
29
+ fact:
30
+ kind: ui.react.target-blank-without-rel
31
+ bind: issue
32
+ emit:
33
+ finding:
34
+ category: security.ui
35
+ severity: high
36
+ confidence: 0.9
37
+ tags:
38
+ - react
39
+ - security
40
+ - ui
41
+ message:
42
+ title: Harden external links opened in a new tab
43
+ summary: "`${captures.issue.text}` uses target=_blank without rel containing noopener."
44
+ remediation:
45
+ summary: Add rel=noopener or rel="noopener noreferrer" whenever target="_blank" is present.
46
+
@@ -0,0 +1,34 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.react.no-this-in-function-component
5
+ title: Do not use this in function components
6
+ summary: Function components have no instance, so `this` references are almost always mistakes copied from class components.
7
+ rationale: Hooks, props, and closures replace instance fields; leaving `this` in place breaks at runtime or hides missing refactors.
8
+ tags:
9
+ - react
10
+ - ui
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: function
14
+ scope:
15
+ languages:
16
+ - typescript
17
+ - javascript
18
+ match:
19
+ fact:
20
+ kind: ui.react.this-in-function-component
21
+ bind: issue
22
+ emit:
23
+ finding:
24
+ category: correctness.ui
25
+ severity: high
26
+ confidence: 0.76
27
+ tags:
28
+ - react
29
+ - ui
30
+ message:
31
+ title: Remove this from function components
32
+ summary: "`${captures.issue.text}` uses this inside a function component."
33
+ remediation:
34
+ summary: Use props, hooks, module-level helpers, or refs instead of instance fields accessed through this.
@@ -0,0 +1,44 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ts.runtime.no-process-exit
5
+ title: Avoid `process.exit` in application code
6
+ summary: Do not call `process.exit` from application logic; reserve termination for CLI entrypoints.
7
+ rationale: Forced process termination bypasses graceful shutdown, in-flight request draining, and cleanup hooks.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-16
13
+ title: Configuration
14
+ - kind: owasp
15
+ title: Secure Configuration Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Secure_Configuration_Cheat_Sheet.html
17
+ tags:
18
+ - runtime
19
+ - node
20
+ - rules-catalog
21
+ stability: stable
22
+ appliesTo: block
23
+ scope:
24
+ languages:
25
+ - typescript
26
+ - javascript
27
+ match:
28
+ fact:
29
+ kind: runtime.process-exit
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.reliability
34
+ severity: medium
35
+ confidence: 0.9
36
+ tags:
37
+ - runtime
38
+ - node
39
+ message:
40
+ title: Avoid `process.exit` in application code
41
+ summary: "`${captures.issue.text}` terminates the process abruptly and should be limited to CLI entrypoints."
42
+ remediation:
43
+ summary: Propagate errors to the caller or use graceful shutdown hooks instead of calling `process.exit`.
44
+
@@ -5,6 +5,15 @@ metadata:
5
5
  title: Harden AJV compile options
6
6
  summary: AJV should not compile schemas with allErrors true unless strict mode is enabled.
7
7
  rationale: Missing strict-mode options historically enabled schema compilation DoS and unexpected coercion behavior.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-16
13
+ title: Configuration
14
+ - kind: owasp
15
+ title: Secure Configuration Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Secure_Configuration_Cheat_Sheet.html
8
17
  tags:
9
18
  - security
10
19
  - validation
@@ -32,3 +41,4 @@ emit:
32
41
  summary: "${captures.issue.text} enables allErrors without strict, strictTypes, or strictSchema."
33
42
  remediation:
34
43
  summary: Enable AJV strict options appropriate to your major version and avoid compiling untrusted schemas with permissive settings.
44
+
@@ -5,6 +5,18 @@ metadata:
5
5
  title: Avoid trusting unsanitized Angular bypass sinks
6
6
  summary: DomSanitizer bypass helpers should not receive route, storage, or request-derived values without validation.
7
7
  rationale: Bypass helpers disable Angular templating protections and turn downstream sinks into XSS execution points.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-79
13
+ title: Cross-site Scripting (XSS)
14
+ - kind: owasp
15
+ title: Cross Site Scripting Prevention Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Cross_Site_Scripting_Prevention_Cheat_Sheet.html
17
+ - kind: url
18
+ title: Angular security guide
19
+ url: https://angular.dev/best-practices/security
8
20
  tags:
9
21
  - security
10
22
  - angular
@@ -33,3 +45,4 @@ emit:
33
45
  remediation:
34
46
  summary: >-
35
47
  Keep sensitive markup on Angular-safe bindings or sanitize with a reviewed helper before calling bypassSecurityTrust helpers.
48
+
@@ -5,6 +5,21 @@ metadata:
5
5
  title: Keep Apollo Server CSRF protections enabled
6
6
  summary: Apollo Server should not explicitly disable CSRF prevention for browser-accessible endpoints.
7
7
  rationale: GraphQL POST endpoints are vulnerable to cross-site writes when CSRF defenses are turned off.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-352
13
+ title: Cross-Site Request Forgery (CSRF)
14
+ - kind: owasp
15
+ title: Cross-Site Request Forgery Prevention Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
17
+ - kind: url
18
+ title: Node.js security best practices
19
+ url: https://nodejs.org/en/learn/getting-started/security-best-practices
20
+ - kind: url
21
+ title: Apollo Server security
22
+ url: https://www.apollographql.com/docs/apollo-server/security/security
8
23
  tags:
9
24
  - security
10
25
  - graphql
@@ -34,3 +49,4 @@ emit:
34
49
  remediation:
35
50
  summary: >-
36
51
  Remove `csrfPrevention: false` or replace it with an equivalent POST-only plus preflight strategy documented by Apollo.
52
+
@@ -5,6 +5,21 @@ metadata:
5
5
  title: Avoid shipping GraphQL dev landing or playground plugins without a production guard
6
6
  summary: Apollo Server dev landing pages, sandbox UIs, and GraphQL Playground-style plugins should not load unconditionally in production builds.
7
7
  rationale: Interactive GraphQL explorers widen attack surface and often expose schema details beyond what production APIs should advertise by default.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-400
13
+ title: Uncontrolled Resource Consumption
14
+ - kind: owasp
15
+ title: GraphQL Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html
17
+ - kind: url
18
+ title: Node.js security best practices
19
+ url: https://nodejs.org/en/learn/getting-started/security-best-practices
20
+ - kind: url
21
+ title: Apollo Server security
22
+ url: https://www.apollographql.com/docs/apollo-server/security/security
8
23
  tags:
9
24
  - security
10
25
  - graphql
@@ -34,3 +49,4 @@ emit:
34
49
  remediation:
35
50
  summary: >-
36
51
  Load sandbox or local landing plugins only outside production, prefer `ApolloServerPluginLandingPageProductionDefault`, or disable interactive explorers behind authentication at the edge.
52
+
@@ -5,6 +5,21 @@ metadata:
5
5
  title: Avoid unconditional GraphQL introspection
6
6
  summary: Apollo Server should not hard-enable introspection without environment guards.
7
7
  rationale: Introspection aids attackers in mapping schemas on production deployments.
8
+ detection:
9
+ kind: pattern
10
+ references:
11
+ - kind: cwe
12
+ id: CWE-400
13
+ title: Uncontrolled Resource Consumption
14
+ - kind: owasp
15
+ title: GraphQL Cheat Sheet
16
+ url: https://cheatsheetseries.owasp.org/cheatsheets/GraphQL_Cheat_Sheet.html
17
+ - kind: url
18
+ title: Node.js security best practices
19
+ url: https://nodejs.org/en/learn/getting-started/security-best-practices
20
+ - kind: url
21
+ title: Apollo Server security
22
+ url: https://www.apollographql.com/docs/apollo-server/security/security
8
23
  tags:
9
24
  - security
10
25
  - graphql
@@ -33,3 +48,4 @@ emit:
33
48
  summary: Apollo Server enables introspection with a literal `true` flag.
34
49
  remediation:
35
50
  summary: Bind introspection to non-production environments or protect the endpoint behind authenticated tooling.
51
+