@critiq/rules 0.2.0 → 0.3.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 (199) hide show
  1. package/README.md +3 -2
  2. package/catalog.yaml +798 -0
  3. package/package.json +1 -1
  4. package/rules/cfn/cfn.correctness.attributedefinitions-keyschemas-mismatch.rule.yaml +49 -0
  5. package/rules/cfn/cfn.correctness.base64-validation-of-parameters.rule.yaml +49 -0
  6. package/rules/cfn/cfn.correctness.basic-cloudformation-resource-check.rule.yaml +49 -0
  7. package/rules/cfn/cfn.correctness.basic-cloudformation-template-configuration.rule.yaml +49 -0
  8. package/rules/cfn/cfn.correctness.cannot-reference-resources-in-the-conditions-block-of-the-template.rule.yaml +49 -0
  9. package/rules/cfn/cfn.correctness.check-at-least-one-essential-container-is-specified.rule.yaml +49 -0
  10. package/rules/cfn/cfn.correctness.check-deletionpolicy-values-for-resources.rule.yaml +49 -0
  11. package/rules/cfn/cfn.correctness.check-dependson-values-for-resources.rule.yaml +49 -0
  12. package/rules/cfn/cfn.correctness.check-ec2-ebs-properties.rule.yaml +49 -0
  13. package/rules/cfn/cfn.correctness.check-elastic-cache-redis-cluster-settings.rule.yaml +49 -0
  14. package/rules/cfn/cfn.correctness.check-events-rule-targets-are-less-than-or-equal-to-5.rule.yaml +49 -0
  15. package/rules/cfn/cfn.correctness.check-fargate-service-scheduling-strategy.rule.yaml +49 -0
  16. package/rules/cfn/cfn.correctness.check-fn-and-structure-for-validity.rule.yaml +49 -0
  17. package/rules/cfn/cfn.correctness.check-fn-equals-structure-for-validity.rule.yaml +49 -0
  18. package/rules/cfn/cfn.correctness.check-fn-if-structure-for-validity.rule.yaml +49 -0
  19. package/rules/cfn/cfn.correctness.check-fn-not-structure-for-validity.rule.yaml +49 -0
  20. package/rules/cfn/cfn.correctness.check-fn-or-structure-for-validity.rule.yaml +49 -0
  21. package/rules/cfn/cfn.correctness.check-for-subscriptionfilters-have-beyond-2-attachments-to-a-cloudwatch-log-group.rule.yaml +49 -0
  22. package/rules/cfn/cfn.correctness.check-if-a-json-object-is-within-size-limits.rule.yaml +49 -0
  23. package/rules/cfn/cfn.correctness.check-if-a-list-has-between-min-and-max-number-of-values-specified.rule.yaml +49 -0
  24. package/rules/cfn/cfn.correctness.check-if-a-list-has-duplicate-values.rule.yaml +49 -0
  25. package/rules/cfn/cfn.correctness.check-if-a-number-is-between-min-and-max.rule.yaml +49 -0
  26. package/rules/cfn/cfn.correctness.check-if-a-string-has-between-min-and-max-number-of-values-specified.rule.yaml +49 -0
  27. package/rules/cfn/cfn.correctness.check-if-eol-lambda-function-runtimes-are-used.rule.yaml +49 -0
  28. package/rules/cfn/cfn.correctness.check-if-properties-have-a-valid-value.rule.yaml +49 -0
  29. package/rules/cfn/cfn.correctness.check-if-property-values-adhere-to-a-specific-pattern.rule.yaml +49 -0
  30. package/rules/cfn/cfn.correctness.check-if-refing-to-a-iam-resource-with-path-set.rule.yaml +49 -0
  31. package/rules/cfn/cfn.correctness.check-if-refs-exist.rule.yaml +49 -0
  32. package/rules/cfn/cfn.correctness.check-if-serverless-resources-have-serverless-transform.rule.yaml +49 -0
  33. package/rules/cfn/cfn.correctness.check-if-the-referenced-conditions-are-defined.rule.yaml +49 -0
  34. package/rules/cfn/cfn.correctness.check-minimum-90-period-is-met-between-backupplan-cold-and-delete.rule.yaml +49 -0
  35. package/rules/cfn/cfn.correctness.check-properties-that-are-mutually-exclusive.rule.yaml +49 -0
  36. package/rules/cfn/cfn.correctness.check-properties-that-are-required-together.rule.yaml +49 -0
  37. package/rules/cfn/cfn.correctness.check-properties-that-need-at-least-one-of-a-list-of-properties.rule.yaml +49 -0
  38. package/rules/cfn/cfn.correctness.check-properties-that-need-only-one-of-a-list-of-properties.rule.yaml +49 -0
  39. package/rules/cfn/cfn.correctness.check-resource-properties-values.rule.yaml +49 -0
  40. package/rules/cfn/cfn.correctness.check-state-machine-definition-for-proper-syntax.rule.yaml +49 -0
  41. package/rules/cfn/cfn.correctness.check-that-modules-resources-are-valid.rule.yaml +49 -0
  42. package/rules/cfn/cfn.correctness.check-the-configuration-of-a-resources-updatepolicy.rule.yaml +49 -0
  43. package/rules/cfn/cfn.correctness.check-updatereplacepolicy-values-for-resources.rule.yaml +49 -0
  44. package/rules/cfn/cfn.correctness.check-values-of-properties-for-valid-refs-and-getatts.rule.yaml +49 -0
  45. package/rules/cfn/cfn.correctness.cidr-validation-of-parameters.rule.yaml +49 -0
  46. package/rules/cfn/cfn.correctness.cloudfront-aliases.rule.yaml +49 -0
  47. package/rules/cfn/cfn.correctness.codepipeline-stage-actions.rule.yaml +49 -0
  48. package/rules/cfn/cfn.correctness.codepipeline-stages.rule.yaml +49 -0
  49. package/rules/cfn/cfn.correctness.conditions-have-appropriate-properties.rule.yaml +49 -0
  50. package/rules/cfn/cfn.correctness.default-value-cannot-use-refs.rule.yaml +49 -0
  51. package/rules/cfn/cfn.correctness.default-value-is-within-parameter-constraints.rule.yaml +49 -0
  52. package/rules/cfn/cfn.correctness.error-processing-rule-on-the-template.rule.yaml +49 -0
  53. package/rules/cfn/cfn.correctness.findinmap-validation-of-configuration.rule.yaml +49 -0
  54. package/rules/cfn/cfn.correctness.getatt-validation-of-parameters.rule.yaml +49 -0
  55. package/rules/cfn/cfn.correctness.getaz-validation-of-parameters.rule.yaml +49 -0
  56. package/rules/cfn/cfn.correctness.importvalue-validation-of-parameters.rule.yaml +49 -0
  57. package/rules/cfn/cfn.correctness.join-validation-of-parameters.rule.yaml +49 -0
  58. package/rules/cfn/cfn.correctness.length-validation-of-parameters.rule.yaml +49 -0
  59. package/rules/cfn/cfn.correctness.mapping-attribute-limit-not-exceeded.rule.yaml +49 -0
  60. package/rules/cfn/cfn.correctness.mapping-keys-are-strings-and-alphanumeric.rule.yaml +49 -0
  61. package/rules/cfn/cfn.correctness.mapping-limit-not-exceeded.rule.yaml +49 -0
  62. package/rules/cfn/cfn.correctness.mapping-name-limit-not-exceeded.rule.yaml +49 -0
  63. package/rules/cfn/cfn.correctness.mappings-are-appropriately-configured.rule.yaml +49 -0
  64. package/rules/cfn/cfn.correctness.mappings-have-appropriate-names.rule.yaml +49 -0
  65. package/rules/cfn/cfn.correctness.metadata-interface-have-appropriate-properties.rule.yaml +49 -0
  66. package/rules/cfn/cfn.correctness.output-description-limit-not-exceeded.rule.yaml +49 -0
  67. package/rules/cfn/cfn.correctness.output-limit-not-exceeded.rule.yaml +49 -0
  68. package/rules/cfn/cfn.correctness.output-name-limit-not-exceeded.rule.yaml +49 -0
  69. package/rules/cfn/cfn.correctness.outputs-descriptions-can-only-be-strings.rule.yaml +49 -0
  70. package/rules/cfn/cfn.correctness.outputs-have-appropriate-names.rule.yaml +49 -0
  71. package/rules/cfn/cfn.correctness.outputs-have-appropriate-properties.rule.yaml +49 -0
  72. package/rules/cfn/cfn.correctness.outputs-have-required-properties.rule.yaml +49 -0
  73. package/rules/cfn/cfn.correctness.outputs-have-values-of-strings.rule.yaml +49 -0
  74. package/rules/cfn/cfn.correctness.parameter-limit-not-exceeded.rule.yaml +49 -0
  75. package/rules/cfn/cfn.correctness.parameter-name-limit-not-exceeded.rule.yaml +49 -0
  76. package/rules/cfn/cfn.correctness.parameter-value-limit-not-exceeded.rule.yaml +49 -0
  77. package/rules/cfn/cfn.correctness.parameters-have-appropriate-names.rule.yaml +49 -0
  78. package/rules/cfn/cfn.correctness.parameters-have-appropriate-properties.rule.yaml +49 -0
  79. package/rules/cfn/cfn.correctness.parameters-have-appropriate-type.rule.yaml +49 -0
  80. package/rules/cfn/cfn.correctness.property-is-required-based-on-another-properties-value.rule.yaml +49 -0
  81. package/rules/cfn/cfn.correctness.property-is-unwanted-based-on-another-properties-value.rule.yaml +49 -0
  82. package/rules/cfn/cfn.correctness.rds-instance-type-is-compatible-with-the-rds-type.rule.yaml +49 -0
  83. package/rules/cfn/cfn.correctness.recordset-hostedzonename-is-a-superdomain-of-name.rule.yaml +49 -0
  84. package/rules/cfn/cfn.correctness.ref-validation-of-value.rule.yaml +49 -0
  85. package/rules/cfn/cfn.correctness.required-resource-properties-are-missing.rule.yaml +49 -0
  86. package/rules/cfn/cfn.correctness.resource-dependencies-are-not-circular.rule.yaml +49 -0
  87. package/rules/cfn/cfn.correctness.resource-ec2-security-group-ingress-properties.rule.yaml +49 -0
  88. package/rules/cfn/cfn.correctness.resource-elb-properties.rule.yaml +49 -0
  89. package/rules/cfn/cfn.correctness.resource-limit-not-exceeded.rule.yaml +49 -0
  90. package/rules/cfn/cfn.correctness.resource-name-limit-not-exceeded.rule.yaml +49 -0
  91. package/rules/cfn/cfn.correctness.resource-properties-are-invalid.rule.yaml +49 -0
  92. package/rules/cfn/cfn.correctness.resource-schema.rule.yaml +49 -0
  93. package/rules/cfn/cfn.correctness.resource-subnetroutetableassociation-properties.rule.yaml +49 -0
  94. package/rules/cfn/cfn.correctness.resources-have-appropriate-names.rule.yaml +49 -0
  95. package/rules/cfn/cfn.correctness.select-validation-of-parameters.rule.yaml +49 -0
  96. package/rules/cfn/cfn.correctness.snapstart-supports-the-configured-runtime.rule.yaml +49 -0
  97. package/rules/cfn/cfn.correctness.split-validation-of-parameters.rule.yaml +49 -0
  98. package/rules/cfn/cfn.correctness.sub-is-required-if-a-variable-is-used-in-a-string.rule.yaml +49 -0
  99. package/rules/cfn/cfn.correctness.sub-validation-of-parameters.rule.yaml +49 -0
  100. package/rules/cfn/cfn.correctness.template-description-can-only-be-a-string.rule.yaml +49 -0
  101. package/rules/cfn/cfn.correctness.template-description-limit.rule.yaml +49 -0
  102. package/rules/cfn/cfn.correctness.template-size-limit.rule.yaml +49 -0
  103. package/rules/cfn/cfn.correctness.tojsonstring-validation-of-parameters.rule.yaml +49 -0
  104. package/rules/cfn/cfn.correctness.unique-resource-and-parameter-names.rule.yaml +49 -0
  105. package/rules/cfn/cfn.correctness.validate-accesscontrol-are-set-with-ownershipcontrols.rule.yaml +49 -0
  106. package/rules/cfn/cfn.correctness.validate-aws-event-scheduleexpression-format.rule.yaml +49 -0
  107. package/rules/cfn/cfn.correctness.validate-parameters-for-in-a-nested-stack.rule.yaml +49 -0
  108. package/rules/cfn/cfn.correctness.validate-route53-recordsets.rule.yaml +49 -0
  109. package/rules/cfn/cfn.correctness.validate-the-configuration-of-the-metadata-section.rule.yaml +49 -0
  110. package/rules/cfn/cfn.correctness.validates-foreach-functions.rule.yaml +49 -0
  111. package/rules/cfn/cfn.correctness.validation-not-function-configuration.rule.yaml +49 -0
  112. package/rules/cfn/cfn.correctness.validationdomain-is-superdomain-of-domainname.rule.yaml +49 -0
  113. package/rules/cfn/cfn.maintainability.arns-should-use-correctly-placed-pseudo-parameters.rule.yaml +49 -0
  114. package/rules/cfn/cfn.maintainability.availability-zone-parameters-should-not-be-hardcoded.rule.yaml +49 -0
  115. package/rules/cfn/cfn.maintainability.check-iam-resource-policies-syntax.rule.yaml +49 -0
  116. package/rules/cfn/cfn.maintainability.check-if-a-list-that-allows-duplicates-has-any-duplicates.rule.yaml +49 -0
  117. package/rules/cfn/cfn.maintainability.check-if-conditions-are-used.rule.yaml +49 -0
  118. package/rules/cfn/cfn.maintainability.check-if-eol-lambda-function-runtimes-are-used-w2531.rule.yaml +49 -0
  119. package/rules/cfn/cfn.maintainability.check-if-imageid-parameters-have-the-correct-type.rule.yaml +49 -0
  120. package/rules/cfn/cfn.maintainability.check-if-mappings-are-used.rule.yaml +49 -0
  121. package/rules/cfn/cfn.maintainability.check-if-parameters-are-used.rule.yaml +49 -0
  122. package/rules/cfn/cfn.maintainability.check-if-parameters-have-a-valid-value-based-on-an-allowed-pattern.rule.yaml +49 -0
  123. package/rules/cfn/cfn.maintainability.check-if-parameters-have-a-valid-value.rule.yaml +49 -0
  124. package/rules/cfn/cfn.maintainability.check-obsolete-dependson-configuration-for-resources.rule.yaml +49 -0
  125. package/rules/cfn/cfn.maintainability.check-outputs-using-importvalue.rule.yaml +49 -0
  126. package/rules/cfn/cfn.maintainability.check-required-properties-for-lambda-if-the-deployment-package-is-a-zip-file.rule.yaml +49 -0
  127. package/rules/cfn/cfn.maintainability.check-resources-with-auto-expiring-content-have-explicit-retention-period.rule.yaml +49 -0
  128. package/rules/cfn/cfn.maintainability.check-resources-with-updatereplacepolicy-deletionpolicy-have-both.rule.yaml +49 -0
  129. package/rules/cfn/cfn.maintainability.check-stateful-resources-have-a-set-updatereplacepolicy-deletionpolicy.rule.yaml +49 -0
  130. package/rules/cfn/cfn.maintainability.checks-for-legacy-instance-type-generations.rule.yaml +49 -0
  131. package/rules/cfn/cfn.maintainability.findinmap-keys-exist-in-the-map.rule.yaml +49 -0
  132. package/rules/cfn/cfn.maintainability.fn-equals-will-always-return-true-or-false.rule.yaml +49 -0
  133. package/rules/cfn/cfn.maintainability.mapping-attribute-limit.rule.yaml +49 -0
  134. package/rules/cfn/cfn.maintainability.mapping-limit.rule.yaml +49 -0
  135. package/rules/cfn/cfn.maintainability.mapping-name-limit.rule.yaml +49 -0
  136. package/rules/cfn/cfn.maintainability.metadata-interface-parameters-exist.rule.yaml +49 -0
  137. package/rules/cfn/cfn.maintainability.output-description-limit.rule.yaml +49 -0
  138. package/rules/cfn/cfn.maintainability.output-limit.rule.yaml +49 -0
  139. package/rules/cfn/cfn.maintainability.output-name-limit.rule.yaml +49 -0
  140. package/rules/cfn/cfn.maintainability.parameter-limit.rule.yaml +49 -0
  141. package/rules/cfn/cfn.maintainability.parameter-memory-size-attributes-should-have-max-and-min.rule.yaml +49 -0
  142. package/rules/cfn/cfn.maintainability.parameter-name-limit.rule.yaml +49 -0
  143. package/rules/cfn/cfn.maintainability.parameter-value-limit.rule.yaml +49 -0
  144. package/rules/cfn/cfn.maintainability.ref-getatt-to-resource-that-is-available-when-conditions-are-applied.rule.yaml +49 -0
  145. package/rules/cfn/cfn.maintainability.resource-limit.rule.yaml +49 -0
  146. package/rules/cfn/cfn.maintainability.resource-name-limit.rule.yaml +49 -0
  147. package/rules/cfn/cfn.maintainability.sub-isn-t-needed-if-it-doesn-t-have-a-variable-defined.rule.yaml +49 -0
  148. package/rules/cfn/cfn.maintainability.sub-validation-of-parameters-w1019.rule.yaml +49 -0
  149. package/rules/cfn/cfn.maintainability.template-description-limit-i1003.rule.yaml +49 -0
  150. package/rules/cfn/cfn.maintainability.template-size-limit-i1002.rule.yaml +49 -0
  151. package/rules/cfn/cfn.maintainability.use-sub-instead-of-join.rule.yaml +49 -0
  152. package/rules/cfn/cfn.maintainability.validate-that-snapstart-is-configured-for-java11-runtimes.rule.yaml +49 -0
  153. package/rules/cfn/cfn.maintainability.validate-that-snapstart-is-properly-configured.rule.yaml +49 -0
  154. package/rules/cfn/cfn.maintainability.warn-when-properties-are-configured-to-only-work-with-the-package-command.rule.yaml +49 -0
  155. package/rules/cfn/cfn.security.check-dynamic-references-secure-strings-are-in-supported-locations.rule.yaml +53 -0
  156. package/rules/cfn/cfn.security.check-for-noecho-references.rule.yaml +53 -0
  157. package/rules/cfn/cfn.security.check-iam-permission-configuration.rule.yaml +53 -0
  158. package/rules/cfn/cfn.security.check-if-iam-policies-are-properly-configured.rule.yaml +53 -0
  159. package/rules/cfn/cfn.security.check-if-password-properties-are-correctly-configured.rule.yaml +53 -0
  160. package/rules/cfn/cfn.security.controlling-access-to-an-s3-bucket-should-be-done-with-bucket-policies.rule.yaml +53 -0
  161. package/rules/php/php.correctness.abstract-method-outside-abstract-class.rule.yaml +36 -0
  162. package/rules/php/php.correctness.break-continue-outside-loop.rule.yaml +36 -0
  163. package/rules/php/php.correctness.case-insensitive-define.rule.yaml +36 -0
  164. package/rules/php/php.correctness.default-parameter-not-last.rule.yaml +36 -0
  165. package/rules/php/php.correctness.deprecated-filter-constant.rule.yaml +36 -0
  166. package/rules/php/php.correctness.deprecated-libxml-entity-loader.rule.yaml +36 -0
  167. package/rules/php/php.correctness.deprecated-unset-cast.rule.yaml +36 -0
  168. package/rules/php/php.correctness.duplicate-declaration.rule.yaml +36 -0
  169. package/rules/php/php.correctness.empty-array-literal-slot.rule.yaml +36 -0
  170. package/rules/php/php.correctness.empty-bracket-array-access.rule.yaml +36 -0
  171. package/rules/php/php.correctness.empty-code-block.rule.yaml +36 -0
  172. package/rules/php/php.correctness.empty-function-body.rule.yaml +36 -0
  173. package/rules/php/php.correctness.function-comparison.rule.yaml +36 -0
  174. package/rules/php/php.correctness.invalid-cookie-options.rule.yaml +36 -0
  175. package/rules/php/php.correctness.invalid-regex-literal.rule.yaml +36 -0
  176. package/rules/php/php.correctness.missing-member-visibility.rule.yaml +36 -0
  177. package/rules/php/php.correctness.nested-function-declaration.rule.yaml +36 -0
  178. package/rules/php/php.correctness.nested-switch.rule.yaml +36 -0
  179. package/rules/php/php.correctness.redundant-string-cast-concat.rule.yaml +36 -0
  180. package/rules/php/php.correctness.self-assignment.rule.yaml +36 -0
  181. package/rules/php/php.correctness.todo-fixme-marker.rule.yaml +36 -0
  182. package/rules/php/php.correctness.unknown-magic-method.rule.yaml +36 -0
  183. package/rules/php/php.correctness.useless-post-increment.rule.yaml +36 -0
  184. package/rules/php/php.correctness.useless-unset.rule.yaml +36 -0
  185. package/rules/php/php.performance.expensive-loop-condition.rule.yaml +36 -0
  186. package/rules/php/php.security.unsafe-new-static.rule.yaml +42 -0
  187. package/rules/ruby/ruby.bug-risk.assignment-in-condition.rule.yaml +42 -0
  188. package/rules/ruby/ruby.bug-risk.deprecated-uri-escape.rule.yaml +42 -0
  189. package/rules/ruby/ruby.bug-risk.division-by-zero.rule.yaml +42 -0
  190. package/rules/ruby/ruby.bug-risk.duplicate-hash-keys.rule.yaml +42 -0
  191. package/rules/ruby/ruby.bug-risk.exception-class-overwritten.rule.yaml +42 -0
  192. package/rules/ruby/ruby.bug-risk.raw-sql-without-squish.rule.yaml +42 -0
  193. package/rules/ruby/ruby.security.debugger-call.rule.yaml +53 -0
  194. package/rules/ruby/ruby.security.dynamic-code-execution.rule.yaml +54 -0
  195. package/rules/ruby/ruby.security.insecure-json-load.rule.yaml +53 -0
  196. package/rules/ruby/ruby.security.kernel-open.rule.yaml +53 -0
  197. package/rules/ruby/ruby.security.plaintext-password-in-callback.rule.yaml +46 -0
  198. package/rules/ruby/ruby.security.rails-link-to-blank-without-noopener.rule.yaml +48 -0
  199. package/rules/ruby/ruby.security.rails-output-unsafe.rule.yaml +47 -0
@@ -0,0 +1,42 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.bug-risk.raw-sql-without-squish
5
+ title: Squish heredoc SQL passed to where
6
+ summary: >-
7
+ Normalize heredoc SQL with squish before passing to where or find_by_sql.
8
+ rationale: >-
9
+ Unsquished heredoc SQL preserves accidental whitespace and hurts readability.
10
+ detection:
11
+ kind: pattern
12
+ tags:
13
+ - rules-catalog
14
+ - ruby
15
+ stability: stable
16
+ appliesTo: block
17
+ scope:
18
+ languages:
19
+ - ruby
20
+ paths:
21
+ include:
22
+ - "**/*.rb"
23
+ exclude:
24
+ - "**/vendor/**"
25
+ - "**/node_modules/**"
26
+ match:
27
+ fact:
28
+ kind: ruby.bug-risk.raw-sql-without-squish
29
+ bind: issue
30
+ emit:
31
+ finding:
32
+ category: correctness.language
33
+ severity: low
34
+ confidence: 0.9
35
+ tags:
36
+ - ruby
37
+ message:
38
+ title: Review `${captures.issue.text}`
39
+ summary: "`${captures.issue.text}` matches `ruby.bug-risk.raw-sql-without-squish`."
40
+ remediation:
41
+ summary: >-
42
+ Normalize heredoc SQL with squish before passing to where or find_by_sql.
@@ -0,0 +1,53 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.debugger-call
5
+ title: Remove debugger calls from application code
6
+ summary: >-
7
+ Debugger breakpoints must not ship in non-test Ruby sources.
8
+ rationale: >-
9
+ Leftover `debugger`, `byebug`, or `binding.break` calls pause production workers and can expose live request state.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-489
15
+ title: Active Debug Code
16
+ tags:
17
+ - security
18
+ - ruby
19
+ - debug
20
+ - rules-catalog
21
+ stability: stable
22
+ appliesTo: block
23
+ scope:
24
+ languages:
25
+ - ruby
26
+ paths:
27
+ include:
28
+ - "**/*.rb"
29
+ exclude:
30
+ - "**/vendor/**"
31
+ - "**/node_modules/**"
32
+ - "**/spec/**"
33
+ - "**/test/**"
34
+ - "**/tests/**"
35
+ match:
36
+ fact:
37
+ kind: ruby.security.debugger-call
38
+ bind: issue
39
+ emit:
40
+ finding:
41
+ category: security.debug-exposure
42
+ severity: medium
43
+ confidence: 0.92
44
+ tags:
45
+ - security
46
+ - ruby
47
+ - debug
48
+ message:
49
+ title: Remove debugger call in `${captures.issue.text}`
50
+ summary: "`${captures.issue.text}` leaves an interactive debugger breakpoint in application code."
51
+ remediation:
52
+ summary: >-
53
+ Delete debugger statements before merge or gate them behind development-only configuration.
@@ -0,0 +1,54 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.dynamic-code-execution
5
+ title: Avoid dynamic Ruby code execution
6
+ summary: >-
7
+ Do not execute runtime-generated Ruby via eval, exec, or *_eval helpers.
8
+ rationale: >-
9
+ Dynamic execution turns untrusted or mutable input into executable code and expands injection risk.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-94
15
+ title: Improper Control of Generation of Code
16
+ - kind: owasp
17
+ title: Code Injection
18
+ url: https://owasp.org/www-community/attacks/Code_Injection
19
+ tags:
20
+ - security
21
+ - ruby
22
+ - execution
23
+ - injection
24
+ - rules-catalog
25
+ stability: stable
26
+ appliesTo: block
27
+ scope:
28
+ languages:
29
+ - ruby
30
+ paths:
31
+ include:
32
+ - "**/*.rb"
33
+ exclude:
34
+ - "**/vendor/**"
35
+ - "**/node_modules/**"
36
+ match:
37
+ fact:
38
+ kind: ruby.security.dynamic-code-execution
39
+ bind: issue
40
+ emit:
41
+ finding:
42
+ category: security.execution
43
+ severity: high
44
+ confidence: 0.94
45
+ tags:
46
+ - security
47
+ - ruby
48
+ - execution
49
+ message:
50
+ title: Remove dynamic execution in `${captures.issue.text}`
51
+ summary: "`${captures.issue.text}` executes Ruby code dynamically."
52
+ remediation:
53
+ summary: >-
54
+ Replace eval and *_eval calls with explicit parsing, allowlisted dispatch, or data structures that do not execute code.
@@ -0,0 +1,53 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.insecure-json-load
5
+ title: Avoid insecure JSON load helpers
6
+ summary: >-
7
+ Prefer `JSON.parse` over `JSON.load`, `JSON.restore`, or permissive Oj/MultiJson loaders.
8
+ rationale: >-
9
+ Load-style JSON APIs can deserialize arbitrary Ruby types and expand deserialization gadget risk.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-502
15
+ title: Deserialization of Untrusted Data
16
+ - kind: owasp
17
+ title: Deserialization Cheat Sheet
18
+ url: https://cheatsheetseries.owasp.org/cheatsheets/Deserialization_Cheat_Sheet.html
19
+ tags:
20
+ - security
21
+ - ruby
22
+ - deserialization
23
+ - rules-catalog
24
+ stability: stable
25
+ appliesTo: block
26
+ scope:
27
+ languages:
28
+ - ruby
29
+ paths:
30
+ include:
31
+ - "**/*.rb"
32
+ exclude:
33
+ - "**/vendor/**"
34
+ - "**/node_modules/**"
35
+ match:
36
+ fact:
37
+ kind: ruby.security.insecure-json-load
38
+ bind: issue
39
+ emit:
40
+ finding:
41
+ category: security.deserialization
42
+ severity: high
43
+ confidence: 0.9
44
+ tags:
45
+ - security
46
+ - ruby
47
+ - deserialization
48
+ message:
49
+ title: Use safe JSON parsing in `${captures.issue.text}`
50
+ summary: "`${captures.issue.text}` uses a JSON loader that can deserialize unsafe Ruby objects."
51
+ remediation:
52
+ summary: >-
53
+ Parse JSON with `JSON.parse` and validate the resulting structure; avoid `JSON.load`, `JSON.restore`, and default `Oj.load` on untrusted input.
@@ -0,0 +1,53 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.kernel-open
5
+ title: Avoid Kernel.open pipe mode
6
+ summary: >-
7
+ Do not use `Kernel.open` with a leading pipe, which spawns a shell command.
8
+ rationale: >-
9
+ Pipe-mode `open` delegates to the shell and enables command injection when the argument is influenced by users.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-78
15
+ title: Improper Neutralization of Special Elements used in an OS Command
16
+ - kind: owasp
17
+ title: Command Injection
18
+ url: https://owasp.org/www-community/attacks/Command_Injection
19
+ tags:
20
+ - security
21
+ - ruby
22
+ - command-execution
23
+ - rules-catalog
24
+ stability: stable
25
+ appliesTo: block
26
+ scope:
27
+ languages:
28
+ - ruby
29
+ paths:
30
+ include:
31
+ - "**/*.rb"
32
+ exclude:
33
+ - "**/vendor/**"
34
+ - "**/node_modules/**"
35
+ match:
36
+ fact:
37
+ kind: ruby.security.kernel-open
38
+ bind: issue
39
+ emit:
40
+ finding:
41
+ category: security.command-execution
42
+ severity: critical
43
+ confidence: 0.95
44
+ tags:
45
+ - security
46
+ - ruby
47
+ - command-execution
48
+ message:
49
+ title: Replace pipe-mode open in `${captures.issue.text}`
50
+ summary: "`${captures.issue.text}` uses `Kernel.open` pipe mode, which can execute shell commands."
51
+ remediation:
52
+ summary: >-
53
+ Use `IO.popen` only with a fixed argv array, `Open3` with explicit command arrays, or file APIs that do not invoke a shell.
@@ -0,0 +1,46 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.plaintext-password-in-callback
5
+ title: Avoid plaintext passwords in HTTP basic auth
6
+ summary: >-
7
+ Do not pass literal passwords to http_basic_authenticate_with.
8
+ rationale: >-
9
+ Hard-coded basic-auth passwords leak when source is exposed.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-798
15
+ title: Use of Hard-coded Credentials
16
+ tags:
17
+ - rules-catalog
18
+ - ruby
19
+ stability: stable
20
+ appliesTo: block
21
+ scope:
22
+ languages:
23
+ - ruby
24
+ paths:
25
+ include:
26
+ - "**/*.rb"
27
+ exclude:
28
+ - "**/vendor/**"
29
+ - "**/node_modules/**"
30
+ match:
31
+ fact:
32
+ kind: ruby.security.plaintext-password-in-callback
33
+ bind: issue
34
+ emit:
35
+ finding:
36
+ category: security.credentials
37
+ severity: high
38
+ confidence: 0.9
39
+ tags:
40
+ - ruby
41
+ message:
42
+ title: Review `${captures.issue.text}`
43
+ summary: "`${captures.issue.text}` matches `ruby.security.plaintext-password-in-callback`."
44
+ remediation:
45
+ summary: >-
46
+ Do not pass literal passwords to http_basic_authenticate_with.
@@ -0,0 +1,48 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-link-to-blank-without-noopener
5
+ title: Add rel noopener to link_to with target _blank
6
+ summary: >-
7
+ External links opened in a new tab should set rel noopener or noreferrer.
8
+ rationale: >-
9
+ Pages opened via target _blank can access window.opener for tab-nabbing.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: owasp
14
+ title: Reverse Tabnabbing
15
+ url: https://owasp.org/www-community/attacks/Reverse_Tabnabbing
16
+ tags:
17
+ - rules-catalog
18
+ - ruby
19
+ stability: stable
20
+ appliesTo: block
21
+ scope:
22
+ languages:
23
+ - ruby
24
+ paths:
25
+ include:
26
+ - "**/*.rb"
27
+ - "**/*.erb"
28
+ - "**/*.erb"
29
+ exclude:
30
+ - "**/vendor/**"
31
+ - "**/node_modules/**"
32
+ match:
33
+ fact:
34
+ kind: ruby.security.rails-link-to-blank-without-noopener
35
+ bind: issue
36
+ emit:
37
+ finding:
38
+ category: security.session-management
39
+ severity: medium
40
+ confidence: 0.9
41
+ tags:
42
+ - ruby
43
+ message:
44
+ title: Review `${captures.issue.text}`
45
+ summary: "`${captures.issue.text}` matches `ruby.security.rails-link-to-blank-without-noopener`."
46
+ remediation:
47
+ summary: >-
48
+ External links opened in a new tab should set rel noopener or noreferrer.
@@ -0,0 +1,47 @@
1
+ apiVersion: critiq.dev/v1alpha1
2
+ kind: Rule
3
+ metadata:
4
+ id: ruby.security.rails-output-unsafe
5
+ title: Avoid output-unsafe Rails helpers
6
+ summary: >-
7
+ Do not use html_safe, raw, or safe_concat to bypass escaping.
8
+ rationale: >-
9
+ Output-unsafe helpers mark content HTML-safe without escaping user input.
10
+ detection:
11
+ kind: pattern
12
+ references:
13
+ - kind: cwe
14
+ id: CWE-79
15
+ title: Improper Neutralization of Input During Web Page Generation
16
+ tags:
17
+ - rules-catalog
18
+ - ruby
19
+ stability: stable
20
+ appliesTo: block
21
+ scope:
22
+ languages:
23
+ - ruby
24
+ paths:
25
+ include:
26
+ - "**/*.rb"
27
+ - "**/*.erb"
28
+ exclude:
29
+ - "**/vendor/**"
30
+ - "**/node_modules/**"
31
+ match:
32
+ fact:
33
+ kind: ruby.security.rails-output-unsafe
34
+ bind: issue
35
+ emit:
36
+ finding:
37
+ category: security.injection
38
+ severity: medium
39
+ confidence: 0.9
40
+ tags:
41
+ - ruby
42
+ message:
43
+ title: Review `${captures.issue.text}`
44
+ summary: "`${captures.issue.text}` matches `ruby.security.rails-output-unsafe`."
45
+ remediation:
46
+ summary: >-
47
+ Do not use html_safe, raw, or safe_concat to bypass escaping.