@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
package/package.json
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@critiq/rules",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Public OSS Critiq rule catalog with catalog metadata, shipped rule YAML files, and preset membership.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/critiq-dev/critiq-rules.git"
|
|
10
|
+
},
|
|
11
|
+
"homepage": "https://github.com/critiq-dev/critiq-rules#readme",
|
|
7
12
|
"type": "commonjs",
|
|
8
13
|
"main": "./src/index.js",
|
|
9
14
|
"types": "./src/index.d.ts",
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.defer-close-before-check
|
|
5
|
+
title: Check error before deferring Close
|
|
6
|
+
summary: A deferred Close runs even when the open call failed and returned a nil handle.
|
|
7
|
+
rationale: >-
|
|
8
|
+
When `defer file.Close()` runs before the matching `if err != nil` check, a failed
|
|
9
|
+
open dereferences a nil resource and panics during cleanup.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- go
|
|
13
|
+
- rules-catalog
|
|
14
|
+
stability: stable
|
|
15
|
+
appliesTo: block
|
|
16
|
+
scope:
|
|
17
|
+
languages:
|
|
18
|
+
- go
|
|
19
|
+
paths:
|
|
20
|
+
include:
|
|
21
|
+
- "**/*.go"
|
|
22
|
+
exclude:
|
|
23
|
+
- "**/*_test.go"
|
|
24
|
+
- "**/testdata/**"
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
match:
|
|
27
|
+
fact:
|
|
28
|
+
kind: go.correctness.defer-close-before-check
|
|
29
|
+
bind: issue
|
|
30
|
+
emit:
|
|
31
|
+
finding:
|
|
32
|
+
category: correctness.exceptions
|
|
33
|
+
severity: high
|
|
34
|
+
confidence: 0.85
|
|
35
|
+
tags:
|
|
36
|
+
- correctness
|
|
37
|
+
- go
|
|
38
|
+
message:
|
|
39
|
+
title: Move `defer ... Close()` after the err check in `${captures.issue.text}`
|
|
40
|
+
summary: "A `defer ...Close()` runs before the matching `if err != nil` check on the open call."
|
|
41
|
+
remediation:
|
|
42
|
+
summary: >-
|
|
43
|
+
Return early when the open call sets a non-nil error, then defer the matching
|
|
44
|
+
`Close()` only once the resource is known to be valid.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.defer-in-loop
|
|
5
|
+
title: Avoid defer inside loops
|
|
6
|
+
summary: defer inside a loop holds resources until the surrounding function returns.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`defer` runs when the enclosing function returns, not when the iteration ends.
|
|
9
|
+
Deferring inside a `for` or `for ... range` block accumulates open handles for
|
|
10
|
+
the lifetime of the function and can exhaust file descriptors or memory.
|
|
11
|
+
tags:
|
|
12
|
+
- correctness
|
|
13
|
+
- go
|
|
14
|
+
- resource-leak
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- go
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.go"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/*_test.go"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/vendor/**"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: go.correctness.defer-in-loop
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: correctness.resource-leak
|
|
35
|
+
severity: medium
|
|
36
|
+
confidence: 0.85
|
|
37
|
+
tags:
|
|
38
|
+
- correctness
|
|
39
|
+
- go
|
|
40
|
+
- resource-leak
|
|
41
|
+
message:
|
|
42
|
+
title: Remove `${captures.issue.text}` from the loop body
|
|
43
|
+
summary: "A `defer` statement runs inside a `for` loop and accumulates cleanups until the function returns."
|
|
44
|
+
remediation:
|
|
45
|
+
summary: >-
|
|
46
|
+
Wrap the per-iteration work in a helper or closure so the deferred call runs
|
|
47
|
+
when the iteration ends, not at function return.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.nil-context-passed
|
|
5
|
+
title: Pass a real context.Context
|
|
6
|
+
summary: Context-accepting calls should not receive a literal `nil` as their first argument.
|
|
7
|
+
rationale: >-
|
|
8
|
+
Standard library functions that take `context.Context` panic or skip cancellation
|
|
9
|
+
semantics when called with `nil`. Use `context.Background()`, `context.TODO()`, or
|
|
10
|
+
a propagated context instead.
|
|
11
|
+
tags:
|
|
12
|
+
- correctness
|
|
13
|
+
- go
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- go
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.go"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/*_test.go"
|
|
25
|
+
- "**/testdata/**"
|
|
26
|
+
- "**/vendor/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: go.correctness.nil-context-passed
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: correctness.api-usage
|
|
34
|
+
severity: medium
|
|
35
|
+
confidence: 0.9
|
|
36
|
+
tags:
|
|
37
|
+
- correctness
|
|
38
|
+
- go
|
|
39
|
+
message:
|
|
40
|
+
title: Pass a real context to `${captures.issue.text}`
|
|
41
|
+
summary: "A context-accepting call receives a literal `nil` as its first argument."
|
|
42
|
+
remediation:
|
|
43
|
+
summary: Use `context.Background()`, `context.TODO()`, or a propagated context value instead of `nil`.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.nil-map-assignment
|
|
5
|
+
title: Initialize maps before assignment
|
|
6
|
+
summary: Writing to a nil map panics at runtime.
|
|
7
|
+
rationale: >-
|
|
8
|
+
A `var m map[K]V` declaration leaves `m` nil. Any `m[key] = value` write before
|
|
9
|
+
`make(map[K]V)` or a map literal initialization causes a runtime panic.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- go
|
|
13
|
+
- rules-catalog
|
|
14
|
+
stability: stable
|
|
15
|
+
appliesTo: block
|
|
16
|
+
scope:
|
|
17
|
+
languages:
|
|
18
|
+
- go
|
|
19
|
+
paths:
|
|
20
|
+
include:
|
|
21
|
+
- "**/*.go"
|
|
22
|
+
exclude:
|
|
23
|
+
- "**/*_test.go"
|
|
24
|
+
- "**/testdata/**"
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
match:
|
|
27
|
+
fact:
|
|
28
|
+
kind: go.correctness.nil-map-assignment
|
|
29
|
+
bind: issue
|
|
30
|
+
emit:
|
|
31
|
+
finding:
|
|
32
|
+
category: correctness.runtime
|
|
33
|
+
severity: high
|
|
34
|
+
confidence: 0.85
|
|
35
|
+
tags:
|
|
36
|
+
- correctness
|
|
37
|
+
- go
|
|
38
|
+
message:
|
|
39
|
+
title: Initialize map before writing to `${captures.issue.text}`
|
|
40
|
+
summary: "A `var m map[...]...` declaration is written to before `make(...)` or a literal initialization."
|
|
41
|
+
remediation:
|
|
42
|
+
summary: Initialize the map with `make(map[K]V)` or a map literal before writing to it.
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.time-tick-leak
|
|
5
|
+
title: Avoid time.Tick for stoppable timers
|
|
6
|
+
summary: time.Tick leaks the underlying ticker because it cannot be stopped.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`time.Tick` is documented as appropriate only for cases that run forever. Use
|
|
9
|
+
`time.NewTicker` so the ticker can be `Stop`ped when the consumer is done with it.
|
|
10
|
+
tags:
|
|
11
|
+
- correctness
|
|
12
|
+
- go
|
|
13
|
+
- rules-catalog
|
|
14
|
+
stability: stable
|
|
15
|
+
appliesTo: block
|
|
16
|
+
scope:
|
|
17
|
+
languages:
|
|
18
|
+
- go
|
|
19
|
+
paths:
|
|
20
|
+
include:
|
|
21
|
+
- "**/*.go"
|
|
22
|
+
exclude:
|
|
23
|
+
- "**/*_test.go"
|
|
24
|
+
- "**/testdata/**"
|
|
25
|
+
- "**/vendor/**"
|
|
26
|
+
match:
|
|
27
|
+
fact:
|
|
28
|
+
kind: go.correctness.time-tick-leak
|
|
29
|
+
bind: issue
|
|
30
|
+
emit:
|
|
31
|
+
finding:
|
|
32
|
+
category: correctness.resource-leak
|
|
33
|
+
severity: medium
|
|
34
|
+
confidence: 0.9
|
|
35
|
+
tags:
|
|
36
|
+
- correctness
|
|
37
|
+
- go
|
|
38
|
+
message:
|
|
39
|
+
title: Use `time.NewTicker` instead of `${captures.issue.text}`
|
|
40
|
+
summary: "`time.Tick` cannot be stopped and leaks the ticker goroutine."
|
|
41
|
+
remediation:
|
|
42
|
+
summary: >-
|
|
43
|
+
Replace `time.Tick(d)` with `time.NewTicker(d)` and defer `ticker.Stop()` once
|
|
44
|
+
the consumer no longer needs the channel.
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.unused-append-result
|
|
5
|
+
title: Assign the result of append
|
|
6
|
+
summary: append returns a new slice; dropping the result loses the appended element.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`append` may allocate a new backing array, so it always returns the resulting
|
|
9
|
+
slice. Calling `append(s, x)` as a standalone statement silently throws the
|
|
10
|
+
update away.
|
|
11
|
+
tags:
|
|
12
|
+
- correctness
|
|
13
|
+
- go
|
|
14
|
+
- rules-catalog
|
|
15
|
+
stability: stable
|
|
16
|
+
appliesTo: block
|
|
17
|
+
scope:
|
|
18
|
+
languages:
|
|
19
|
+
- go
|
|
20
|
+
paths:
|
|
21
|
+
include:
|
|
22
|
+
- "**/*.go"
|
|
23
|
+
exclude:
|
|
24
|
+
- "**/*_test.go"
|
|
25
|
+
- "**/testdata/**"
|
|
26
|
+
- "**/vendor/**"
|
|
27
|
+
match:
|
|
28
|
+
fact:
|
|
29
|
+
kind: go.correctness.unused-append-result
|
|
30
|
+
bind: issue
|
|
31
|
+
emit:
|
|
32
|
+
finding:
|
|
33
|
+
category: correctness.api-usage
|
|
34
|
+
severity: high
|
|
35
|
+
confidence: 0.9
|
|
36
|
+
tags:
|
|
37
|
+
- correctness
|
|
38
|
+
- go
|
|
39
|
+
message:
|
|
40
|
+
title: Capture the result of `${captures.issue.text}`
|
|
41
|
+
summary: "An `append(...)` call appears as a standalone statement without assigning its result."
|
|
42
|
+
remediation:
|
|
43
|
+
summary: Assign the result back to the slice variable, e.g. `s = append(s, x)`.
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.correctness.waitgroup-add-in-goroutine
|
|
5
|
+
title: Call WaitGroup.Add before launching the goroutine
|
|
6
|
+
summary: WaitGroup.Add called inside the goroutine races with Wait.
|
|
7
|
+
rationale: >-
|
|
8
|
+
`sync.WaitGroup.Add` must happen before the launching goroutine returns to the
|
|
9
|
+
caller. If `Add` runs inside the goroutine, `Wait` may observe a zero counter and
|
|
10
|
+
return before the work begins.
|
|
11
|
+
tags:
|
|
12
|
+
- correctness
|
|
13
|
+
- go
|
|
14
|
+
- concurrency
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: stable
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- go
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.go"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/*_test.go"
|
|
26
|
+
- "**/testdata/**"
|
|
27
|
+
- "**/vendor/**"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: go.correctness.waitgroup-add-in-goroutine
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: correctness.concurrency
|
|
35
|
+
severity: high
|
|
36
|
+
confidence: 0.88
|
|
37
|
+
tags:
|
|
38
|
+
- correctness
|
|
39
|
+
- go
|
|
40
|
+
- concurrency
|
|
41
|
+
message:
|
|
42
|
+
title: Move `${captures.issue.text}` before `go func`
|
|
43
|
+
summary: "A `WaitGroup.Add` call runs inside a `go func()` body and can race with `Wait`."
|
|
44
|
+
remediation:
|
|
45
|
+
summary: Call `wg.Add(n)` on the launching goroutine before the `go` statement starts the worker.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.performance.no-regex-construction-in-loop
|
|
5
|
+
title: Avoid no regex construction in loop
|
|
6
|
+
summary: Performance hygiene signal for go sources.
|
|
7
|
+
rationale: Performance hygiene signal for go sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- go
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- go
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: go.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
|
+
- go
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no regex construction in loop in `go` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches go.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: go.performance.no-sync-fs-in-request-path
|
|
5
|
+
title: Avoid no sync fs in request path
|
|
6
|
+
summary: Performance hygiene signal for go sources.
|
|
7
|
+
rationale: Performance hygiene signal for go sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- go
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- go
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: go.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
|
+
- go
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no sync fs in request path in `go` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches go.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: go.performance.no-unbounded-concurrency
|
|
5
|
+
title: Avoid no unbounded concurrency
|
|
6
|
+
summary: Performance hygiene signal for go sources.
|
|
7
|
+
rationale: Performance hygiene signal for go sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- go
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- go
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: go.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
|
+
- go
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no unbounded concurrency in `go` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches go.performance.no-unbounded-concurrency."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.security.bind-all-interfaces
|
|
5
|
+
title: Avoid binding Go services to all interfaces
|
|
6
|
+
summary: >-
|
|
7
|
+
Go network services should avoid explicit binds to `0.0.0.0`, `::`, or `[::]` unless public exposure is intentional and controlled.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Binding every interface can unintentionally expose internal services beyond expected trust boundaries.
|
|
10
|
+
detection:
|
|
11
|
+
kind: pattern
|
|
12
|
+
references:
|
|
13
|
+
- kind: cwe
|
|
14
|
+
id: CWE-668
|
|
15
|
+
title: Exposure of Resource to Wrong Sphere
|
|
16
|
+
- kind: url
|
|
17
|
+
title: CWE-668 Exposure of Resource to Wrong Sphere
|
|
18
|
+
url: https://cwe.mitre.org/data/definitions/668.html
|
|
19
|
+
tags:
|
|
20
|
+
- security
|
|
21
|
+
- go
|
|
22
|
+
- network
|
|
23
|
+
- exposure
|
|
24
|
+
- rules-catalog
|
|
25
|
+
stability: experimental
|
|
26
|
+
appliesTo: block
|
|
27
|
+
scope:
|
|
28
|
+
languages:
|
|
29
|
+
- go
|
|
30
|
+
paths:
|
|
31
|
+
include:
|
|
32
|
+
- "**/*.go"
|
|
33
|
+
exclude:
|
|
34
|
+
- "**/*_test.go"
|
|
35
|
+
- "**/testdata/**"
|
|
36
|
+
- "**/vendor/**"
|
|
37
|
+
match:
|
|
38
|
+
fact:
|
|
39
|
+
kind: go.security.bind-all-interfaces
|
|
40
|
+
bind: issue
|
|
41
|
+
emit:
|
|
42
|
+
finding:
|
|
43
|
+
category: security.network
|
|
44
|
+
severity: medium
|
|
45
|
+
confidence: 0.85
|
|
46
|
+
tags:
|
|
47
|
+
- security
|
|
48
|
+
- go
|
|
49
|
+
- network
|
|
50
|
+
- exposure
|
|
51
|
+
message:
|
|
52
|
+
title: Restrict interface bind in `${captures.issue.text}`
|
|
53
|
+
summary: "`${captures.issue.text}` binds a service to all network interfaces."
|
|
54
|
+
remediation:
|
|
55
|
+
summary: >-
|
|
56
|
+
Prefer loopback or an explicit interface bind unless broad exposure is required and defended by network controls.
|
|
57
|
+
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.security.echo-sensitive-binding-without-validation
|
|
5
|
+
title: Echo handlers should validate sensitive request bodies
|
|
6
|
+
summary: >-
|
|
7
|
+
Sensitive Echo binds should use struct tags or validators so mutations cannot accept empty or malformed credentials and roles.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Regex-based heuristics flag Echo `Bind` usage when the file defines structs with sensitive fields that omit `validate` or `binding` style tags.
|
|
10
|
+
This is intentionally conservative and may miss cross-file structs or middleware-protected routes.
|
|
11
|
+
detection:
|
|
12
|
+
kind: pattern
|
|
13
|
+
references:
|
|
14
|
+
- kind: cwe
|
|
15
|
+
id: CWE-20
|
|
16
|
+
title: Improper Input Validation
|
|
17
|
+
- kind: owasp
|
|
18
|
+
title: Input Validation Cheat Sheet
|
|
19
|
+
url: https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
|
|
20
|
+
tags:
|
|
21
|
+
- security
|
|
22
|
+
- go
|
|
23
|
+
- echo
|
|
24
|
+
- rules-catalog
|
|
25
|
+
stability: experimental
|
|
26
|
+
appliesTo: block
|
|
27
|
+
scope:
|
|
28
|
+
languages:
|
|
29
|
+
- go
|
|
30
|
+
paths:
|
|
31
|
+
include:
|
|
32
|
+
- "**/*.go"
|
|
33
|
+
exclude:
|
|
34
|
+
- "**/*_test.go"
|
|
35
|
+
- "**/testdata/**"
|
|
36
|
+
- "**/vendor/**"
|
|
37
|
+
match:
|
|
38
|
+
fact:
|
|
39
|
+
kind: go.security.echo-sensitive-binding-without-validation
|
|
40
|
+
bind: issue
|
|
41
|
+
emit:
|
|
42
|
+
finding:
|
|
43
|
+
category: security.input-validation
|
|
44
|
+
severity: medium
|
|
45
|
+
confidence: 0.72
|
|
46
|
+
tags:
|
|
47
|
+
- security
|
|
48
|
+
- go
|
|
49
|
+
- echo
|
|
50
|
+
message:
|
|
51
|
+
title: Add validation tags for sensitive Echo binds in `${captures.issue.text}`
|
|
52
|
+
summary: "`${captures.issue.text}` binds request data without validation tags on sensitive struct fields."
|
|
53
|
+
remediation:
|
|
54
|
+
summary: >-
|
|
55
|
+
Add `validate` tags, use Echo's binding helpers with explicit validation, or route through a hardened DTO layer.
|
|
56
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.security.echo-unsafe-multipart-upload
|
|
5
|
+
title: Harden Echo multipart uploads
|
|
6
|
+
summary: >-
|
|
7
|
+
Multipart handlers should cap body size, sanitize filenames with `filepath.Base`, and avoid concatenating user filenames into destination paths.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Unbounded multipart reads and raw `FormFile().Filename` usage enable DoS and path traversal when combined with predictable upload directories.
|
|
10
|
+
detection:
|
|
11
|
+
kind: pattern
|
|
12
|
+
references:
|
|
13
|
+
- kind: cwe
|
|
14
|
+
id: CWE-434
|
|
15
|
+
title: Unrestricted Upload of File with Dangerous Type
|
|
16
|
+
- kind: owasp
|
|
17
|
+
title: File Upload Cheat Sheet
|
|
18
|
+
url: https://cheatsheetseries.owasp.org/cheatsheets/File_Upload_Cheat_Sheet.html
|
|
19
|
+
tags:
|
|
20
|
+
- security
|
|
21
|
+
- go
|
|
22
|
+
- echo
|
|
23
|
+
- rules-catalog
|
|
24
|
+
stability: experimental
|
|
25
|
+
appliesTo: block
|
|
26
|
+
scope:
|
|
27
|
+
languages:
|
|
28
|
+
- go
|
|
29
|
+
paths:
|
|
30
|
+
include:
|
|
31
|
+
- "**/*.go"
|
|
32
|
+
exclude:
|
|
33
|
+
- "**/*_test.go"
|
|
34
|
+
- "**/testdata/**"
|
|
35
|
+
- "**/vendor/**"
|
|
36
|
+
match:
|
|
37
|
+
fact:
|
|
38
|
+
kind: go.security.echo-unsafe-multipart-upload
|
|
39
|
+
bind: issue
|
|
40
|
+
emit:
|
|
41
|
+
finding:
|
|
42
|
+
category: security.filesystem
|
|
43
|
+
severity: high
|
|
44
|
+
confidence: 0.78
|
|
45
|
+
tags:
|
|
46
|
+
- security
|
|
47
|
+
- go
|
|
48
|
+
- echo
|
|
49
|
+
message:
|
|
50
|
+
title: Harden Echo upload handling in `${captures.issue.text}`
|
|
51
|
+
summary: "`${captures.issue.text}` writes multipart uploads without `MaxBytesReader`, basename hardening, or equivalent guards."
|
|
52
|
+
remediation:
|
|
53
|
+
summary: >-
|
|
54
|
+
Wrap the request body with `http.MaxBytesReader`, normalize filenames with `filepath.Base`, enforce extension allowlists, and prefer storage APIs that never trust client paths.
|
|
55
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.security.fiber-sensitive-binding-without-validation
|
|
5
|
+
title: Fiber handlers should validate sensitive request bodies
|
|
6
|
+
summary: >-
|
|
7
|
+
Sensitive Fiber parsers should pair structs with validator tags or explicit validation so roles and secrets cannot be silently omitted.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Regex heuristics flag `BodyParser`/`JSON` usage when structs in the same file define sensitive fields without `validate` or `binding` style tags.
|
|
10
|
+
detection:
|
|
11
|
+
kind: pattern
|
|
12
|
+
references:
|
|
13
|
+
- kind: cwe
|
|
14
|
+
id: CWE-20
|
|
15
|
+
title: Improper Input Validation
|
|
16
|
+
- kind: owasp
|
|
17
|
+
title: Input Validation Cheat Sheet
|
|
18
|
+
url: https://cheatsheetseries.owasp.org/cheatsheets/Input_Validation_Cheat_Sheet.html
|
|
19
|
+
tags:
|
|
20
|
+
- security
|
|
21
|
+
- go
|
|
22
|
+
- fiber
|
|
23
|
+
- rules-catalog
|
|
24
|
+
stability: experimental
|
|
25
|
+
appliesTo: block
|
|
26
|
+
scope:
|
|
27
|
+
languages:
|
|
28
|
+
- go
|
|
29
|
+
paths:
|
|
30
|
+
include:
|
|
31
|
+
- "**/*.go"
|
|
32
|
+
exclude:
|
|
33
|
+
- "**/*_test.go"
|
|
34
|
+
- "**/testdata/**"
|
|
35
|
+
- "**/vendor/**"
|
|
36
|
+
match:
|
|
37
|
+
fact:
|
|
38
|
+
kind: go.security.fiber-sensitive-binding-without-validation
|
|
39
|
+
bind: issue
|
|
40
|
+
emit:
|
|
41
|
+
finding:
|
|
42
|
+
category: security.input-validation
|
|
43
|
+
severity: medium
|
|
44
|
+
confidence: 0.72
|
|
45
|
+
tags:
|
|
46
|
+
- security
|
|
47
|
+
- go
|
|
48
|
+
- fiber
|
|
49
|
+
message:
|
|
50
|
+
title: Add validation tags for sensitive Fiber binds in `${captures.issue.text}`
|
|
51
|
+
summary: "`${captures.issue.text}` parses request bodies without validation tags on sensitive struct fields."
|
|
52
|
+
remediation:
|
|
53
|
+
summary: >-
|
|
54
|
+
Add `validate` struct tags, use Fiber validator middleware, or centralize DTO validation before business logic.
|
|
55
|
+
|