@critiq/rules 0.0.2 → 0.1.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 (203) hide show
  1. package/README.md +52 -4
  2. package/catalog.yaml +985 -19
  3. package/package.json +6 -1
  4. package/rules/go/go.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  5. package/rules/go/go.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  6. package/rules/go/go.performance.no-unbounded-concurrency.rule.yaml +33 -0
  7. package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +46 -0
  8. package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +45 -0
  9. package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +45 -0
  10. package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +45 -0
  11. package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +45 -0
  12. package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +45 -0
  13. package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +47 -0
  14. package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +45 -0
  15. package/rules/go/go.security.sensitive-data-egress.rule.yaml +46 -0
  16. package/rules/go/go.security.tar-path-traversal.rule.yaml +45 -0
  17. package/rules/go/go.security.template-unescaped-request-value.rule.yaml +45 -0
  18. package/rules/go/go.testing.real-network-in-unit-test.rule.yaml +33 -0
  19. package/rules/go/go.testing.t-skip-without-ticket-reference.rule.yaml +33 -0
  20. package/rules/go/go.testing.time-sleep-in-unit-test.rule.yaml +33 -0
  21. package/rules/java/java.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  22. package/rules/java/java.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  23. package/rules/java/java.performance.no-unbounded-concurrency.rule.yaml +33 -0
  24. package/rules/java/java.security.android-screenshot-exposure.rule.yaml +35 -0
  25. package/rules/java/java.security.android-world-readable-mode.rule.yaml +35 -0
  26. package/rules/java/java.security.jpa-concatenated-query.rule.yaml +47 -0
  27. package/rules/java/java.security.reflected-output-from-request.rule.yaml +35 -0
  28. package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +35 -0
  29. package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +40 -0
  30. package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +40 -0
  31. package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +49 -0
  32. package/rules/java/java.security.spring-debug-exposure.rule.yaml +35 -0
  33. package/rules/java/java.security.spring-permit-all-default.rule.yaml +47 -0
  34. package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +47 -0
  35. package/rules/java/java.security.template-unescaped-user-output.rule.yaml +49 -0
  36. package/rules/java/java.testing.disabled-without-ticket-reference.rule.yaml +33 -0
  37. package/rules/java/java.testing.http-client-in-unit-test.rule.yaml +33 -0
  38. package/rules/java/java.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
  39. package/rules/php/php.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  40. package/rules/php/php.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  41. package/rules/php/php.performance.no-unbounded-concurrency.rule.yaml +33 -0
  42. package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +41 -0
  43. package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +41 -0
  44. package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +42 -0
  45. package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +42 -0
  46. package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +42 -0
  47. package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +45 -0
  48. package/rules/php/php.security.sensitive-data-egress.rule.yaml +42 -0
  49. package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +42 -0
  50. package/rules/php/php.security.symfony-debug-exposure.rule.yaml +44 -0
  51. package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +41 -0
  52. package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +42 -0
  53. package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +42 -0
  54. package/rules/php/php.testing.curl-in-unit-test.rule.yaml +33 -0
  55. package/rules/php/php.testing.mark-test-skipped-without-ticket-reference.rule.yaml +33 -0
  56. package/rules/php/php.testing.sleep-in-unit-test.rule.yaml +33 -0
  57. package/rules/python/py.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  58. package/rules/python/py.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  59. package/rules/python/py.performance.no-unbounded-concurrency.rule.yaml +33 -0
  60. package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +46 -0
  61. package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +47 -0
  62. package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +47 -0
  63. package/rules/python/py.security.drf-allow-any-default.rule.yaml +46 -0
  64. package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +46 -0
  65. package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +43 -0
  66. package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +44 -0
  67. package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +44 -0
  68. package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +44 -0
  69. package/rules/python/py.testing.pytest-skip-without-ticket-reference.rule.yaml +33 -0
  70. package/rules/python/py.testing.real-network-in-unit-test.rule.yaml +33 -0
  71. package/rules/python/py.testing.time-sleep-in-unit-test.rule.yaml +33 -0
  72. package/rules/ruby/ruby.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  73. package/rules/ruby/ruby.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  74. package/rules/ruby/ruby.performance.no-unbounded-concurrency.rule.yaml +33 -0
  75. package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +45 -0
  76. package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +44 -0
  77. package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +45 -0
  78. package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +46 -0
  79. package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +45 -0
  80. package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +45 -0
  81. package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +46 -0
  82. package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +45 -0
  83. package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +45 -0
  84. package/rules/ruby/ruby.testing.focused-example.rule.yaml +33 -0
  85. package/rules/ruby/ruby.testing.pending-without-ticket-reference.rule.yaml +33 -0
  86. package/rules/ruby/ruby.testing.real-network-in-unit-test.rule.yaml +33 -0
  87. package/rules/ruby/ruby.testing.skip-without-ticket-reference.rule.yaml +33 -0
  88. package/rules/ruby/ruby.testing.sleep-in-unit-test.rule.yaml +33 -0
  89. package/rules/rust/rust.performance.no-regex-construction-in-loop.rule.yaml +33 -0
  90. package/rules/rust/rust.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
  91. package/rules/rust/rust.performance.no-unbounded-concurrency.rule.yaml +33 -0
  92. package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +47 -0
  93. package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +45 -0
  94. package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +47 -0
  95. package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +45 -0
  96. package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +47 -0
  97. package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +47 -0
  98. package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +47 -0
  99. package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +45 -0
  100. package/rules/rust/rust.testing.ignore-without-ticket-reference.rule.yaml +33 -0
  101. package/rules/rust/rust.testing.real-network-in-unit-test.rule.yaml +33 -0
  102. package/rules/rust/rust.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
  103. package/rules/shared/security.archive-path-traversal.rule.yaml +41 -0
  104. package/rules/shared/security.external-file-upload.rule.yaml +40 -0
  105. package/rules/shared/security.permissive-file-permissions.rule.yaml +40 -0
  106. package/rules/shared/security.sensitive-data-egress.rule.yaml +36 -0
  107. package/rules/typescript/ts.correctness.assignment-in-condition.rule.yaml +36 -0
  108. package/rules/typescript/ts.correctness.assignment-to-import-binding.rule.yaml +36 -0
  109. package/rules/typescript/ts.correctness.async-promise-executor.rule.yaml +36 -0
  110. package/rules/typescript/ts.correctness.duplicate-function-parameter.rule.yaml +36 -0
  111. package/rules/typescript/ts.correctness.duplicate-import-source.rule.yaml +36 -0
  112. package/rules/typescript/ts.correctness.duplicate-object-key.rule.yaml +36 -0
  113. package/rules/typescript/ts.correctness.duplicate-switch-case.rule.yaml +36 -0
  114. package/rules/typescript/ts.correctness.empty-block-statement.rule.yaml +35 -0
  115. package/rules/typescript/ts.correctness.identical-comparison-operands.rule.yaml +36 -0
  116. package/rules/typescript/ts.correctness.reassign-catch-binding.rule.yaml +35 -0
  117. package/rules/typescript/ts.correctness.regexp-pattern-unusual-control-character.rule.yaml +35 -0
  118. package/rules/typescript/ts.correctness.self-assignment.rule.yaml +36 -0
  119. package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +35 -0
  120. package/rules/typescript/ts.performance.no-array-spread-in-hot-loop.rule.yaml +32 -0
  121. package/rules/typescript/ts.performance.no-cache-miss-from-unstable-key.rule.yaml +32 -0
  122. package/rules/typescript/ts.performance.no-expensive-sort-in-render-path.rule.yaml +32 -0
  123. package/rules/typescript/ts.performance.no-json-parse-stringify-clone.rule.yaml +32 -0
  124. package/rules/typescript/ts.performance.no-large-object-spread-in-loop.rule.yaml +32 -0
  125. package/rules/typescript/ts.performance.no-n-plus-one-await-in-map.rule.yaml +32 -0
  126. package/rules/typescript/ts.performance.no-redundant-network-fetch.rule.yaml +32 -0
  127. package/rules/typescript/ts.performance.no-regex-construction-in-loop.rule.yaml +32 -0
  128. package/rules/typescript/ts.performance.no-sync-fs-in-request-path.rule.yaml +32 -0
  129. package/rules/typescript/ts.performance.no-unbounded-concurrency.rule.yaml +32 -0
  130. package/rules/typescript/ts.quality.no-ambiguous-abbreviations.rule.yaml +27 -0
  131. package/rules/typescript/ts.quality.no-barrel-file-cycle.rule.yaml +27 -0
  132. package/rules/typescript/ts.quality.no-boolean-parameter-trap.rule.yaml +27 -0
  133. package/rules/typescript/ts.quality.no-dead-export.rule.yaml +27 -0
  134. package/rules/typescript/ts.quality.no-hidden-side-effect-import.rule.yaml +27 -0
  135. package/rules/typescript/ts.quality.no-inconsistent-error-shape.rule.yaml +27 -0
  136. package/rules/typescript/ts.quality.no-mixed-abstraction-level.rule.yaml +27 -0
  137. package/rules/typescript/ts.quality.no-primitive-obsession-in-domain-model.rule.yaml +27 -0
  138. package/rules/typescript/ts.quality.no-temporal-coupling.rule.yaml +27 -0
  139. package/rules/typescript/ts.quality.no-wide-public-surface.rule.yaml +27 -0
  140. package/rules/typescript/ts.react.no-accessibility-label-missing.rule.yaml +36 -0
  141. package/rules/typescript/ts.react.no-activedescendant-on-non-focusable-host.rule.yaml +36 -0
  142. package/rules/typescript/ts.react.no-click-without-keyboard-handler.rule.yaml +36 -0
  143. package/rules/typescript/ts.react.no-deprecated-create-factory.rule.yaml +34 -0
  144. package/rules/typescript/ts.react.no-deprecated-react-dom-root-api.rule.yaml +34 -0
  145. package/rules/typescript/ts.react.no-derived-state-from-props.rule.yaml +34 -0
  146. package/rules/typescript/ts.react.no-effect-fetch-without-cancellation.rule.yaml +35 -0
  147. package/rules/typescript/ts.react.no-find-dom-node.rule.yaml +34 -0
  148. package/rules/typescript/ts.react.no-img-missing-alt-text.rule.yaml +36 -0
  149. package/rules/typescript/ts.react.no-index-as-key-in-dynamic-list.rule.yaml +34 -0
  150. package/rules/typescript/ts.react.no-interactive-role-on-static-semantics.rule.yaml +36 -0
  151. package/rules/typescript/ts.react.no-invalid-anchor-href.rule.yaml +36 -0
  152. package/rules/typescript/ts.react.no-keyboard-interaction-without-widget-role.rule.yaml +36 -0
  153. package/rules/typescript/ts.react.no-legacy-lifecycle.rule.yaml +34 -0
  154. package/rules/typescript/ts.react.no-missing-error-boundary.rule.yaml +36 -0
  155. package/rules/typescript/ts.react.no-positive-tabindex.rule.yaml +36 -0
  156. package/rules/typescript/ts.react.no-static-element-with-synthetic-handlers.rule.yaml +36 -0
  157. package/rules/typescript/ts.react.no-string-ref.rule.yaml +34 -0
  158. package/rules/typescript/ts.react.no-uncontrolled-to-controlled-input.rule.yaml +34 -0
  159. package/rules/typescript/ts.react.no-widget-role-without-tabindex.rule.yaml +36 -0
  160. package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +34 -0
  161. package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +35 -0
  162. package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +36 -0
  163. package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +36 -0
  164. package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +35 -0
  165. package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +35 -0
  166. package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +39 -0
  167. package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +36 -0
  168. package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +35 -0
  169. package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +35 -0
  170. package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +35 -0
  171. package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +35 -0
  172. package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +35 -0
  173. package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +35 -0
  174. package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +34 -0
  175. package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +35 -0
  176. package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +34 -0
  177. package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +38 -0
  178. package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +36 -0
  179. package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +35 -0
  180. package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +35 -0
  181. package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +36 -0
  182. package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +35 -0
  183. package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +35 -0
  184. package/rules/typescript/ts.security.log-injection.rule.yaml +36 -0
  185. package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +34 -0
  186. package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +35 -0
  187. package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +35 -0
  188. package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +36 -0
  189. package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +38 -0
  190. package/rules/typescript/ts.security.open-redirect.rule.yaml +2 -0
  191. package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +33 -0
  192. package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +1 -0
  193. package/rules/typescript/ts.security.ssrf.rule.yaml +1 -0
  194. package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +36 -0
  195. package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +36 -0
  196. package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +35 -0
  197. package/rules/typescript/ts.testing.no-flaky-timer-test.rule.yaml +38 -0
  198. package/rules/typescript/ts.testing.no-focused-test.rule.yaml +34 -0
  199. package/rules/typescript/ts.testing.no-missing-edge-case-tests.rule.yaml +35 -0
  200. package/rules/typescript/ts.testing.no-network-call-in-unit-test.rule.yaml +38 -0
  201. package/rules/typescript/ts.testing.no-skipped-test-without-ticket.rule.yaml +34 -0
  202. package/rules/typescript/ts.testing.no-snapshot-without-intent.rule.yaml +34 -0
  203. package/rules/typescript/ts.testing.no-test-only-code-in-production.rule.yaml +38 -0
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: py.testing.real-network-in-unit-test
5
+ title: Avoid live HTTP clients in Python unit tests
6
+ summary: requests/httpx/urllib calls in unit tests should be doubled or recorded.
7
+ rationale: Live HTTP couples CI to the network and slows feedback.
8
+ tags:
9
+ - testing
10
+ - python
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - python
17
+ match:
18
+ fact:
19
+ kind: py.testing.real-network-in-unit-test
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality.testing
24
+ severity: medium
25
+ confidence: 0.66
26
+ tags:
27
+ - testing
28
+ - python
29
+ message:
30
+ title: Mock outbound HTTP in `${captures.issue.text}`
31
+ summary: "`${captures.issue.text}` performs a live HTTP style call inside a test module."
32
+ remediation:
33
+ summary: Use responses/httpretty/pytest-httpserver or dependency-injected clients with fakes.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: py.testing.time-sleep-in-unit-test
5
+ title: Avoid time.sleep in Python unit tests
6
+ summary: Sleeping in tests slows suites and hides synchronization bugs.
7
+ rationale: Prefer deterministic waits, polling helpers, or clock fakes.
8
+ tags:
9
+ - testing
10
+ - python
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - python
17
+ match:
18
+ fact:
19
+ kind: py.testing.time-sleep-in-unit-test
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality.testing
24
+ severity: low
25
+ confidence: 0.6
26
+ tags:
27
+ - testing
28
+ - python
29
+ message:
30
+ title: Replace `time.sleep` in unit tests
31
+ summary: "`${captures.issue.text}` blocks on real wall-clock time inside a test module."
32
+ remediation:
33
+ summary: Inject a clock, shorten waits, or move timing-sensitive coverage to integration tests.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.performance.no-regex-construction-in-loop
5
+ title: Avoid no regex construction in loop
6
+ summary: Performance hygiene signal for ruby sources.
7
+ rationale: Performance hygiene signal for ruby sources.
8
+ tags:
9
+ - performance
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.performance.no-regex-construction-in-loop
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: performance.allocation
24
+ severity: medium
25
+ confidence: 0.66
26
+ tags:
27
+ - performance
28
+ - ruby
29
+ message:
30
+ title: Avoid no regex construction in loop in `ruby` code
31
+ summary: "`${captures.issue.text}` matches ruby.performance.no-regex-construction-in-loop."
32
+ remediation:
33
+ summary: Refactor this path to reduce avoidable runtime overhead.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.performance.no-sync-fs-in-request-path
5
+ title: Avoid no sync fs in request path
6
+ summary: Performance hygiene signal for ruby sources.
7
+ rationale: Performance hygiene signal for ruby sources.
8
+ tags:
9
+ - performance
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.performance.no-sync-fs-in-request-path
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: performance.io
24
+ severity: high
25
+ confidence: 0.66
26
+ tags:
27
+ - performance
28
+ - ruby
29
+ message:
30
+ title: Avoid no sync fs in request path in `ruby` code
31
+ summary: "`${captures.issue.text}` matches ruby.performance.no-sync-fs-in-request-path."
32
+ remediation:
33
+ summary: Refactor this path to reduce avoidable runtime overhead.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.performance.no-unbounded-concurrency
5
+ title: Avoid no unbounded concurrency
6
+ summary: Performance hygiene signal for ruby sources.
7
+ rationale: Performance hygiene signal for ruby sources.
8
+ tags:
9
+ - performance
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.performance.no-unbounded-concurrency
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: performance.async
24
+ severity: medium
25
+ confidence: 0.66
26
+ tags:
27
+ - performance
28
+ - ruby
29
+ message:
30
+ title: Avoid no unbounded concurrency in `ruby` code
31
+ summary: "`${captures.issue.text}` matches ruby.performance.no-unbounded-concurrency."
32
+ remediation:
33
+ summary: Refactor this path to reduce avoidable runtime overhead.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-csrf-disabled
5
+ title: Do not disable Rails CSRF protection on browser controllers
6
+ summary: >-
7
+ Browser-facing Rails controllers should keep forgery protection enabled with a safe strategy.
8
+ rationale: >-
9
+ Skipping CSRF verification or downgrading to `null_session` lets attackers replay cross-site requests against authenticated sessions.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - csrf
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: ruby.security.rails-csrf-disabled
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.session-management
34
+ severity: high
35
+ confidence: 0.82
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - rails
40
+ message:
41
+ title: Re-enable CSRF protections around `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` weakens or skips Rails CSRF defenses outside an API-only controller surface."
43
+ remediation:
44
+ summary: >-
45
+ Remove broad `skip_forgery_protection` usage, prefer `protect_from_forgery with: :exception`, and keep `verify_authenticity_token` enabled for state-changing browser actions.
@@ -0,0 +1,44 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-detailed-exceptions-enabled
5
+ title: Keep production Rails exception disclosure minimal
6
+ summary: >-
7
+ Production environments should not enable local-style exception pages or verbose Action Dispatch exception rendering.
8
+ rationale: >-
9
+ Detailed exceptions leak stack traces, secrets, and implementation details that attackers can use to refine exploits.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - misconfiguration
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/config/environments/production.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ match:
27
+ fact:
28
+ kind: ruby.security.rails-detailed-exceptions-enabled
29
+ bind: issue
30
+ emit:
31
+ finding:
32
+ category: security.misconfiguration
33
+ severity: medium
34
+ confidence: 0.9
35
+ tags:
36
+ - security
37
+ - ruby
38
+ - rails
39
+ message:
40
+ title: Disable verbose exceptions for `${captures.issue.text}`
41
+ summary: "`${captures.issue.text}` enables detailed exceptions or local request handling in the production environment file."
42
+ remediation:
43
+ summary: >-
44
+ Set `consider_all_requests_local` and `show_detailed_exceptions` to safe defaults, route errors through monitored handlers, and keep `config.action_dispatch.show_exceptions` off verbose modes in production.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-open-redirect
5
+ title: Avoid open redirects from request-controlled targets
6
+ summary: >-
7
+ Redirect helpers must not send users to hosts or paths derived directly from request input without validation.
8
+ rationale: >-
9
+ `redirect_to` and `redirect_back` calls that honor `params`, `request` URLs, or `allow_other_host: true` with tainted data are a common phishing and OAuth bypass vector.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - open-redirect
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: ruby.security.rails-open-redirect
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.url-redirection
34
+ severity: medium
35
+ confidence: 0.84
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - rails
40
+ message:
41
+ title: Validate redirect targets in `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` forwards users using request-derived data or cross-host redirects without a safe allowlist."
43
+ remediation:
44
+ summary: >-
45
+ Use an allowlisted path helper, reject off-host targets, and avoid pairing `allow_other_host: true` with user-controlled URLs.
@@ -0,0 +1,46 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-unsafe-html-output
5
+ title: Avoid unescaped HTML built from request or tainted data
6
+ summary: >-
7
+ Do not mark request-driven strings as HTML safe or bypass sanitization in views or helpers.
8
+ rationale: >-
9
+ `raw`, `html_safe`, `sanitize: false`, and ERB double-equals disable escaping and commonly become reflected XSS sinks.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - xss
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ - "**/*.erb"
25
+ exclude:
26
+ - "**/vendor/**"
27
+ - "**/node_modules/**"
28
+ match:
29
+ fact:
30
+ kind: ruby.security.rails-unsafe-html-output
31
+ bind: issue
32
+ emit:
33
+ finding:
34
+ category: security.output-encoding
35
+ severity: high
36
+ confidence: 0.86
37
+ tags:
38
+ - security
39
+ - ruby
40
+ - rails
41
+ message:
42
+ title: Encode or sanitize HTML instead of `${captures.issue.text}`
43
+ summary: "`${captures.issue.text}` mixes tainted or request data with helpers that disable Rails HTML escaping."
44
+ remediation:
45
+ summary: >-
46
+ Prefer default escaping, pass sanitized fragments, or centralize HTML generation through a vetted sanitizer instead of `raw`/`html_safe`.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-unsafe-render
5
+ title: Avoid rendering raw HTML or bodies from request input
6
+ summary: >-
7
+ `render` options such as `html:`, `plain:`, or `inline:` must not consume unvalidated request data.
8
+ rationale: >-
9
+ These render modes bypass templates and can reflect attacker-controlled markup or scripts when fed tainted strings.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - xss
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: ruby.security.rails-unsafe-render
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.output-encoding
34
+ severity: high
35
+ confidence: 0.83
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - rails
40
+ message:
41
+ title: Sanitize render payloads in `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` renders dynamic HTML or text modes using tainted or request-derived values."
43
+ remediation:
44
+ summary: >-
45
+ Prefer templates with escaping, sanitize any rich text, or map request identifiers to trusted server-side content instead of rendering raw params.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-unsafe-session-or-cookie-store
5
+ title: Do not store raw request params in session or cookies
6
+ summary: >-
7
+ Session and signed cookie stores should not persist raw `params` blobs that attackers can influence.
8
+ rationale: >-
9
+ Writing `params` directly into `session` or `cookies` enables tampering, fixation, and oversized payload attacks unless additional integrity controls exist.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - session
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: ruby.security.rails-unsafe-session-or-cookie-store
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.session-management
34
+ severity: medium
35
+ confidence: 0.85
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - rails
40
+ message:
41
+ title: Avoid persisting raw params in `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` assigns request `params` directly into session or cookie storage."
43
+ remediation:
44
+ summary: >-
45
+ Store opaque identifiers, use signed or encrypted cookie jars appropriately, and validate any user-derived values before persistence.
@@ -0,0 +1,46 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-unsafe-strong-parameters
5
+ title: Avoid unsafe Rails strong parameters and mass assignment
6
+ summary: >-
7
+ Strong parameters and mass assignment sinks should not accept unfiltered request hashes or privileged attributes.
8
+ rationale: >-
9
+ Permissive `permit!`, privileged `permit` fields, and direct `params` mass assignment enable attackers to escalate privileges or overwrite protected columns.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - mass-assignment
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ - "**/*.erb"
25
+ exclude:
26
+ - "**/vendor/**"
27
+ - "**/node_modules/**"
28
+ match:
29
+ fact:
30
+ kind: ruby.security.rails-unsafe-strong-parameters
31
+ bind: issue
32
+ emit:
33
+ finding:
34
+ category: security.authorization
35
+ severity: high
36
+ confidence: 0.88
37
+ tags:
38
+ - security
39
+ - ruby
40
+ - rails
41
+ message:
42
+ title: Fix unsafe parameter filtering in `${captures.issue.text}`
43
+ summary: "`${captures.issue.text}` permits privileged fields, uses `permit!`, or assigns raw `params` into a model."
44
+ remediation:
45
+ summary: >-
46
+ Replace `permit!` with an explicit attribute list, drop privileged symbols from `permit`, and route updates through vetted strong-parameter helpers instead of raw `params`.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.sensitive-data-egress
5
+ title: Avoid relaying request-controlled data through outbound Ruby HTTP clients
6
+ summary: >-
7
+ Outbound HTTP helpers should not receive URLs or bodies directly from `params` or other tainted sources without validation.
8
+ rationale: >-
9
+ User-controlled egress enables SSRF, data exfiltration, and token theft when combined with open HTTP clients.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - privacy
14
+ - egress
15
+ - rules-catalog
16
+ stability: experimental
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: security.sensitive-data-egress
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.privacy
34
+ severity: high
35
+ confidence: 0.8
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - privacy
40
+ message:
41
+ title: Validate outbound HTTP data in `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` forwards tainted values into an outbound HTTP client."
43
+ remediation:
44
+ summary: >-
45
+ Allowlist hosts, strip secrets from outbound payloads, and route external calls through audited integration points.
@@ -0,0 +1,45 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.sidekiq-web-unauthenticated-mount
5
+ title: Protect Sidekiq::Web mounts with authentication
6
+ summary: >-
7
+ Sidekiq Web must not be exposed on public routes without an authentication or network guard.
8
+ rationale: >-
9
+ Unauthenticated Sidekiq Web consoles expose queues and often lead to remote code execution via job replay or configuration changes.
10
+ tags:
11
+ - security
12
+ - ruby
13
+ - rails
14
+ - sidekiq
15
+ - rules-catalog
16
+ stability: stable
17
+ appliesTo: block
18
+ scope:
19
+ languages:
20
+ - ruby
21
+ paths:
22
+ include:
23
+ - "**/*.rb"
24
+ exclude:
25
+ - "**/vendor/**"
26
+ - "**/node_modules/**"
27
+ match:
28
+ fact:
29
+ kind: ruby.security.sidekiq-web-unauthenticated-mount
30
+ bind: issue
31
+ emit:
32
+ finding:
33
+ category: security.authorization
34
+ severity: high
35
+ confidence: 0.8
36
+ tags:
37
+ - security
38
+ - ruby
39
+ - sidekiq
40
+ message:
41
+ title: Authenticate Sidekiq Web before `${captures.issue.text}`
42
+ summary: "`${captures.issue.text}` mounts the Sidekiq console without a visible authentication or constraint guard."
43
+ remediation:
44
+ summary: >-
45
+ Wrap mounts in `authenticate`, add route constraints, use basic auth or VPN-only routing, and keep consoles off public networks.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.testing.focused-example
5
+ title: Remove focused RSpec examples before merge
6
+ summary: fit and fdescribe skip the rest of the suite and should not ship.
7
+ rationale: Focused examples hide failures in sibling specs.
8
+ tags:
9
+ - testing
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.testing.focused-example
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality.testing
24
+ severity: medium
25
+ confidence: 0.85
26
+ tags:
27
+ - testing
28
+ - ruby
29
+ message:
30
+ title: Remove focused RSpec call `${captures.issue.text}`
31
+ summary: "`${captures.issue.text}` runs only the focused block and skips other examples."
32
+ remediation:
33
+ summary: Delete `fit` / `fdescribe` usage and rely on the full spec suite in CI.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.testing.pending-without-ticket-reference
5
+ title: pending examples should cite a ticket
6
+ summary: pending without a tracker reference is easy to forget.
7
+ rationale: Pending specs should carry reviewable intent like skips elsewhere.
8
+ tags:
9
+ - testing
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.testing.pending-without-ticket-reference
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality.testing
24
+ severity: low
25
+ confidence: 0.6
26
+ tags:
27
+ - testing
28
+ - ruby
29
+ message:
30
+ title: Add a ticket reference to `${captures.issue.text}`
31
+ summary: "`pending` is used without an adjacent issue key or accepted suppression comment."
32
+ remediation:
33
+ summary: Link pending work to a tracker id or convert to a skip with reason.
@@ -0,0 +1,33 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.testing.real-network-in-unit-test
5
+ title: Avoid live HTTP clients in Ruby unit tests
6
+ summary: Net::HTTP, Faraday, or HTTParty usage in specs should be doubled or recorded.
7
+ rationale: Live HTTP couples CI to the network.
8
+ tags:
9
+ - testing
10
+ - ruby
11
+ - rules-catalog
12
+ stability: experimental
13
+ appliesTo: block
14
+ scope:
15
+ languages:
16
+ - ruby
17
+ match:
18
+ fact:
19
+ kind: ruby.testing.real-network-in-unit-test
20
+ bind: issue
21
+ emit:
22
+ finding:
23
+ category: quality.testing
24
+ severity: medium
25
+ confidence: 0.64
26
+ tags:
27
+ - testing
28
+ - ruby
29
+ message:
30
+ title: Stub outbound HTTP in `${captures.issue.text}`
31
+ summary: "`${captures.issue.text}` references a live HTTP client inside a spec-like path."
32
+ remediation:
33
+ summary: Use WebMock/VCR or dependency-injected doubles instead of live calls.