@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@critiq/rules",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "private": false,
5
5
  "description": "Public OSS Critiq rule catalog with catalog metadata, shipped rule YAML files, and preset membership.",
6
6
  "license": "Apache-2.0",
@@ -0,0 +1,44 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.defer-close-before-check
5
+ title: Check error before deferring Close
6
+ summary: A deferred Close runs even when the open call failed and returned a nil handle.
7
+ rationale: >-
8
+ When `defer file.Close()` runs before the matching `if err != nil` check, a failed
9
+ open dereferences a nil resource and panics during cleanup.
10
+ tags:
11
+ - correctness
12
+ - go
13
+ - rules-catalog
14
+ stability: stable
15
+ appliesTo: block
16
+ scope:
17
+ languages:
18
+ - go
19
+ paths:
20
+ include:
21
+ - "**/*.go"
22
+ exclude:
23
+ - "**/*_test.go"
24
+ - "**/testdata/**"
25
+ - "**/vendor/**"
26
+ match:
27
+ fact:
28
+ kind: go.correctness.defer-close-before-check
29
+ bind: issue
30
+ emit:
31
+ finding:
32
+ category: correctness.exceptions
33
+ severity: high
34
+ confidence: 0.85
35
+ tags:
36
+ - correctness
37
+ - go
38
+ message:
39
+ title: Move `defer ... Close()` after the err check in `${captures.issue.text}`
40
+ summary: "A `defer ...Close()` runs before the matching `if err != nil` check on the open call."
41
+ remediation:
42
+ summary: >-
43
+ Return early when the open call sets a non-nil error, then defer the matching
44
+ `Close()` only once the resource is known to be valid.
@@ -0,0 +1,47 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.defer-in-loop
5
+ title: Avoid defer inside loops
6
+ summary: defer inside a loop holds resources until the surrounding function returns.
7
+ rationale: >-
8
+ `defer` runs when the enclosing function returns, not when the iteration ends.
9
+ Deferring inside a `for` or `for ... range` block accumulates open handles for
10
+ the lifetime of the function and can exhaust file descriptors or memory.
11
+ tags:
12
+ - correctness
13
+ - go
14
+ - resource-leak
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - go
21
+ paths:
22
+ include:
23
+ - "**/*.go"
24
+ exclude:
25
+ - "**/*_test.go"
26
+ - "**/testdata/**"
27
+ - "**/vendor/**"
28
+ match:
29
+ fact:
30
+ kind: go.correctness.defer-in-loop
31
+ bind: issue
32
+ emit:
33
+ finding:
34
+ category: correctness.resource-leak
35
+ severity: medium
36
+ confidence: 0.85
37
+ tags:
38
+ - correctness
39
+ - go
40
+ - resource-leak
41
+ message:
42
+ title: Remove `${captures.issue.text}` from the loop body
43
+ summary: "A `defer` statement runs inside a `for` loop and accumulates cleanups until the function returns."
44
+ remediation:
45
+ summary: >-
46
+ Wrap the per-iteration work in a helper or closure so the deferred call runs
47
+ when the iteration ends, not at function return.
@@ -0,0 +1,43 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.nil-context-passed
5
+ title: Pass a real context.Context
6
+ summary: Context-accepting calls should not receive a literal `nil` as their first argument.
7
+ rationale: >-
8
+ Standard library functions that take `context.Context` panic or skip cancellation
9
+ semantics when called with `nil`. Use `context.Background()`, `context.TODO()`, or
10
+ a propagated context instead.
11
+ tags:
12
+ - correctness
13
+ - go
14
+ - rules-catalog
15
+ stability: stable
16
+ appliesTo: block
17
+ scope:
18
+ languages:
19
+ - go
20
+ paths:
21
+ include:
22
+ - "**/*.go"
23
+ exclude:
24
+ - "**/*_test.go"
25
+ - "**/testdata/**"
26
+ - "**/vendor/**"
27
+ match:
28
+ fact:
29
+ kind: go.correctness.nil-context-passed
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: correctness.api-usage
34
+ severity: medium
35
+ confidence: 0.9
36
+ tags:
37
+ - correctness
38
+ - go
39
+ message:
40
+ title: Pass a real context to `${captures.issue.text}`
41
+ summary: "A context-accepting call receives a literal `nil` as its first argument."
42
+ remediation:
43
+ summary: Use `context.Background()`, `context.TODO()`, or a propagated context value instead of `nil`.
@@ -0,0 +1,42 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.nil-map-assignment
5
+ title: Initialize maps before assignment
6
+ summary: Writing to a nil map panics at runtime.
7
+ rationale: >-
8
+ A `var m map[K]V` declaration leaves `m` nil. Any `m[key] = value` write before
9
+ `make(map[K]V)` or a map literal initialization causes a runtime panic.
10
+ tags:
11
+ - correctness
12
+ - go
13
+ - rules-catalog
14
+ stability: stable
15
+ appliesTo: block
16
+ scope:
17
+ languages:
18
+ - go
19
+ paths:
20
+ include:
21
+ - "**/*.go"
22
+ exclude:
23
+ - "**/*_test.go"
24
+ - "**/testdata/**"
25
+ - "**/vendor/**"
26
+ match:
27
+ fact:
28
+ kind: go.correctness.nil-map-assignment
29
+ bind: issue
30
+ emit:
31
+ finding:
32
+ category: correctness.runtime
33
+ severity: high
34
+ confidence: 0.85
35
+ tags:
36
+ - correctness
37
+ - go
38
+ message:
39
+ title: Initialize map before writing to `${captures.issue.text}`
40
+ summary: "A `var m map[...]...` declaration is written to before `make(...)` or a literal initialization."
41
+ remediation:
42
+ summary: Initialize the map with `make(map[K]V)` or a map literal before writing to it.
@@ -0,0 +1,44 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.time-tick-leak
5
+ title: Avoid time.Tick for stoppable timers
6
+ summary: time.Tick leaks the underlying ticker because it cannot be stopped.
7
+ rationale: >-
8
+ `time.Tick` is documented as appropriate only for cases that run forever. Use
9
+ `time.NewTicker` so the ticker can be `Stop`ped when the consumer is done with it.
10
+ tags:
11
+ - correctness
12
+ - go
13
+ - rules-catalog
14
+ stability: stable
15
+ appliesTo: block
16
+ scope:
17
+ languages:
18
+ - go
19
+ paths:
20
+ include:
21
+ - "**/*.go"
22
+ exclude:
23
+ - "**/*_test.go"
24
+ - "**/testdata/**"
25
+ - "**/vendor/**"
26
+ match:
27
+ fact:
28
+ kind: go.correctness.time-tick-leak
29
+ bind: issue
30
+ emit:
31
+ finding:
32
+ category: correctness.resource-leak
33
+ severity: medium
34
+ confidence: 0.9
35
+ tags:
36
+ - correctness
37
+ - go
38
+ message:
39
+ title: Use `time.NewTicker` instead of `${captures.issue.text}`
40
+ summary: "`time.Tick` cannot be stopped and leaks the ticker goroutine."
41
+ remediation:
42
+ summary: >-
43
+ Replace `time.Tick(d)` with `time.NewTicker(d)` and defer `ticker.Stop()` once
44
+ the consumer no longer needs the channel.
@@ -0,0 +1,43 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.unused-append-result
5
+ title: Assign the result of append
6
+ summary: append returns a new slice; dropping the result loses the appended element.
7
+ rationale: >-
8
+ `append` may allocate a new backing array, so it always returns the resulting
9
+ slice. Calling `append(s, x)` as a standalone statement silently throws the
10
+ update away.
11
+ tags:
12
+ - correctness
13
+ - go
14
+ - rules-catalog
15
+ stability: stable
16
+ appliesTo: block
17
+ scope:
18
+ languages:
19
+ - go
20
+ paths:
21
+ include:
22
+ - "**/*.go"
23
+ exclude:
24
+ - "**/*_test.go"
25
+ - "**/testdata/**"
26
+ - "**/vendor/**"
27
+ match:
28
+ fact:
29
+ kind: go.correctness.unused-append-result
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: correctness.api-usage
34
+ severity: high
35
+ confidence: 0.9
36
+ tags:
37
+ - correctness
38
+ - go
39
+ message:
40
+ title: Capture the result of `${captures.issue.text}`
41
+ summary: "An `append(...)` call appears as a standalone statement without assigning its result."
42
+ remediation:
43
+ summary: Assign the result back to the slice variable, e.g. `s = append(s, x)`.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.correctness.waitgroup-add-in-goroutine
5
+ title: Call WaitGroup.Add before launching the goroutine
6
+ summary: WaitGroup.Add called inside the goroutine races with Wait.
7
+ rationale: >-
8
+ `sync.WaitGroup.Add` must happen before the launching goroutine returns to the
9
+ caller. If `Add` runs inside the goroutine, `Wait` may observe a zero counter and
10
+ return before the work begins.
11
+ tags:
12
+ - correctness
13
+ - go
14
+ - concurrency
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - go
21
+ paths:
22
+ include:
23
+ - "**/*.go"
24
+ exclude:
25
+ - "**/*_test.go"
26
+ - "**/testdata/**"
27
+ - "**/vendor/**"
28
+ match:
29
+ fact:
30
+ kind: go.correctness.waitgroup-add-in-goroutine
31
+ bind: issue
32
+ emit:
33
+ finding:
34
+ category: correctness.concurrency
35
+ severity: high
36
+ confidence: 0.88
37
+ tags:
38
+ - correctness
39
+ - go
40
+ - concurrency
41
+ message:
42
+ title: Move `${captures.issue.text}` before `go func`
43
+ summary: "A `WaitGroup.Add` call runs inside a `go func()` body and can race with `Wait`."
44
+ remediation:
45
+ summary: Call `wg.Add(n)` on the launching goroutine before the `go` statement starts the worker.
@@ -0,0 +1,57 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.security.bind-all-interfaces
5
+ title: Avoid binding Go services to all interfaces
6
+ summary: >-
7
+ Go network services should avoid explicit binds to `0.0.0.0`, `::`, or `[::]` unless public exposure is intentional and controlled.
8
+ rationale: >-
9
+ Binding every interface can unintentionally expose internal services beyond expected trust boundaries.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-668
15
+ title: Exposure of Resource to Wrong Sphere
16
+ - kind: url
17
+ title: CWE-668 Exposure of Resource to Wrong Sphere
18
+ url: https://cwe.mitre.org/data/definitions/668.html
19
+ tags:
20
+ - security
21
+ - go
22
+ - network
23
+ - exposure
24
+ - rules-catalog
25
+ stability: experimental
26
+ appliesTo: block
27
+ scope:
28
+ languages:
29
+ - go
30
+ paths:
31
+ include:
32
+ - "**/*.go"
33
+ exclude:
34
+ - "**/*_test.go"
35
+ - "**/testdata/**"
36
+ - "**/vendor/**"
37
+ match:
38
+ fact:
39
+ kind: go.security.bind-all-interfaces
40
+ bind: issue
41
+ emit:
42
+ finding:
43
+ category: security.network
44
+ severity: medium
45
+ confidence: 0.85
46
+ tags:
47
+ - security
48
+ - go
49
+ - network
50
+ - exposure
51
+ message:
52
+ title: Restrict interface bind in `${captures.issue.text}`
53
+ summary: "`${captures.issue.text}` binds a service to all network interfaces."
54
+ remediation:
55
+ summary: >-
56
+ Prefer loopback or an explicit interface bind unless broad exposure is required and defended by network controls.
57
+
@@ -8,6 +8,15 @@ metadata:
8
8
  rationale: >-
9
9
  Regex-based heuristics flag Echo `Bind` usage when the file defines structs with sensitive fields that omit `validate` or `binding` style tags.
10
10
  This is intentionally conservative and may miss cross-file structs or middleware-protected routes.
11
+ detection:
12
+ kind: pattern
13
+ references:
14
+ - kind: cwe
15
+ id: CWE-20
16
+ title: Improper Input Validation
17
+ - kind: owasp
18
+ title: Input Validation Cheat Sheet
19
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
11
20
  tags:
12
21
  - security
13
22
  - go
@@ -44,3 +53,4 @@ emit:
44
53
  remediation:
45
54
  summary: >-
46
55
  Add `validate` tags, use Echo's binding helpers with explicit validation, or route through a hardened DTO layer.
56
+
@@ -7,6 +7,15 @@ metadata:
7
7
  Multipart handlers should cap body size, sanitize filenames with `filepath.Base`, and avoid concatenating user filenames into destination paths.
8
8
  rationale: >-
9
9
  Unbounded multipart reads and raw `FormFile().Filename` usage enable DoS and path traversal when combined with predictable upload directories.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-434
15
+ title: Unrestricted Upload of File with Dangerous Type
16
+ - kind: owasp
17
+ title: File Upload Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -43,3 +52,4 @@ emit:
43
52
  remediation:
44
53
  summary: >-
45
54
  Wrap the request body with `http.MaxBytesReader`, normalize filenames with `filepath.Base`, enforce extension allowlists, and prefer storage APIs that never trust client paths.
55
+
@@ -7,6 +7,15 @@ metadata:
7
7
  Sensitive Fiber parsers should pair structs with validator tags or explicit validation so roles and secrets cannot be silently omitted.
8
8
  rationale: >-
9
9
  Regex heuristics flag `BodyParser`/`JSON` usage when structs in the same file define sensitive fields without `validate` or `binding` style tags.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-20
15
+ title: Improper Input Validation
16
+ - kind: owasp
17
+ title: Input Validation Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -43,3 +52,4 @@ emit:
43
52
  remediation:
44
53
  summary: >-
45
54
  Add `validate` struct tags, use Fiber validator middleware, or centralize DTO validation before business logic.
55
+
@@ -7,6 +7,15 @@ metadata:
7
7
  Fiber upload helpers should enforce size limits and never persist client-controlled filenames without normalization.
8
8
  rationale: >-
9
9
  `FormFile`/`SaveFile` flows that concatenate `Filename` into paths or skip `filepath.Base` are a common path traversal and storage abuse vector.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-434
15
+ title: Unrestricted Upload of File with Dangerous Type
16
+ - kind: owasp
17
+ title: File Upload Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -43,3 +52,4 @@ emit:
43
52
  remediation:
44
53
  summary: >-
45
54
  Apply `filepath.Base`, cap reader sizes, allowlist extensions, and store uploads using server-generated object keys.
55
+
@@ -7,6 +7,15 @@ metadata:
7
7
  Sensitive Gin binds should use `binding` or validator tags so authentication and mutation payloads cannot be silently empty.
8
8
  rationale: >-
9
9
  Regex heuristics flag `ShouldBindJSON`/`BindJSON` usage when structs in the same file omit `binding`/`validate` tags on sensitive fields such as passwords or roles.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-20
15
+ title: Improper Input Validation
16
+ - kind: owasp
17
+ title: Input Validation Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -43,3 +52,4 @@ emit:
43
52
  remediation:
44
53
  summary: >-
45
54
  Add `binding`/`validate` tags, register validators, or reject requests before they reach persistence layers.
55
+
@@ -7,6 +7,15 @@ metadata:
7
7
  `SetTrustedProxies` should list real upstreams instead of `nil` or `0.0.0.0/0` style catch-alls that spoof `X-Forwarded-For`.
8
8
  rationale: >-
9
9
  Trusting every proxy allows clients to forge client IP headers and bypass IP-based controls or auditing.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-16
15
+ title: Configuration
16
+ - kind: owasp
17
+ title: Secure Configuration Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Secure_Configuration_Cheat_Sheet.html
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -43,3 +52,4 @@ emit:
43
52
  remediation:
44
53
  summary: >-
45
54
  Replace catch-all trusted proxy lists with explicit CIDRs for your ingress tier and document the expected hop count.
55
+
@@ -7,6 +7,15 @@ metadata:
7
7
  `gin-contrib/cors` configurations must not combine wildcard origins with `AllowCredentials: true`.
8
8
  rationale: >-
9
9
  Wildcard origins with credentials violate browser CORS safety expectations and often mask missing origin allowlists in APIs that should be locked down.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-942
15
+ title: Permissive Cross-domain Policy with Untrusted Domains
16
+ - kind: owasp
17
+ title: Cross-Origin Resource Sharing (CORS)
18
+ url: https://owasp.org/www-community/attacks/CORS_OriginHeaderScrutiny
10
19
  tags:
11
20
  - security
12
21
  - go
@@ -45,3 +54,4 @@ emit:
45
54
  remediation:
46
55
  summary: >-
47
56
  Replace wildcard origins with explicit HTTPS origins, disable credentials when public anonymous access is intended, or move token APIs to header-only auth without credentialed CORS.
57
+
@@ -0,0 +1,55 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.security.insecure-rand-seed
5
+ title: Do not seed math/rand for security-sensitive randomness
6
+ summary: >-
7
+ `rand.Seed` from `math/rand` produces predictable streams; security-sensitive code must use `crypto/rand`.
8
+ rationale: >-
9
+ `math/rand` is a PRNG and remains predictable regardless of seed; tokens, secrets, and keys must come from `crypto/rand.Reader`.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-327
15
+ title: Use of a Broken or Risky Cryptographic Algorithm
16
+ - kind: owasp
17
+ title: Cryptographic Storage Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Cryptographic_Storage_Cheat_Sheet.html
19
+ tags:
20
+ - security
21
+ - go
22
+ - cryptography
23
+ - rules-catalog
24
+ stability: experimental
25
+ appliesTo: block
26
+ scope:
27
+ languages:
28
+ - go
29
+ paths:
30
+ include:
31
+ - "**/*.go"
32
+ exclude:
33
+ - "**/*_test.go"
34
+ - "**/testdata/**"
35
+ - "**/vendor/**"
36
+ match:
37
+ fact:
38
+ kind: go.security.insecure-rand-seed
39
+ bind: issue
40
+ emit:
41
+ finding:
42
+ category: security.cryptography
43
+ severity: medium
44
+ confidence: 0.72
45
+ tags:
46
+ - security
47
+ - go
48
+ - cryptography
49
+ message:
50
+ title: Replace `${captures.issue.text}` with cryptographic randomness
51
+ summary: "`${captures.issue.text}` seeds `math/rand`, which is not a secure source of randomness."
52
+ remediation:
53
+ summary: >-
54
+ Use `crypto/rand.Reader` (or `crypto/rand.Read`) to generate secrets, tokens, and keys. `math/rand` should only be used for non-security-sensitive randomness and does not need seeding in Go 1.20+.
55
+
@@ -0,0 +1,57 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: go.security.insecure-ssh-host-key
5
+ title: Verify SSH host keys instead of ignoring them
6
+ summary: >-
7
+ `ssh.InsecureIgnoreHostKey()` disables host key verification and exposes SSH clients to man-in-the-middle attacks.
8
+ rationale: >-
9
+ Skipping host key verification lets any network attacker impersonate the remote host and steal credentials or hijack sessions.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-319
15
+ title: Cleartext Transmission of Sensitive Information
16
+ - kind: owasp
17
+ title: Transport Layer Security Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Transport_Layer_Security_Cheat_Sheet.html
19
+ tags:
20
+ - security
21
+ - go
22
+ - ssh
23
+ - transport
24
+ - rules-catalog
25
+ stability: experimental
26
+ appliesTo: block
27
+ scope:
28
+ languages:
29
+ - go
30
+ paths:
31
+ include:
32
+ - "**/*.go"
33
+ exclude:
34
+ - "**/*_test.go"
35
+ - "**/testdata/**"
36
+ - "**/vendor/**"
37
+ match:
38
+ fact:
39
+ kind: go.security.insecure-ssh-host-key
40
+ bind: issue
41
+ emit:
42
+ finding:
43
+ category: security.transport
44
+ severity: high
45
+ confidence: 0.95
46
+ tags:
47
+ - security
48
+ - go
49
+ - ssh
50
+ - transport
51
+ message:
52
+ title: Replace insecure host-key callback at `${captures.issue.text}`
53
+ summary: "`${captures.issue.text}` disables SSH host key verification."
54
+ remediation:
55
+ summary: >-
56
+ Use `ssh.FixedHostKey`, `knownhosts.New`, or a callback that compares the remote host key to a trusted pin before completing the handshake.
57
+