@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.
- package/README.md +3 -2
- package/catalog.yaml +798 -0
- package/package.json +1 -1
- package/rules/cfn/cfn.correctness.attributedefinitions-keyschemas-mismatch.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.base64-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.basic-cloudformation-resource-check.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.basic-cloudformation-template-configuration.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.cannot-reference-resources-in-the-conditions-block-of-the-template.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-at-least-one-essential-container-is-specified.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-deletionpolicy-values-for-resources.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-dependson-values-for-resources.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-ec2-ebs-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-elastic-cache-redis-cluster-settings.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-events-rule-targets-are-less-than-or-equal-to-5.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fargate-service-scheduling-strategy.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fn-and-structure-for-validity.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fn-equals-structure-for-validity.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fn-if-structure-for-validity.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fn-not-structure-for-validity.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-fn-or-structure-for-validity.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-for-subscriptionfilters-have-beyond-2-attachments-to-a-cloudwatch-log-group.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-a-json-object-is-within-size-limits.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-a-list-has-between-min-and-max-number-of-values-specified.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-a-list-has-duplicate-values.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-a-number-is-between-min-and-max.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-a-string-has-between-min-and-max-number-of-values-specified.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-eol-lambda-function-runtimes-are-used.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-properties-have-a-valid-value.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-property-values-adhere-to-a-specific-pattern.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-refing-to-a-iam-resource-with-path-set.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-refs-exist.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-serverless-resources-have-serverless-transform.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-if-the-referenced-conditions-are-defined.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-minimum-90-period-is-met-between-backupplan-cold-and-delete.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-properties-that-are-mutually-exclusive.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-properties-that-are-required-together.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-properties-that-need-at-least-one-of-a-list-of-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-properties-that-need-only-one-of-a-list-of-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-resource-properties-values.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-state-machine-definition-for-proper-syntax.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-that-modules-resources-are-valid.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-the-configuration-of-a-resources-updatepolicy.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-updatereplacepolicy-values-for-resources.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.check-values-of-properties-for-valid-refs-and-getatts.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.cidr-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.cloudfront-aliases.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.codepipeline-stage-actions.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.codepipeline-stages.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.conditions-have-appropriate-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.default-value-cannot-use-refs.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.default-value-is-within-parameter-constraints.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.error-processing-rule-on-the-template.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.findinmap-validation-of-configuration.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.getatt-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.getaz-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.importvalue-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.join-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.length-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mapping-attribute-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mapping-keys-are-strings-and-alphanumeric.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mapping-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mapping-name-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mappings-are-appropriately-configured.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.mappings-have-appropriate-names.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.metadata-interface-have-appropriate-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.output-description-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.output-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.output-name-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.outputs-descriptions-can-only-be-strings.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.outputs-have-appropriate-names.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.outputs-have-appropriate-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.outputs-have-required-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.outputs-have-values-of-strings.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameter-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameter-name-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameter-value-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameters-have-appropriate-names.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameters-have-appropriate-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.parameters-have-appropriate-type.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.property-is-required-based-on-another-properties-value.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.property-is-unwanted-based-on-another-properties-value.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.rds-instance-type-is-compatible-with-the-rds-type.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.recordset-hostedzonename-is-a-superdomain-of-name.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.ref-validation-of-value.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.required-resource-properties-are-missing.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-dependencies-are-not-circular.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-ec2-security-group-ingress-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-elb-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-name-limit-not-exceeded.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-properties-are-invalid.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-schema.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resource-subnetroutetableassociation-properties.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.resources-have-appropriate-names.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.select-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.snapstart-supports-the-configured-runtime.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.split-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.sub-is-required-if-a-variable-is-used-in-a-string.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.sub-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.template-description-can-only-be-a-string.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.template-description-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.template-size-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.tojsonstring-validation-of-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.unique-resource-and-parameter-names.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validate-accesscontrol-are-set-with-ownershipcontrols.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validate-aws-event-scheduleexpression-format.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validate-parameters-for-in-a-nested-stack.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validate-route53-recordsets.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validate-the-configuration-of-the-metadata-section.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validates-foreach-functions.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validation-not-function-configuration.rule.yaml +49 -0
- package/rules/cfn/cfn.correctness.validationdomain-is-superdomain-of-domainname.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.arns-should-use-correctly-placed-pseudo-parameters.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.availability-zone-parameters-should-not-be-hardcoded.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-iam-resource-policies-syntax.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-a-list-that-allows-duplicates-has-any-duplicates.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-conditions-are-used.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-eol-lambda-function-runtimes-are-used-w2531.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-imageid-parameters-have-the-correct-type.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-mappings-are-used.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-parameters-are-used.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-parameters-have-a-valid-value-based-on-an-allowed-pattern.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-if-parameters-have-a-valid-value.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-obsolete-dependson-configuration-for-resources.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-outputs-using-importvalue.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-required-properties-for-lambda-if-the-deployment-package-is-a-zip-file.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-resources-with-auto-expiring-content-have-explicit-retention-period.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-resources-with-updatereplacepolicy-deletionpolicy-have-both.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.check-stateful-resources-have-a-set-updatereplacepolicy-deletionpolicy.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.checks-for-legacy-instance-type-generations.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.findinmap-keys-exist-in-the-map.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.fn-equals-will-always-return-true-or-false.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.mapping-attribute-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.mapping-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.mapping-name-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.metadata-interface-parameters-exist.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.output-description-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.output-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.output-name-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.parameter-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.parameter-memory-size-attributes-should-have-max-and-min.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.parameter-name-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.parameter-value-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.ref-getatt-to-resource-that-is-available-when-conditions-are-applied.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.resource-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.resource-name-limit.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.sub-isn-t-needed-if-it-doesn-t-have-a-variable-defined.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.sub-validation-of-parameters-w1019.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.template-description-limit-i1003.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.template-size-limit-i1002.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.use-sub-instead-of-join.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.validate-that-snapstart-is-configured-for-java11-runtimes.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.validate-that-snapstart-is-properly-configured.rule.yaml +49 -0
- package/rules/cfn/cfn.maintainability.warn-when-properties-are-configured-to-only-work-with-the-package-command.rule.yaml +49 -0
- package/rules/cfn/cfn.security.check-dynamic-references-secure-strings-are-in-supported-locations.rule.yaml +53 -0
- package/rules/cfn/cfn.security.check-for-noecho-references.rule.yaml +53 -0
- package/rules/cfn/cfn.security.check-iam-permission-configuration.rule.yaml +53 -0
- package/rules/cfn/cfn.security.check-if-iam-policies-are-properly-configured.rule.yaml +53 -0
- package/rules/cfn/cfn.security.check-if-password-properties-are-correctly-configured.rule.yaml +53 -0
- package/rules/cfn/cfn.security.controlling-access-to-an-s3-bucket-should-be-done-with-bucket-policies.rule.yaml +53 -0
- package/rules/php/php.correctness.abstract-method-outside-abstract-class.rule.yaml +36 -0
- package/rules/php/php.correctness.break-continue-outside-loop.rule.yaml +36 -0
- package/rules/php/php.correctness.case-insensitive-define.rule.yaml +36 -0
- package/rules/php/php.correctness.default-parameter-not-last.rule.yaml +36 -0
- package/rules/php/php.correctness.deprecated-filter-constant.rule.yaml +36 -0
- package/rules/php/php.correctness.deprecated-libxml-entity-loader.rule.yaml +36 -0
- package/rules/php/php.correctness.deprecated-unset-cast.rule.yaml +36 -0
- package/rules/php/php.correctness.duplicate-declaration.rule.yaml +36 -0
- package/rules/php/php.correctness.empty-array-literal-slot.rule.yaml +36 -0
- package/rules/php/php.correctness.empty-bracket-array-access.rule.yaml +36 -0
- package/rules/php/php.correctness.empty-code-block.rule.yaml +36 -0
- package/rules/php/php.correctness.empty-function-body.rule.yaml +36 -0
- package/rules/php/php.correctness.function-comparison.rule.yaml +36 -0
- package/rules/php/php.correctness.invalid-cookie-options.rule.yaml +36 -0
- package/rules/php/php.correctness.invalid-regex-literal.rule.yaml +36 -0
- package/rules/php/php.correctness.missing-member-visibility.rule.yaml +36 -0
- package/rules/php/php.correctness.nested-function-declaration.rule.yaml +36 -0
- package/rules/php/php.correctness.nested-switch.rule.yaml +36 -0
- package/rules/php/php.correctness.redundant-string-cast-concat.rule.yaml +36 -0
- package/rules/php/php.correctness.self-assignment.rule.yaml +36 -0
- package/rules/php/php.correctness.todo-fixme-marker.rule.yaml +36 -0
- package/rules/php/php.correctness.unknown-magic-method.rule.yaml +36 -0
- package/rules/php/php.correctness.useless-post-increment.rule.yaml +36 -0
- package/rules/php/php.correctness.useless-unset.rule.yaml +36 -0
- package/rules/php/php.performance.expensive-loop-condition.rule.yaml +36 -0
- package/rules/php/php.security.unsafe-new-static.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.assignment-in-condition.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.deprecated-uri-escape.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.division-by-zero.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.duplicate-hash-keys.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.exception-class-overwritten.rule.yaml +42 -0
- package/rules/ruby/ruby.bug-risk.raw-sql-without-squish.rule.yaml +42 -0
- package/rules/ruby/ruby.security.debugger-call.rule.yaml +53 -0
- package/rules/ruby/ruby.security.dynamic-code-execution.rule.yaml +54 -0
- package/rules/ruby/ruby.security.insecure-json-load.rule.yaml +53 -0
- package/rules/ruby/ruby.security.kernel-open.rule.yaml +53 -0
- package/rules/ruby/ruby.security.plaintext-password-in-callback.rule.yaml +46 -0
- package/rules/ruby/ruby.security.rails-link-to-blank-without-noopener.rule.yaml +48 -0
- 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.
|