@critiq/rules 0.0.2 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +52 -4
- package/catalog.yaml +1775 -192
- package/package.json +6 -1
- package/rules/go/go.correctness.defer-close-before-check.rule.yaml +44 -0
- package/rules/go/go.correctness.defer-in-loop.rule.yaml +47 -0
- package/rules/go/go.correctness.nil-context-passed.rule.yaml +43 -0
- package/rules/go/go.correctness.nil-map-assignment.rule.yaml +42 -0
- package/rules/go/go.correctness.time-tick-leak.rule.yaml +44 -0
- package/rules/go/go.correctness.unused-append-result.rule.yaml +43 -0
- package/rules/go/go.correctness.waitgroup-add-in-goroutine.rule.yaml +45 -0
- package/rules/go/go.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/go/go.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/go/go.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/go/go.security.bind-all-interfaces.rule.yaml +57 -0
- package/rules/go/go.security.echo-sensitive-binding-without-validation.rule.yaml +56 -0
- package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +55 -0
- package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +55 -0
- package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +55 -0
- package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +55 -0
- package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +55 -0
- package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +57 -0
- package/rules/go/go.security.insecure-rand-seed.rule.yaml +55 -0
- package/rules/go/go.security.insecure-ssh-host-key.rule.yaml +57 -0
- package/rules/go/go.security.insecure-ssl-protocol.rule.yaml +56 -0
- package/rules/go/go.security.insecure-temp-file.rule.yaml +57 -0
- package/rules/go/go.security.jwt-without-verification.rule.yaml +56 -0
- package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +55 -0
- package/rules/go/go.security.pprof-exposed.rule.yaml +56 -0
- package/rules/go/go.security.sensitive-data-egress.rule.yaml +56 -0
- package/rules/go/go.security.tar-path-traversal.rule.yaml +55 -0
- package/rules/go/go.security.template-unescaped-request-value.rule.yaml +55 -0
- package/rules/go/go.security.tls-missing-min-version.rule.yaml +55 -0
- package/rules/go/go.security.unsafe-package-import.rule.yaml +55 -0
- package/rules/go/go.security.weak-bcrypt-cost.rule.yaml +56 -0
- package/rules/go/go.security.weak-crypto-import.rule.yaml +57 -0
- package/rules/go/go.security.weak-rsa-key-size.rule.yaml +57 -0
- package/rules/go/go.security.weak-tls-cipher.rule.yaml +56 -0
- package/rules/go/go.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/go/go.testing.t-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/go/go.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.correctness.catch-null-pointer.rule.yaml +40 -0
- package/rules/java/java.correctness.empty-catch.rule.yaml +40 -0
- package/rules/java/java.correctness.equals-on-array.rule.yaml +40 -0
- package/rules/java/java.correctness.return-in-finally.rule.yaml +40 -0
- package/rules/java/java.correctness.sync-on-string-literal.rule.yaml +40 -0
- package/rules/java/java.correctness.unsafe-optional-get.rule.yaml +40 -0
- package/rules/java/java.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/java/java.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/java/java.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/java/java.security.android-screenshot-exposure.rule.yaml +48 -0
- package/rules/java/java.security.android-world-readable-mode.rule.yaml +48 -0
- package/rules/java/java.security.hibernate-sql-concatenation.rule.yaml +62 -0
- package/rules/java/java.security.insecure-cipher-mode.rule.yaml +52 -0
- package/rules/java/java.security.insecure-network-protocol.rule.yaml +52 -0
- package/rules/java/java.security.insecure-ssl-context.rule.yaml +52 -0
- package/rules/java/java.security.jpa-concatenated-query.rule.yaml +60 -0
- package/rules/java/java.security.jwt-without-verification.rule.yaml +53 -0
- package/rules/java/java.security.null-cipher.rule.yaml +52 -0
- package/rules/java/java.security.permissive-cors.rule.yaml +53 -0
- package/rules/java/java.security.predictable-securerandom.rule.yaml +59 -0
- package/rules/java/java.security.reflected-output-from-request.rule.yaml +45 -0
- package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +48 -0
- package/rules/java/java.security.shell-runtime-exec.rule.yaml +58 -0
- package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +53 -0
- package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +53 -0
- package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +62 -0
- package/rules/java/java.security.spring-debug-exposure.rule.yaml +48 -0
- package/rules/java/java.security.spring-permit-all-default.rule.yaml +60 -0
- package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +60 -0
- package/rules/java/java.security.template-unescaped-user-output.rule.yaml +59 -0
- package/rules/java/java.security.trust-all-certificates.rule.yaml +52 -0
- package/rules/java/java.security.unsafe-jackson-deserialization.rule.yaml +59 -0
- package/rules/java/java.security.weak-rsa-key-size.rule.yaml +54 -0
- package/rules/java/java.security.xxe-document-builder.rule.yaml +59 -0
- package/rules/java/java.security.xxe-xml-input-factory.rule.yaml +59 -0
- package/rules/java/java.testing.disabled-without-ticket-reference.rule.yaml +33 -0
- package/rules/java/java.testing.http-client-in-unit-test.rule.yaml +33 -0
- package/rules/java/java.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.correctness.duplicate-array-key.rule.yaml +36 -0
- package/rules/php/php.correctness.error-suppression-operator.rule.yaml +36 -0
- package/rules/php/php.correctness.nullsafe-returned-by-reference.rule.yaml +36 -0
- package/rules/php/php.correctness.switch-multiple-default.rule.yaml +36 -0
- package/rules/php/php.correctness.unreachable-after-return.rule.yaml +36 -0
- package/rules/php/php.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/php/php.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/php/php.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/php/php.security.debug-function-exposure.rule.yaml +55 -0
- package/rules/php/php.security.insecure-cors-wildcard-with-credentials.rule.yaml +51 -0
- package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +51 -0
- package/rules/php/php.security.insecure-session-id-generation.rule.yaml +51 -0
- package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +52 -0
- package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +55 -0
- package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +55 -0
- package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +58 -0
- package/rules/php/php.security.no-dynamic-eval.rule.yaml +52 -0
- package/rules/php/php.security.sensitive-data-egress.rule.yaml +52 -0
- package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +55 -0
- package/rules/php/php.security.symfony-debug-exposure.rule.yaml +57 -0
- package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +51 -0
- package/rules/php/php.security.unsafe-include-with-user-input.rule.yaml +52 -0
- package/rules/php/php.security.weak-cipher.rule.yaml +51 -0
- package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +55 -0
- package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +55 -0
- package/rules/php/php.security.xml-external-entity.rule.yaml +53 -0
- package/rules/php/php.testing.curl-in-unit-test.rule.yaml +33 -0
- package/rules/php/php.testing.mark-test-skipped-without-ticket-reference.rule.yaml +33 -0
- package/rules/php/php.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.correctness.assert-on-tuple.rule.yaml +33 -0
- package/rules/python/py.correctness.bare-except.rule.yaml +33 -0
- package/rules/python/py.correctness.broad-exception-handler.rule.yaml +33 -0
- package/rules/python/py.correctness.dangerous-mutable-default.rule.yaml +33 -0
- package/rules/python/py.correctness.duplicate-dict-key.rule.yaml +33 -0
- package/rules/python/py.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/python/py.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/python/py.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/python/py.security.bind-all-interfaces.rule.yaml +55 -0
- package/rules/python/py.security.debugger-import.rule.yaml +55 -0
- package/rules/python/py.security.django-csrf-exempt-state-changing.rule.yaml +59 -0
- package/rules/python/py.security.django-format-html-unsafe.rule.yaml +56 -0
- package/rules/python/py.security.django-mark-safe.rule.yaml +56 -0
- package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +60 -0
- package/rules/python/py.security.django-security-middleware-missing.rule.yaml +60 -0
- package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +60 -0
- package/rules/python/py.security.drf-allow-any-default.rule.yaml +59 -0
- package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +59 -0
- package/rules/python/py.security.dynamic-code-execution.rule.yaml +55 -0
- package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +56 -0
- package/rules/python/py.security.flask-debug-enabled.rule.yaml +56 -0
- package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +57 -0
- package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +57 -0
- package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +57 -0
- package/rules/python/py.security.insecure-temp-file.rule.yaml +55 -0
- package/rules/python/py.security.insecure-yaml-load.rule.yaml +55 -0
- package/rules/python/py.security.jinja-autoescape-disabled.rule.yaml +58 -0
- package/rules/python/py.security.subprocess-shell-enabled.rule.yaml +55 -0
- package/rules/python/py.testing.pytest-skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/python/py.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/python/py.testing.time-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/ruby/ruby.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/ruby/ruby.security.rails-csrf-disabled.rule.yaml +58 -0
- package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +57 -0
- package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +58 -0
- package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +59 -0
- package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +58 -0
- package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +58 -0
- package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +59 -0
- package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +55 -0
- package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +55 -0
- package/rules/ruby/ruby.testing.focused-example.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.pending-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.skip-without-ticket-reference.rule.yaml +33 -0
- package/rules/ruby/ruby.testing.sleep-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.correctness.block-on-in-async.rule.yaml +48 -0
- package/rules/rust/rust.correctness.forget-join-handle.rule.yaml +48 -0
- package/rules/rust/rust.correctness.mutex-held-across-await.rule.yaml +48 -0
- package/rules/rust/rust.correctness.std-mutex-in-async-fn.rule.yaml +48 -0
- package/rules/rust/rust.correctness.thread-sleep-in-async.rule.yaml +48 -0
- package/rules/rust/rust.correctness.unbounded-channel.rule.yaml +49 -0
- package/rules/rust/rust.correctness.unchecked-index.rule.yaml +46 -0
- package/rules/rust/rust.performance.no-regex-construction-in-loop.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-sync-fs-in-request-path.rule.yaml +33 -0
- package/rules/rust/rust.performance.no-unbounded-concurrency.rule.yaml +33 -0
- package/rules/rust/rust.security.actix-wildcard-cors-with-credentials.rule.yaml +60 -0
- package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +58 -0
- package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +60 -0
- package/rules/rust/rust.security.bind-all-interfaces.rule.yaml +57 -0
- package/rules/rust/rust.security.insecure-ssh-host-key.rule.yaml +57 -0
- package/rules/rust/rust.security.insecure-ssl-protocol.rule.yaml +57 -0
- package/rules/rust/rust.security.insecure-temp-file.rule.yaml +57 -0
- package/rules/rust/rust.security.insecure-yaml-load.rule.yaml +57 -0
- package/rules/rust/rust.security.jwt-without-verification.rule.yaml +57 -0
- package/rules/rust/rust.security.panic-in-async-handler.rule.yaml +57 -0
- package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +58 -0
- package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +60 -0
- package/rules/rust/rust.security.shell-command-spawn.rule.yaml +57 -0
- package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +60 -0
- package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +57 -0
- package/rules/rust/rust.security.tls-missing-min-version.rule.yaml +57 -0
- package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +58 -0
- package/rules/rust/rust.security.weak-crypto-import.rule.yaml +55 -0
- package/rules/rust/rust.security.weak-rsa-key-size.rule.yaml +57 -0
- package/rules/rust/rust.security.weak-tls-cipher.rule.yaml +57 -0
- package/rules/rust/rust.testing.ignore-without-ticket-reference.rule.yaml +33 -0
- package/rules/rust/rust.testing.real-network-in-unit-test.rule.yaml +33 -0
- package/rules/rust/rust.testing.thread-sleep-in-unit-test.rule.yaml +33 -0
- package/rules/shared/security.archive-path-traversal.rule.yaml +51 -0
- package/rules/shared/security.external-file-upload.rule.yaml +50 -0
- package/rules/shared/security.insecure-http-transport.rule.yaml +10 -0
- package/rules/shared/security.no-command-execution-with-request-input.rule.yaml +10 -0
- package/rules/shared/security.no-hardcoded-credentials.rule.yaml +10 -0
- package/rules/shared/security.no-request-path-file-read.rule.yaml +10 -0
- package/rules/shared/security.no-sensitive-data-in-logs-and-telemetry.rule.yaml +10 -0
- package/rules/shared/security.no-sql-interpolation.rule.yaml +10 -0
- package/rules/shared/security.permissive-file-permissions.rule.yaml +50 -0
- package/rules/shared/security.sensitive-data-egress.rule.yaml +46 -0
- package/rules/shared/security.tls-verification-disabled.rule.yaml +10 -0
- package/rules/shared/security.unsafe-deserialization.rule.yaml +10 -0
- package/rules/shared/security.weak-hash-algorithm.rule.yaml +10 -0
- package/rules/typescript/ts.correctness.array-callback-missing-return.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.array-sort-without-compare.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.assignment-in-condition.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.assignment-to-import-binding.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.async-promise-executor.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.control-flow-in-finally.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.duplicate-function-parameter.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-if-else-condition.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.duplicate-import-source.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-object-key.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.duplicate-switch-case.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.empty-block-statement.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.for-in-on-array.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.identical-comparison-operands.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.infinite-loop.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.invalid-await-expression.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.invalid-typeof-comparison.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.missing-async-on-promise-method.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.missing-super-call.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.no-floating-promise-in-function.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.no-misused-promises.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.promise-reject-non-error.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.reassign-catch-binding.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.regexp-pattern-unusual-control-character.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.self-assignment.rule.yaml +36 -0
- package/rules/typescript/ts.correctness.this-before-super.rule.yaml +35 -0
- package/rules/typescript/ts.correctness.unnecessary-return-await.rule.yaml +32 -0
- package/rules/typescript/ts.correctness.use-number-is-nan.rule.yaml +35 -0
- package/rules/typescript/ts.next.server-action-missing-local-auth.rule.yaml +48 -0
- package/rules/typescript/ts.performance.no-array-spread-in-hot-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-await-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-cache-miss-from-unstable-key.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-expensive-sort-in-render-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-json-parse-stringify-clone.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-large-object-spread-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-n-plus-one-await-in-map.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-redundant-network-fetch.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-regex-construction-in-loop.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-sync-fs-in-request-path.rule.yaml +32 -0
- package/rules/typescript/ts.performance.no-unbounded-concurrency.rule.yaml +32 -0
- package/rules/typescript/ts.quality.no-ambiguous-abbreviations.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-barrel-file-cycle.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-boolean-parameter-trap.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-dead-export.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-empty-function.rule.yaml +32 -0
- package/rules/typescript/ts.quality.no-hidden-side-effect-import.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-inconsistent-error-shape.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-mixed-abstraction-level.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-primitive-obsession-in-domain-model.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-temporal-coupling.rule.yaml +27 -0
- package/rules/typescript/ts.quality.no-wide-public-surface.rule.yaml +27 -0
- package/rules/typescript/ts.react.no-accessibility-label-missing.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-activedescendant-on-non-focusable-host.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-bind-in-jsx-props.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-children-prop.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-click-without-keyboard-handler.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-deprecated-create-factory.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-deprecated-react-dom-root-api.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-derived-state-from-props.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-direct-state-mutation.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-duplicate-jsx-attributes.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-effect-fetch-without-cancellation.rule.yaml +35 -0
- package/rules/typescript/ts.react.no-find-dom-node.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-img-missing-alt-text.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-index-as-key-in-dynamic-list.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-interactive-role-on-static-semantics.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-invalid-anchor-href.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-jsx-props-spread.rule.yaml +35 -0
- package/rules/typescript/ts.react.no-keyboard-interaction-without-widget-role.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-legacy-lifecycle.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-missing-error-boundary.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-positive-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-set-state-in-component-did-mount.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-set-state-in-component-did-update.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-static-element-with-synthetic-handlers.rule.yaml +36 -0
- package/rules/typescript/ts.react.no-string-ref.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-target-blank-without-rel.rule.yaml +46 -0
- package/rules/typescript/ts.react.no-this-in-function-component.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-uncontrolled-to-controlled-input.rule.yaml +34 -0
- package/rules/typescript/ts.react.no-widget-role-without-tabindex.rule.yaml +36 -0
- package/rules/typescript/ts.runtime.no-process-exit.rule.yaml +44 -0
- package/rules/typescript/ts.security.ajv-insecure-configuration.rule.yaml +44 -0
- package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +48 -0
- package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +52 -0
- package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +52 -0
- package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +51 -0
- package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +51 -0
- package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +52 -0
- package/rules/typescript/ts.security.bind-to-all-interfaces.rule.yaml +10 -0
- package/rules/typescript/ts.security.browser-token-storage.rule.yaml +10 -0
- package/rules/typescript/ts.security.dangerous-insert-html.rule.yaml +10 -0
- package/rules/typescript/ts.security.dangerously-set-inner-html.rule.yaml +10 -0
- package/rules/typescript/ts.security.datadog-browser-track-user-interactions.rule.yaml +10 -0
- package/rules/typescript/ts.security.debug-mode-enabled.rule.yaml +10 -0
- package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +46 -0
- package/rules/typescript/ts.security.dynamodb-query-injection.rule.yaml +10 -0
- package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +45 -0
- package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +45 -0
- package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +45 -0
- package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +48 -0
- package/rules/typescript/ts.security.exposed-directory-listing.rule.yaml +10 -0
- package/rules/typescript/ts.security.express-cookie-missing-http-only.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-default-cookie-config.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-default-session-config.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +51 -0
- package/rules/typescript/ts.security.express-insecure-cookie.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-missing-helmet.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-nosql-injection.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-permissive-cookie-config.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-permissive-cors.rule.yaml +52 -0
- package/rules/typescript/ts.security.express-reduce-fingerprint.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-static-assets-after-session.rule.yaml +16 -0
- package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +51 -0
- package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +50 -0
- package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +51 -0
- package/rules/typescript/ts.security.external-file-upload.rule.yaml +10 -0
- package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +50 -0
- package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +54 -0
- package/rules/typescript/ts.security.file-generation.rule.yaml +10 -0
- package/rules/typescript/ts.security.format-string-using-user-input.rule.yaml +10 -0
- package/rules/typescript/ts.security.frontend-only-authorization.rule.yaml +10 -0
- package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +52 -0
- package/rules/typescript/ts.security.handlebars-no-escape.rule.yaml +10 -0
- package/rules/typescript/ts.security.hardcoded-auth-secret.rule.yaml +10 -0
- package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +45 -0
- package/rules/typescript/ts.security.import-using-user-input.rule.yaml +10 -0
- package/rules/typescript/ts.security.information-leakage.rule.yaml +10 -0
- package/rules/typescript/ts.security.insecure-allow-origin.rule.yaml +10 -0
- package/rules/typescript/ts.security.insecure-auth-cookie-flags.rule.yaml +10 -0
- package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +45 -0
- package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +46 -0
- package/rules/typescript/ts.security.insecure-password-hash-configuration.rule.yaml +10 -0
- package/rules/typescript/ts.security.insecure-websocket-transport.rule.yaml +10 -0
- package/rules/typescript/ts.security.insufficiently-random-values.rule.yaml +10 -0
- package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +45 -0
- package/rules/typescript/ts.security.jwt-not-revoked.rule.yaml +10 -0
- package/rules/typescript/ts.security.jwt-sensitive-claims.rule.yaml +10 -0
- package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +45 -0
- package/rules/typescript/ts.security.log-injection.rule.yaml +46 -0
- package/rules/typescript/ts.security.manual-html-sanitization.rule.yaml +10 -0
- package/rules/typescript/ts.security.missing-authorization-before-sensitive-action.rule.yaml +10 -0
- package/rules/typescript/ts.security.missing-integrity-check.rule.yaml +10 -0
- package/rules/typescript/ts.security.missing-message-origin-check.rule.yaml +10 -0
- package/rules/typescript/ts.security.missing-ownership-validation.rule.yaml +10 -0
- package/rules/typescript/ts.security.missing-request-timeout-or-retry.rule.yaml +10 -0
- package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +50 -0
- package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +51 -0
- package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +51 -0
- package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +52 -0
- package/rules/typescript/ts.security.no-alert-confirm-prompt.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-arguments-callee.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-assign-mutable-export.rule.yaml +45 -0
- package/rules/typescript/ts.security.no-dynamic-execution.rule.yaml +10 -0
- package/rules/typescript/ts.security.no-fs-readfile-sync-in-handler.rule.yaml +46 -0
- package/rules/typescript/ts.security.no-global-native-reassignment.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-innerhtml-assignment.rule.yaml +10 -0
- package/rules/typescript/ts.security.no-javascript-url.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-native-prototype-extension.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-sync-child-process-exec.rule.yaml +45 -0
- package/rules/typescript/ts.security.no-throw-literal.rule.yaml +44 -0
- package/rules/typescript/ts.security.no-with-statement.rule.yaml +44 -0
- package/rules/typescript/ts.security.non-literal-fs-filename.rule.yaml +10 -0
- package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +51 -0
- package/rules/typescript/ts.security.observable-timing-discrepancy.rule.yaml +10 -0
- package/rules/typescript/ts.security.open-redirect.rule.yaml +12 -0
- package/rules/typescript/ts.security.permissive-allow-origin.rule.yaml +10 -0
- package/rules/typescript/ts.security.permissive-file-permissions.rule.yaml +10 -0
- package/rules/typescript/ts.security.postmessage-wildcard-origin.rule.yaml +10 -0
- package/rules/typescript/ts.security.predictable-token-generation.rule.yaml +10 -0
- package/rules/typescript/ts.security.raw-html-using-user-input.rule.yaml +10 -0
- package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +43 -0
- package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +11 -0
- package/rules/typescript/ts.security.sensitive-data-in-exception.rule.yaml +10 -0
- package/rules/typescript/ts.security.sensitive-data-written-to-file.rule.yaml +10 -0
- package/rules/typescript/ts.security.ssrf.rule.yaml +11 -0
- package/rules/typescript/ts.security.token-or-session-not-validated.rule.yaml +10 -0
- package/rules/typescript/ts.security.ui-redress.rule.yaml +10 -0
- package/rules/typescript/ts.security.unsafe-dirname-path-concat.rule.yaml +44 -0
- package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +46 -0
- package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +46 -0
- package/rules/typescript/ts.security.unsanitized-http-response.rule.yaml +10 -0
- package/rules/typescript/ts.security.unvalidated-external-input.rule.yaml +10 -0
- package/rules/typescript/ts.security.user-controlled-sendfile.rule.yaml +10 -0
- package/rules/typescript/ts.security.user-controlled-view-render.rule.yaml +10 -0
- package/rules/typescript/ts.security.weak-cipher-or-mode.rule.yaml +10 -0
- package/rules/typescript/ts.security.weak-key-strength.rule.yaml +10 -0
- package/rules/typescript/ts.security.weak-tls-version.rule.yaml +10 -0
- package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +45 -0
- package/rules/typescript/ts.testing.no-flaky-timer-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-focused-test.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-missing-edge-case-tests.rule.yaml +35 -0
- package/rules/typescript/ts.testing.no-network-call-in-unit-test.rule.yaml +38 -0
- package/rules/typescript/ts.testing.no-skipped-test-without-ticket.rule.yaml +34 -0
- package/rules/typescript/ts.testing.no-snapshot-without-intent.rule.yaml +34 -0
- 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: 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.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.testing.skip-without-ticket-reference
|
|
5
|
+
title: RSpec skip should cite a ticket
|
|
6
|
+
summary: skip(...) without a nearby tracker reference is hard to triage.
|
|
7
|
+
rationale: Skips without traceability tend to linger.
|
|
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.skip-without-ticket-reference
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.66
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Add a ticket reference to `${captures.issue.text}`
|
|
31
|
+
summary: "`skip` is used without an adjacent issue key or accepted suppression comment."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Link the skip to a tracker id or document the temporary bypass with an owner.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: ruby.testing.sleep-in-unit-test
|
|
5
|
+
title: Avoid sleep in Ruby unit tests
|
|
6
|
+
summary: sleep in specs slows CI and hides synchronization bugs.
|
|
7
|
+
rationale: Prefer deterministic waits or travel_to style time helpers.
|
|
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.sleep-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: low
|
|
25
|
+
confidence: 0.58
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- ruby
|
|
29
|
+
message:
|
|
30
|
+
title: Replace `sleep` in specs
|
|
31
|
+
summary: "`${captures.issue.text}` blocks on real wall-clock time inside a spec-like path."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Use event-driven waits, shorten delays, or move timing coverage to integration suites.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.block-on-in-async
|
|
5
|
+
title: Avoid block_on inside async functions
|
|
6
|
+
summary: Calling block_on from async code can deadlock the runtime.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`Handle::current().block_on`, `Runtime::block_on`, and `futures::executor::block_on`
|
|
9
|
+
block the async executor thread and can deadlock when invoked from `async fn`.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- concurrency
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- rust
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.rs"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/tests/**"
|
|
25
|
+
- "**/test/**"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/examples/**"
|
|
28
|
+
- "**/benches/**"
|
|
29
|
+
- "**/*_test.rs"
|
|
30
|
+
- "**/*.spec.rs"
|
|
31
|
+
match:
|
|
32
|
+
fact:
|
|
33
|
+
kind: rust.correctness.block-on-in-async
|
|
34
|
+
bind: issue
|
|
35
|
+
emit:
|
|
36
|
+
finding:
|
|
37
|
+
category: correctness.concurrency
|
|
38
|
+
severity: high
|
|
39
|
+
confidence: 0.85
|
|
40
|
+
tags:
|
|
41
|
+
- correctness
|
|
42
|
+
- rust
|
|
43
|
+
- concurrency
|
|
44
|
+
message:
|
|
45
|
+
title: Remove block_on from async code
|
|
46
|
+
summary: "`${captures.issue.text}` can deadlock the async runtime."
|
|
47
|
+
remediation:
|
|
48
|
+
summary: Await the future directly or run blocking work on a dedicated runtime thread.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.forget-join-handle
|
|
5
|
+
title: Do not forget spawned task handles
|
|
6
|
+
summary: Forgetting a JoinHandle leaks the task and drops panic propagation.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`std::mem::forget` on a `tokio::spawn` return value or `JoinHandle` abandons
|
|
9
|
+
the task without awaiting completion or observing panics.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- concurrency
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- rust
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.rs"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/tests/**"
|
|
25
|
+
- "**/test/**"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/examples/**"
|
|
28
|
+
- "**/benches/**"
|
|
29
|
+
- "**/*_test.rs"
|
|
30
|
+
- "**/*.spec.rs"
|
|
31
|
+
match:
|
|
32
|
+
fact:
|
|
33
|
+
kind: rust.correctness.forget-join-handle
|
|
34
|
+
bind: issue
|
|
35
|
+
emit:
|
|
36
|
+
finding:
|
|
37
|
+
category: correctness.concurrency
|
|
38
|
+
severity: medium
|
|
39
|
+
confidence: 0.85
|
|
40
|
+
tags:
|
|
41
|
+
- correctness
|
|
42
|
+
- rust
|
|
43
|
+
- concurrency
|
|
44
|
+
message:
|
|
45
|
+
title: Await or detach spawned tasks explicitly
|
|
46
|
+
summary: "`${captures.issue.text}` forgets a task handle instead of awaiting it."
|
|
47
|
+
remediation:
|
|
48
|
+
summary: Store the `JoinHandle`, await it, or use a structured shutdown path.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.mutex-held-across-await
|
|
5
|
+
title: Do not hold a Mutex guard across await
|
|
6
|
+
summary: Holding a std::sync::Mutex guard across an await point can deadlock the async executor.
|
|
7
|
+
rationale: >-
|
|
8
|
+
A `std::sync::Mutex` guard must not be held while the task yields at `.await`.
|
|
9
|
+
Use an async mutex or release the guard before awaiting.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- concurrency
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- rust
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.rs"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/tests/**"
|
|
25
|
+
- "**/test/**"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/examples/**"
|
|
28
|
+
- "**/benches/**"
|
|
29
|
+
- "**/*_test.rs"
|
|
30
|
+
- "**/*.spec.rs"
|
|
31
|
+
match:
|
|
32
|
+
fact:
|
|
33
|
+
kind: rust.correctness.mutex-held-across-await
|
|
34
|
+
bind: issue
|
|
35
|
+
emit:
|
|
36
|
+
finding:
|
|
37
|
+
category: correctness.concurrency
|
|
38
|
+
severity: high
|
|
39
|
+
confidence: 0.85
|
|
40
|
+
tags:
|
|
41
|
+
- correctness
|
|
42
|
+
- rust
|
|
43
|
+
- concurrency
|
|
44
|
+
message:
|
|
45
|
+
title: Release the mutex guard before `${captures.issue.text}`
|
|
46
|
+
summary: A `std::sync::Mutex` guard from `.lock().unwrap()` or `.lock().expect(...)` is still used after `.await`.
|
|
47
|
+
remediation:
|
|
48
|
+
summary: Drop the guard before awaiting or switch to `tokio::sync::Mutex` for async code.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.std-mutex-in-async-fn
|
|
5
|
+
title: Prefer async mutex primitives in async functions
|
|
6
|
+
summary: std::sync::Mutex in async code encourages blocking and await deadlocks.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`std::sync::Mutex` blocks the executor when contended. In `async fn`, prefer
|
|
9
|
+
`tokio::sync::Mutex` or `async_lock` primitives that cooperate with the runtime.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- concurrency
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- rust
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.rs"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/tests/**"
|
|
25
|
+
- "**/test/**"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/examples/**"
|
|
28
|
+
- "**/benches/**"
|
|
29
|
+
- "**/*_test.rs"
|
|
30
|
+
- "**/*.spec.rs"
|
|
31
|
+
match:
|
|
32
|
+
fact:
|
|
33
|
+
kind: rust.correctness.std-mutex-in-async-fn
|
|
34
|
+
bind: issue
|
|
35
|
+
emit:
|
|
36
|
+
finding:
|
|
37
|
+
category: correctness.concurrency
|
|
38
|
+
severity: medium
|
|
39
|
+
confidence: 0.85
|
|
40
|
+
tags:
|
|
41
|
+
- correctness
|
|
42
|
+
- rust
|
|
43
|
+
- concurrency
|
|
44
|
+
message:
|
|
45
|
+
title: Replace std mutex in async code
|
|
46
|
+
summary: "`${captures.issue.text}` uses `std::sync::Mutex` inside an `async fn`."
|
|
47
|
+
remediation:
|
|
48
|
+
summary: Switch to `tokio::sync::Mutex` or keep blocking locks outside async contexts.
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.thread-sleep-in-async
|
|
5
|
+
title: Avoid blocking thread sleep in async functions
|
|
6
|
+
summary: std::thread::sleep blocks the executor thread inside async code.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`std::thread::sleep` blocks the current OS thread. Inside `async fn` this stalls
|
|
9
|
+
the runtime worker and harms throughput. Prefer `tokio::time::sleep` instead.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- concurrency
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- rust
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.rs"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/tests/**"
|
|
25
|
+
- "**/test/**"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/examples/**"
|
|
28
|
+
- "**/benches/**"
|
|
29
|
+
- "**/*_test.rs"
|
|
30
|
+
- "**/*.spec.rs"
|
|
31
|
+
match:
|
|
32
|
+
fact:
|
|
33
|
+
kind: rust.correctness.thread-sleep-in-async
|
|
34
|
+
bind: issue
|
|
35
|
+
emit:
|
|
36
|
+
finding:
|
|
37
|
+
category: correctness.concurrency
|
|
38
|
+
severity: medium
|
|
39
|
+
confidence: 0.85
|
|
40
|
+
tags:
|
|
41
|
+
- correctness
|
|
42
|
+
- rust
|
|
43
|
+
- concurrency
|
|
44
|
+
message:
|
|
45
|
+
title: Replace blocking sleep in async code
|
|
46
|
+
summary: "`${captures.issue.text}` blocks an async executor thread."
|
|
47
|
+
remediation:
|
|
48
|
+
summary: Use `tokio::time::sleep` or move blocking work to `spawn_blocking`.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.unbounded-channel
|
|
5
|
+
title: Avoid unbounded async channels
|
|
6
|
+
summary: Unbounded channels can grow without backpressure and exhaust memory.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`tokio::sync::mpsc::unbounded_channel` and `futures::channel::mpsc::unbounded`
|
|
9
|
+
accept messages without capacity limits, which can cause unbounded memory growth
|
|
10
|
+
under load.
|
|
11
|
+
tags:
|
|
12
|
+
- correctness
|
|
13
|
+
- rust
|
|
14
|
+
- resource-leak
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- rust
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.rs"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/tests/**"
|
|
26
|
+
- "**/test/**"
|
|
27
|
+
- "**/testdata/**"
|
|
28
|
+
- "**/examples/**"
|
|
29
|
+
- "**/benches/**"
|
|
30
|
+
- "**/*_test.rs"
|
|
31
|
+
- "**/*.spec.rs"
|
|
32
|
+
match:
|
|
33
|
+
fact:
|
|
34
|
+
kind: rust.correctness.unbounded-channel
|
|
35
|
+
bind: issue
|
|
36
|
+
emit:
|
|
37
|
+
finding:
|
|
38
|
+
category: correctness.resource-leak
|
|
39
|
+
severity: medium
|
|
40
|
+
confidence: 0.85
|
|
41
|
+
tags:
|
|
42
|
+
- correctness
|
|
43
|
+
- rust
|
|
44
|
+
- resource-leak
|
|
45
|
+
message:
|
|
46
|
+
title: Prefer bounded channels for backpressure
|
|
47
|
+
summary: "`${captures.issue.text}` creates an unbounded channel."
|
|
48
|
+
remediation:
|
|
49
|
+
summary: Use a bounded `mpsc::channel` with an explicit capacity.
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.correctness.unchecked-index
|
|
5
|
+
title: Prefer fallible slice access for variable indices
|
|
6
|
+
summary: Direct indexing with a variable can panic when the index is out of bounds.
|
|
7
|
+
rationale: >-
|
|
8
|
+
Slice indexing with a non-literal index panics on bounds failure. Use `.get(index)`
|
|
9
|
+
when the index comes from a variable and handle `None` explicitly.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- rust
|
|
13
|
+
- rules-catalog
|
|
14
|
+
stability: stable
|
|
15
|
+
appliesTo: block
|
|
16
|
+
scope:
|
|
17
|
+
languages:
|
|
18
|
+
- rust
|
|
19
|
+
paths:
|
|
20
|
+
include:
|
|
21
|
+
- "**/*.rs"
|
|
22
|
+
exclude:
|
|
23
|
+
- "**/tests/**"
|
|
24
|
+
- "**/test/**"
|
|
25
|
+
- "**/testdata/**"
|
|
26
|
+
- "**/examples/**"
|
|
27
|
+
- "**/benches/**"
|
|
28
|
+
- "**/*_test.rs"
|
|
29
|
+
- "**/*.spec.rs"
|
|
30
|
+
match:
|
|
31
|
+
fact:
|
|
32
|
+
kind: rust.correctness.unchecked-index
|
|
33
|
+
bind: issue
|
|
34
|
+
emit:
|
|
35
|
+
finding:
|
|
36
|
+
category: correctness.runtime
|
|
37
|
+
severity: medium
|
|
38
|
+
confidence: 0.8
|
|
39
|
+
tags:
|
|
40
|
+
- correctness
|
|
41
|
+
- rust
|
|
42
|
+
message:
|
|
43
|
+
title: Use fallible access for variable indices
|
|
44
|
+
summary: "`${captures.issue.text}` indexes a slice with a variable that may be out of bounds."
|
|
45
|
+
remediation:
|
|
46
|
+
summary: Replace direct indexing with `.get(index)` and handle the `None` case.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.performance.no-regex-construction-in-loop
|
|
5
|
+
title: Avoid no regex construction in loop
|
|
6
|
+
summary: Performance hygiene signal for rust sources.
|
|
7
|
+
rationale: Performance hygiene signal for rust sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- rust
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- rust
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: rust.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
|
+
- rust
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no regex construction in loop in `rust` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches rust.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: rust.performance.no-sync-fs-in-request-path
|
|
5
|
+
title: Avoid no sync fs in request path
|
|
6
|
+
summary: Performance hygiene signal for rust sources.
|
|
7
|
+
rationale: Performance hygiene signal for rust sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- rust
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- rust
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: rust.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
|
+
- rust
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no sync fs in request path in `rust` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches rust.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: rust.performance.no-unbounded-concurrency
|
|
5
|
+
title: Avoid no unbounded concurrency
|
|
6
|
+
summary: Performance hygiene signal for rust sources.
|
|
7
|
+
rationale: Performance hygiene signal for rust sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- rust
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- rust
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: rust.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
|
+
- rust
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no unbounded concurrency in `rust` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches rust.performance.no-unbounded-concurrency."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.security.actix-wildcard-cors-with-credentials
|
|
5
|
+
title: Avoid Actix any-origin CORS with credentials enabled
|
|
6
|
+
summary: >-
|
|
7
|
+
`actix_cors` configurations must not combine `allow_any_origin` with `supports_credentials`.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Wildcard origins with credentials violate browser CORS expectations and usually indicate a missing explicit origin allowlist.
|
|
10
|
+
detection:
|
|
11
|
+
kind: pattern
|
|
12
|
+
references:
|
|
13
|
+
- kind: cwe
|
|
14
|
+
id: CWE-942
|
|
15
|
+
title: Permissive Cross-domain Policy with Untrusted Domains
|
|
16
|
+
- kind: owasp
|
|
17
|
+
title: Cross-Origin Resource Sharing (CORS)
|
|
18
|
+
url: https://owasp.org/www-community/attacks/CORS_OriginHeaderScrutiny
|
|
19
|
+
- kind: url
|
|
20
|
+
title: ANSSI Rust secure development guidelines
|
|
21
|
+
url: https://anssi-fr.github.io/rust-guide/01-general-principles.html
|
|
22
|
+
tags:
|
|
23
|
+
- security
|
|
24
|
+
- rust
|
|
25
|
+
- actix
|
|
26
|
+
- cors
|
|
27
|
+
- rules-catalog
|
|
28
|
+
stability: experimental
|
|
29
|
+
appliesTo: block
|
|
30
|
+
scope:
|
|
31
|
+
languages:
|
|
32
|
+
- rust
|
|
33
|
+
paths:
|
|
34
|
+
include:
|
|
35
|
+
- "**/*.rs"
|
|
36
|
+
exclude:
|
|
37
|
+
- "**/tests/**"
|
|
38
|
+
- "**/*_test.rs"
|
|
39
|
+
- "**/examples/**"
|
|
40
|
+
match:
|
|
41
|
+
fact:
|
|
42
|
+
kind: rust.security.actix-wildcard-cors-with-credentials
|
|
43
|
+
bind: issue
|
|
44
|
+
emit:
|
|
45
|
+
finding:
|
|
46
|
+
category: security.misconfiguration
|
|
47
|
+
severity: high
|
|
48
|
+
confidence: 0.84
|
|
49
|
+
tags:
|
|
50
|
+
- security
|
|
51
|
+
- rust
|
|
52
|
+
- actix
|
|
53
|
+
- cors
|
|
54
|
+
message:
|
|
55
|
+
title: Replace wildcard Actix CORS with explicit origins in `${captures.issue.text}`
|
|
56
|
+
summary: "`${captures.issue.text}` enables credentials on an any-origin CORS policy."
|
|
57
|
+
remediation:
|
|
58
|
+
summary: >-
|
|
59
|
+
Use `allowed_origin` with explicit HTTPS origins, or disable credentials when anonymous public access is intended.
|
|
60
|
+
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: rust.security.axum-body-limit-disabled
|
|
5
|
+
title: Do not disable Axum default body limits for untrusted uploads
|
|
6
|
+
summary: >-
|
|
7
|
+
Axum apps should keep a finite `DefaultBodyLimit` (or equivalent) so request bodies cannot exhaust memory.
|
|
8
|
+
rationale: >-
|
|
9
|
+
`DefaultBodyLimit::disable()` removes the framework guardrail against huge bodies and is unsafe on routes that accept untrusted input.
|
|
10
|
+
detection:
|
|
11
|
+
kind: pattern
|
|
12
|
+
references:
|
|
13
|
+
- kind: cwe
|
|
14
|
+
id: CWE-16
|
|
15
|
+
title: Configuration
|
|
16
|
+
- kind: owasp
|
|
17
|
+
title: Secure Configuration Cheat Sheet
|
|
18
|
+
url: https://cheatsheetseries.owasp.org/cheatsheets/Secure_Configuration_Cheat_Sheet.html
|
|
19
|
+
- kind: url
|
|
20
|
+
title: ANSSI Rust secure development guidelines
|
|
21
|
+
url: https://anssi-fr.github.io/rust-guide/01-general-principles.html
|
|
22
|
+
tags:
|
|
23
|
+
- security
|
|
24
|
+
- rust
|
|
25
|
+
- axum
|
|
26
|
+
- rules-catalog
|
|
27
|
+
stability: experimental
|
|
28
|
+
appliesTo: block
|
|
29
|
+
scope:
|
|
30
|
+
languages:
|
|
31
|
+
- rust
|
|
32
|
+
paths:
|
|
33
|
+
include:
|
|
34
|
+
- "**/*.rs"
|
|
35
|
+
exclude:
|
|
36
|
+
- "**/tests/**"
|
|
37
|
+
- "**/*_test.rs"
|
|
38
|
+
- "**/examples/**"
|
|
39
|
+
match:
|
|
40
|
+
fact:
|
|
41
|
+
kind: rust.security.axum-body-limit-disabled
|
|
42
|
+
bind: issue
|
|
43
|
+
emit:
|
|
44
|
+
finding:
|
|
45
|
+
category: security.misconfiguration
|
|
46
|
+
severity: high
|
|
47
|
+
confidence: 0.86
|
|
48
|
+
tags:
|
|
49
|
+
- security
|
|
50
|
+
- rust
|
|
51
|
+
- axum
|
|
52
|
+
message:
|
|
53
|
+
title: Restore a body size limit instead of `${captures.issue.text}`
|
|
54
|
+
summary: "`${captures.issue.text}` disables Axum body limits; prefer `DefaultBodyLimit::max(...)` or a reverse-proxy limit."
|
|
55
|
+
remediation:
|
|
56
|
+
summary: >-
|
|
57
|
+
Set an explicit max body size with `DefaultBodyLimit::max`, add `tower_http::limit::RequestBodyLimitLayer`, or enforce limits at your edge proxy before accepting large uploads.
|
|
58
|
+
|