@critiq/rules 0.0.1 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +256 -140
- package/catalog.yaml +985 -19
- package/package.json +7 -1
- 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.echo-sensitive-binding-without-validation.rule.yaml +46 -0
- package/rules/go/go.security.echo-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.fiber-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.fiber-unsafe-multipart-upload.rule.yaml +45 -0
- package/rules/go/go.security.gin-sensitive-binding-without-validation.rule.yaml +45 -0
- package/rules/go/go.security.gin-trust-all-proxies.rule.yaml +45 -0
- package/rules/go/go.security.gin-wildcard-cors-with-credentials.rule.yaml +47 -0
- package/rules/go/go.security.net-http-missing-timeouts.rule.yaml +45 -0
- package/rules/go/go.security.sensitive-data-egress.rule.yaml +46 -0
- package/rules/go/go.security.tar-path-traversal.rule.yaml +45 -0
- package/rules/go/go.security.template-unescaped-request-value.rule.yaml +45 -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.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 +35 -0
- package/rules/java/java.security.android-world-readable-mode.rule.yaml +35 -0
- package/rules/java/java.security.jpa-concatenated-query.rule.yaml +47 -0
- package/rules/java/java.security.reflected-output-from-request.rule.yaml +35 -0
- package/rules/java/java.security.servlet-insecure-cookie.rule.yaml +35 -0
- package/rules/java/java.security.spring-actuator-health-details-always.rule.yaml +40 -0
- package/rules/java/java.security.spring-actuator-sensitive-exposure.rule.yaml +40 -0
- package/rules/java/java.security.spring-csrf-globally-disabled.rule.yaml +49 -0
- package/rules/java/java.security.spring-debug-exposure.rule.yaml +35 -0
- package/rules/java/java.security.spring-permit-all-default.rule.yaml +47 -0
- package/rules/java/java.security.spring-webmvc-unrestricted-data-binding.rule.yaml +47 -0
- package/rules/java/java.security.template-unescaped-user-output.rule.yaml +49 -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.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.insecure-cors-wildcard-with-credentials.rule.yaml +41 -0
- package/rules/php/php.security.insecure-mail-or-file-transport.rule.yaml +41 -0
- package/rules/php/php.security.insecure-session-or-cookie-config.rule.yaml +42 -0
- package/rules/php/php.security.laravel-sensitive-csrf-exclusion.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-blade-output.rule.yaml +42 -0
- package/rules/php/php.security.laravel-unsafe-mass-assignment.rule.yaml +45 -0
- package/rules/php/php.security.sensitive-data-egress.rule.yaml +42 -0
- package/rules/php/php.security.symfony-csrf-disabled.rule.yaml +42 -0
- package/rules/php/php.security.symfony-debug-exposure.rule.yaml +44 -0
- package/rules/php/php.security.unsafe-file-upload-handling.rule.yaml +41 -0
- package/rules/php/php.security.wordpress-missing-nonce-or-capability.rule.yaml +42 -0
- package/rules/php/php.security.wordpress-unprepared-sql.rule.yaml +42 -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.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.django-csrf-exempt-state-changing.rule.yaml +46 -0
- package/rules/python/py.security.django-missing-csrf-middleware.rule.yaml +47 -0
- package/rules/python/py.security.django-unsafe-production-settings.rule.yaml +47 -0
- package/rules/python/py.security.drf-allow-any-default.rule.yaml +46 -0
- package/rules/python/py.security.drf-allow-any-unsafe-method.rule.yaml +46 -0
- package/rules/python/py.security.fastapi-insecure-cors.rule.yaml +43 -0
- package/rules/python/py.security.flask-missing-upload-body-limit.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-html-output.rule.yaml +44 -0
- package/rules/python/py.security.flask-unsafe-upload-filename.rule.yaml +44 -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 +45 -0
- package/rules/ruby/ruby.security.rails-detailed-exceptions-enabled.rule.yaml +44 -0
- package/rules/ruby/ruby.security.rails-open-redirect.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-html-output.rule.yaml +46 -0
- package/rules/ruby/ruby.security.rails-unsafe-render.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-session-or-cookie-store.rule.yaml +45 -0
- package/rules/ruby/ruby.security.rails-unsafe-strong-parameters.rule.yaml +46 -0
- package/rules/ruby/ruby.security.sensitive-data-egress.rule.yaml +45 -0
- package/rules/ruby/ruby.security.sidekiq-web-unauthenticated-mount.rule.yaml +45 -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.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 +47 -0
- package/rules/rust/rust.security.axum-body-limit-disabled.rule.yaml +45 -0
- package/rules/rust/rust.security.axum-insecure-cors-with-credentials.rule.yaml +47 -0
- package/rules/rust/rust.security.rocket-panic-prone-request-handler.rule.yaml +45 -0
- package/rules/rust/rust.security.rocket-unsafe-template-output.rule.yaml +47 -0
- package/rules/rust/rust.security.sqlx-diesel-raw-interpolated-query.rule.yaml +47 -0
- package/rules/rust/rust.security.template-unescaped-request-value.rule.yaml +47 -0
- package/rules/rust/rust.security.warp-blocking-or-panic-in-async-handler.rule.yaml +45 -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 +41 -0
- package/rules/shared/security.external-file-upload.rule.yaml +40 -0
- package/rules/shared/security.permissive-file-permissions.rule.yaml +40 -0
- package/rules/shared/security.sensitive-data-egress.rule.yaml +36 -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.duplicate-function-parameter.rule.yaml +36 -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.identical-comparison-operands.rule.yaml +36 -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.next.server-action-missing-local-auth.rule.yaml +35 -0
- package/rules/typescript/ts.performance.no-array-spread-in-hot-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-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-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-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-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-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-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.security.ajv-insecure-configuration.rule.yaml +34 -0
- package/rules/typescript/ts.security.angular-dom-sanitizer-bypass-untrusted-input.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-csrf-disabled.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-graphql-dev-tooling-exposure.rule.yaml +36 -0
- package/rules/typescript/ts.security.apollo-server-introspection-exposure.rule.yaml +35 -0
- package/rules/typescript/ts.security.apollo-server-missing-query-limits.rule.yaml +35 -0
- package/rules/typescript/ts.security.astro-vite-public-secret-define.rule.yaml +39 -0
- package/rules/typescript/ts.security.debug-statement-in-source.rule.yaml +36 -0
- package/rules/typescript/ts.security.electron-dangerous-webpreferences.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-insecure-local-state.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-missing-ipc-origin-check.rule.yaml +35 -0
- package/rules/typescript/ts.security.electron-shell-open-external-unvalidated.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-error-handler-information-disclosure.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-static-dotfiles-allow.rule.yaml +35 -0
- package/rules/typescript/ts.security.express-unbounded-body-parser.rule.yaml +34 -0
- package/rules/typescript/ts.security.express-user-controlled-static-mount.rule.yaml +35 -0
- package/rules/typescript/ts.security.fastify-excessive-body-limit.rule.yaml +34 -0
- package/rules/typescript/ts.security.fastify-public-bind-without-trust-proxy.rule.yaml +38 -0
- package/rules/typescript/ts.security.graphql-upload-without-csrf-guard.rule.yaml +36 -0
- package/rules/typescript/ts.security.iframe-missing-sandbox-attribute.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-content-security-policy-literal.rule.yaml +35 -0
- package/rules/typescript/ts.security.insecure-helmet-hardening-options.rule.yaml +36 -0
- package/rules/typescript/ts.security.jwt-insecure-signing-algorithm.rule.yaml +35 -0
- package/rules/typescript/ts.security.legacy-buffer-constructor.rule.yaml +35 -0
- package/rules/typescript/ts.security.log-injection.rule.yaml +36 -0
- package/rules/typescript/ts.security.nestjs-helmet-after-route-mount.rule.yaml +34 -0
- package/rules/typescript/ts.security.nestjs-missing-global-validation-pipe.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-skip-throttle-sensitive-route.rule.yaml +35 -0
- package/rules/typescript/ts.security.nestjs-validation-pipe-without-whitelist.rule.yaml +36 -0
- package/rules/typescript/ts.security.nuxt-public-runtime-secret.rule.yaml +38 -0
- package/rules/typescript/ts.security.open-redirect.rule.yaml +2 -0
- package/rules/typescript/ts.security.request-driven-array-index-access.rule.yaml +33 -0
- package/rules/typescript/ts.security.sensitive-data-egress.rule.yaml +1 -0
- package/rules/typescript/ts.security.ssrf.rule.yaml +1 -0
- package/rules/typescript/ts.security.unsafe-dompurify-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.unsafe-marked-version.rule.yaml +36 -0
- package/rules/typescript/ts.security.xml-parse-string-with-untrusted-input.rule.yaml +35 -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: go.testing.t-skip-without-ticket-reference
|
|
5
|
+
title: t.Skip should cite a ticket or suppression
|
|
6
|
+
summary: Go tests that call t.Skip without a nearby tracker reference are easy to forget.
|
|
7
|
+
rationale: Skips without traceability tend to linger and hide regressions.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- go
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- go
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: go.testing.t-skip-without-ticket-reference
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: medium
|
|
25
|
+
confidence: 0.7
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- go
|
|
29
|
+
message:
|
|
30
|
+
title: Add a ticket reference to `${captures.issue.text}`
|
|
31
|
+
summary: "`t.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 why the suite is intentionally bypassed.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: go.testing.time-sleep-in-unit-test
|
|
5
|
+
title: Avoid time.Sleep in Go unit tests
|
|
6
|
+
summary: Sleeping in _test.go files slows CI and hides synchronization bugs.
|
|
7
|
+
rationale: Prefer fake clocks, polling helpers, or integration suites for real delays.
|
|
8
|
+
tags:
|
|
9
|
+
- testing
|
|
10
|
+
- go
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- go
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: go.testing.time-sleep-in-unit-test
|
|
20
|
+
bind: issue
|
|
21
|
+
emit:
|
|
22
|
+
finding:
|
|
23
|
+
category: quality.testing
|
|
24
|
+
severity: low
|
|
25
|
+
confidence: 0.62
|
|
26
|
+
tags:
|
|
27
|
+
- testing
|
|
28
|
+
- go
|
|
29
|
+
message:
|
|
30
|
+
title: Replace `time.Sleep` in unit tests
|
|
31
|
+
summary: "`${captures.issue.text}` blocks a goroutine on real wall-clock time."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Inject a clock interface, shorten waits, or move the scenario to an integration test harness.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.performance.no-regex-construction-in-loop
|
|
5
|
+
title: Avoid no regex construction in loop
|
|
6
|
+
summary: Performance hygiene signal for java sources.
|
|
7
|
+
rationale: Performance hygiene signal for java sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.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
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no regex construction in loop in `java` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches java.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: java.performance.no-sync-fs-in-request-path
|
|
5
|
+
title: Avoid no sync fs in request path
|
|
6
|
+
summary: Performance hygiene signal for java sources.
|
|
7
|
+
rationale: Performance hygiene signal for java sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.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
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no sync fs in request path in `java` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches java.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: java.performance.no-unbounded-concurrency
|
|
5
|
+
title: Avoid no unbounded concurrency
|
|
6
|
+
summary: Performance hygiene signal for java sources.
|
|
7
|
+
rationale: Performance hygiene signal for java sources.
|
|
8
|
+
tags:
|
|
9
|
+
- performance
|
|
10
|
+
- java
|
|
11
|
+
- rules-catalog
|
|
12
|
+
stability: experimental
|
|
13
|
+
appliesTo: block
|
|
14
|
+
scope:
|
|
15
|
+
languages:
|
|
16
|
+
- java
|
|
17
|
+
match:
|
|
18
|
+
fact:
|
|
19
|
+
kind: java.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
|
+
- java
|
|
29
|
+
message:
|
|
30
|
+
title: Avoid no unbounded concurrency in `java` code
|
|
31
|
+
summary: "`${captures.issue.text}` matches java.performance.no-unbounded-concurrency."
|
|
32
|
+
remediation:
|
|
33
|
+
summary: Refactor this path to reduce avoidable runtime overhead.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.android-screenshot-exposure
|
|
5
|
+
title: Protect sensitive Android screens from screenshots and recents
|
|
6
|
+
summary: Sensitive activities should enable FLAG_SECURE or avoid clearing it so screen content is harder to capture.
|
|
7
|
+
rationale: Finance, authentication, and secret-bearing screens can leak through screenshots, screen recording, and recent-task previews when FLAG_SECURE is missing or cleared.
|
|
8
|
+
tags:
|
|
9
|
+
- security
|
|
10
|
+
- privacy
|
|
11
|
+
- android
|
|
12
|
+
- rules-catalog
|
|
13
|
+
stability: stable
|
|
14
|
+
appliesTo: file
|
|
15
|
+
scope:
|
|
16
|
+
languages:
|
|
17
|
+
- java
|
|
18
|
+
match:
|
|
19
|
+
fact:
|
|
20
|
+
kind: security.android-screenshot-exposure
|
|
21
|
+
bind: issue
|
|
22
|
+
emit:
|
|
23
|
+
finding:
|
|
24
|
+
category: security.privacy
|
|
25
|
+
severity: high
|
|
26
|
+
confidence: 0.82
|
|
27
|
+
tags:
|
|
28
|
+
- security
|
|
29
|
+
- privacy
|
|
30
|
+
- android
|
|
31
|
+
message:
|
|
32
|
+
title: Harden Android UI capture policy for `${captures.issue.text}`
|
|
33
|
+
summary: "`${captures.issue.text}` appears on a sensitive Android surface without an effective FLAG_SECURE posture."
|
|
34
|
+
remediation:
|
|
35
|
+
summary: Enable FLAG_SECURE for sensitive screens, avoid clearing it at runtime, and document exceptions only after explicit threat modeling.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.android-world-readable-mode
|
|
5
|
+
title: Avoid Android world-readable or world-writable IO modes
|
|
6
|
+
summary: Context files and shared preferences must not use MODE_WORLD_READABLE or MODE_WORLD_WRITABLE.
|
|
7
|
+
rationale: Legacy Android modes expose application data to other packages on the device and break sandbox expectations for secrets.
|
|
8
|
+
tags:
|
|
9
|
+
- security
|
|
10
|
+
- privacy
|
|
11
|
+
- android
|
|
12
|
+
- rules-catalog
|
|
13
|
+
stability: stable
|
|
14
|
+
appliesTo: block
|
|
15
|
+
scope:
|
|
16
|
+
languages:
|
|
17
|
+
- java
|
|
18
|
+
match:
|
|
19
|
+
fact:
|
|
20
|
+
kind: security.android-world-readable-mode
|
|
21
|
+
bind: issue
|
|
22
|
+
emit:
|
|
23
|
+
finding:
|
|
24
|
+
category: security.privacy
|
|
25
|
+
severity: high
|
|
26
|
+
confidence: 0.95
|
|
27
|
+
tags:
|
|
28
|
+
- security
|
|
29
|
+
- storage
|
|
30
|
+
- android
|
|
31
|
+
message:
|
|
32
|
+
title: Replace unsafe Android IO mode in `${captures.issue.text}`
|
|
33
|
+
summary: "`${captures.issue.text}` opts into MODE_WORLD_READABLE or MODE_WORLD_WRITABLE, which weakens app sandbox isolation."
|
|
34
|
+
remediation:
|
|
35
|
+
summary: Use MODE_PRIVATE or scoped storage APIs instead of world-readable or world-writable modes.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.jpa-concatenated-query
|
|
5
|
+
title: Do not build JPA or JDBC queries by concatenating user-controlled input
|
|
6
|
+
summary: >-
|
|
7
|
+
`createQuery`, `createNativeQuery`, `JdbcTemplate` calls, and string-based `@Query` values must not stitch SQL with request data using `+`, `String.format`, or similar.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Dynamic SQL built from untrusted fragments is a direct injection surface; parameterized queries and named parameters are the safe default.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- jpa
|
|
14
|
+
- jdbc
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.java"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/src/test/**"
|
|
26
|
+
- "**/tests/**"
|
|
27
|
+
- "**/*Test.java"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: java.security.jpa-concatenated-query
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: security.sql-injection
|
|
35
|
+
severity: critical
|
|
36
|
+
confidence: 0.84
|
|
37
|
+
tags:
|
|
38
|
+
- security
|
|
39
|
+
- java
|
|
40
|
+
- sql-injection
|
|
41
|
+
message:
|
|
42
|
+
title: Replace dynamic SQL construction in `${captures.issue.text}`
|
|
43
|
+
summary: >-
|
|
44
|
+
`${captures.issue.text}` builds a query from concatenated or formatted fragments; bind parameters instead of embedding user-controlled text.
|
|
45
|
+
remediation:
|
|
46
|
+
summary: >-
|
|
47
|
+
Use JPQL named parameters, `CriteriaUpdate`, or prepared JDBC statements with bound parameters; never interpolate request values into query text.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.reflected-output-from-request
|
|
5
|
+
title: Avoid reflecting servlet request data through response writers
|
|
6
|
+
summary: Servlet writers should not emit raw request parameters or headers without encoding or policy checks.
|
|
7
|
+
rationale: Writing request-controlled strings directly into HTTP responses is a common reflected XSS vector for servlet stacks.
|
|
8
|
+
tags:
|
|
9
|
+
- security
|
|
10
|
+
- xss
|
|
11
|
+
- servlet
|
|
12
|
+
- rules-catalog
|
|
13
|
+
stability: experimental
|
|
14
|
+
appliesTo: block
|
|
15
|
+
scope:
|
|
16
|
+
languages:
|
|
17
|
+
- java
|
|
18
|
+
match:
|
|
19
|
+
fact:
|
|
20
|
+
kind: security.java-reflected-output-from-request
|
|
21
|
+
bind: issue
|
|
22
|
+
emit:
|
|
23
|
+
finding:
|
|
24
|
+
category: security.injection
|
|
25
|
+
severity: high
|
|
26
|
+
confidence: 0.76
|
|
27
|
+
tags:
|
|
28
|
+
- security
|
|
29
|
+
- xss
|
|
30
|
+
- servlet
|
|
31
|
+
message:
|
|
32
|
+
title: Encode or validate output before `${captures.issue.text}`
|
|
33
|
+
summary: "`${captures.issue.text}` forwards request-derived content through the servlet response writer without an obvious encoding guard."
|
|
34
|
+
remediation:
|
|
35
|
+
summary: Contextually encode output for HTML or JSON consumers, validate redirect-like flows separately, and prefer templating APIs that auto-escape.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.servlet-insecure-cookie
|
|
5
|
+
title: Harden servlet session and auth cookies
|
|
6
|
+
summary: Session-like cookies must not disable HttpOnly or Secure, and explicit insecure builder flags should be removed.
|
|
7
|
+
rationale: Missing HttpOnly and Secure flags expose cookies to XSS and network interception; disabling them makes theft materially easier.
|
|
8
|
+
tags:
|
|
9
|
+
- security
|
|
10
|
+
- session
|
|
11
|
+
- servlet
|
|
12
|
+
- rules-catalog
|
|
13
|
+
stability: stable
|
|
14
|
+
appliesTo: block
|
|
15
|
+
scope:
|
|
16
|
+
languages:
|
|
17
|
+
- java
|
|
18
|
+
match:
|
|
19
|
+
fact:
|
|
20
|
+
kind: security.servlet-insecure-cookie
|
|
21
|
+
bind: issue
|
|
22
|
+
emit:
|
|
23
|
+
finding:
|
|
24
|
+
category: security.authentication
|
|
25
|
+
severity: high
|
|
26
|
+
confidence: 0.78
|
|
27
|
+
tags:
|
|
28
|
+
- security
|
|
29
|
+
- cookie
|
|
30
|
+
- servlet
|
|
31
|
+
message:
|
|
32
|
+
title: Review insecure cookie construction in `${captures.issue.text}`
|
|
33
|
+
summary: "`${captures.issue.text}` builds or adjusts cookies with risky defaults or explicitly weakened HttpOnly/Secure flags."
|
|
34
|
+
remediation:
|
|
35
|
+
summary: Prefer ResponseCookie with Secure and HttpOnly enabled, SameSite appropriate for your topology, and minimize lifetime on authentication cookies.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-actuator-health-details-always
|
|
5
|
+
title: Avoid always-on Spring Boot health details in external profiles
|
|
6
|
+
summary: >-
|
|
7
|
+
`management.endpoint.health.show-details=always` (or YAML equivalent) publishes detailed health payloads to any caller, which often leaks dependency and infrastructure facts.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Detailed health should be reserved for authenticated operators or internal networks; `always` removes that gate for anonymous clients.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- spring-boot
|
|
14
|
+
- actuator
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: file
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
match:
|
|
22
|
+
fact:
|
|
23
|
+
kind: java.security.spring-actuator-health-details-always
|
|
24
|
+
bind: issue
|
|
25
|
+
emit:
|
|
26
|
+
finding:
|
|
27
|
+
category: security.misconfiguration
|
|
28
|
+
severity: medium
|
|
29
|
+
confidence: 0.76
|
|
30
|
+
tags:
|
|
31
|
+
- security
|
|
32
|
+
- java
|
|
33
|
+
- actuator
|
|
34
|
+
message:
|
|
35
|
+
title: Scope health detail visibility for `${captures.issue.text}`
|
|
36
|
+
summary: >-
|
|
37
|
+
`${captures.issue.text}` always exposes detailed health information; prefer `when-authorized` or role-based access outside tightly controlled environments.
|
|
38
|
+
remediation:
|
|
39
|
+
summary: >-
|
|
40
|
+
Switch to `when-authorized`, protect `/actuator/**` with Spring Security, and keep verbose health on internal-only ports or profiles.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-actuator-sensitive-exposure
|
|
5
|
+
title: Restrict Spring Boot actuator web exposure to non-sensitive endpoints
|
|
6
|
+
summary: >-
|
|
7
|
+
Actuator `management.endpoints.web.exposure.include` should not expose wildcards or high-risk endpoints (such as `env`, `beans`, or `heapdump`) without deliberate access control.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Over-exposed actuators leak configuration, secrets material, and JVM internals that attackers can use to pivot or crash the service.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- spring-boot
|
|
14
|
+
- actuator
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: file
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
match:
|
|
22
|
+
fact:
|
|
23
|
+
kind: java.security.spring-actuator-sensitive-exposure
|
|
24
|
+
bind: issue
|
|
25
|
+
emit:
|
|
26
|
+
finding:
|
|
27
|
+
category: security.misconfiguration
|
|
28
|
+
severity: high
|
|
29
|
+
confidence: 0.8
|
|
30
|
+
tags:
|
|
31
|
+
- security
|
|
32
|
+
- java
|
|
33
|
+
- actuator
|
|
34
|
+
message:
|
|
35
|
+
title: Narrow actuator exposure for `${captures.issue.text}`
|
|
36
|
+
summary: >-
|
|
37
|
+
`${captures.issue.text}` exposes sensitive actuator endpoints; enumerate only what you need and protect them with authentication and network controls.
|
|
38
|
+
remediation:
|
|
39
|
+
summary: >-
|
|
40
|
+
Replace wildcards with explicit endpoint lists, move sensitive endpoints off public networks, and pair exposure with Spring Security rules or management port isolation.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-csrf-globally-disabled
|
|
5
|
+
title: Avoid disabling Spring CSRF protection without a stateless API hardening story
|
|
6
|
+
summary: >-
|
|
7
|
+
Disabling CSRF globally is unsafe for cookie-backed browser sessions unless the app is clearly hardened as a stateless API (for example OAuth2 resource server with stateless sessions).
|
|
8
|
+
rationale: >-
|
|
9
|
+
CSRF protects browser clients that send session cookies; turning it off without token-based or stateless mitigations invites cross-site request forgery against privileged actions.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- spring
|
|
14
|
+
- spring-security
|
|
15
|
+
- csrf
|
|
16
|
+
- rules-catalog
|
|
17
|
+
stability: experimental
|
|
18
|
+
appliesTo: block
|
|
19
|
+
scope:
|
|
20
|
+
languages:
|
|
21
|
+
- java
|
|
22
|
+
paths:
|
|
23
|
+
include:
|
|
24
|
+
- "**/*.java"
|
|
25
|
+
exclude:
|
|
26
|
+
- "**/src/test/**"
|
|
27
|
+
- "**/tests/**"
|
|
28
|
+
- "**/*Test.java"
|
|
29
|
+
match:
|
|
30
|
+
fact:
|
|
31
|
+
kind: java.security.spring-csrf-globally-disabled
|
|
32
|
+
bind: issue
|
|
33
|
+
emit:
|
|
34
|
+
finding:
|
|
35
|
+
category: security.misconfiguration
|
|
36
|
+
severity: high
|
|
37
|
+
confidence: 0.78
|
|
38
|
+
tags:
|
|
39
|
+
- security
|
|
40
|
+
- java
|
|
41
|
+
- spring-security
|
|
42
|
+
- csrf
|
|
43
|
+
message:
|
|
44
|
+
title: Revisit CSRF configuration near `${captures.issue.text}`
|
|
45
|
+
summary: >-
|
|
46
|
+
`${captures.issue.text}` disables CSRF; keep it enabled for session-backed MVC, or move to explicit stateless API patterns and document the threat model.
|
|
47
|
+
remediation:
|
|
48
|
+
summary: >-
|
|
49
|
+
Prefer CSRF tokens for cookie sessions, use `oauth2ResourceServer` with JWT for APIs, or set `SessionCreationPolicy.STATELESS` with a reviewed token story instead of blanket `csrf().disable()`.
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-debug-exposure
|
|
5
|
+
title: Avoid Spring Boot debug and actuator exposure in shipped configuration
|
|
6
|
+
summary: Spring Boot configuration should not force debug logging or wildcard actuator exposure.
|
|
7
|
+
rationale: Debug modes and fully exposed actuator endpoints leak internals and expand remote attack surface when configs ship to production.
|
|
8
|
+
tags:
|
|
9
|
+
- security
|
|
10
|
+
- spring
|
|
11
|
+
- configuration
|
|
12
|
+
- rules-catalog
|
|
13
|
+
stability: stable
|
|
14
|
+
appliesTo: file
|
|
15
|
+
scope:
|
|
16
|
+
languages:
|
|
17
|
+
- java
|
|
18
|
+
match:
|
|
19
|
+
fact:
|
|
20
|
+
kind: security.spring-debug-exposure
|
|
21
|
+
bind: issue
|
|
22
|
+
emit:
|
|
23
|
+
finding:
|
|
24
|
+
category: security.secrets
|
|
25
|
+
severity: medium
|
|
26
|
+
confidence: 0.8
|
|
27
|
+
tags:
|
|
28
|
+
- security
|
|
29
|
+
- spring
|
|
30
|
+
- disclosure
|
|
31
|
+
message:
|
|
32
|
+
title: Tighten Spring configuration near `${captures.issue.text}`
|
|
33
|
+
summary: "`${captures.issue.text}` enables verbose debugging or permissive actuator exposure that should stay out of production defaults."
|
|
34
|
+
remediation:
|
|
35
|
+
summary: Remove debug=true overrides, scope logging levels deliberately, and enumerate only required actuator endpoints behind authentication.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-permit-all-default
|
|
5
|
+
title: Avoid Spring Security chains that leave every request anonymous by default
|
|
6
|
+
summary: >-
|
|
7
|
+
Production HTTP security chains should not end with a broad permit-all fallback such as `anyRequest().permitAll()` or `requestMatchers("/**").permitAll()`.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Anonymous-by-default authorization lets unauthenticated callers reach handlers that were meant to be protected, which often leads to broken access control and data exposure.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- spring
|
|
14
|
+
- spring-security
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.java"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/src/test/**"
|
|
26
|
+
- "**/tests/**"
|
|
27
|
+
- "**/*Test.java"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: java.security.spring-permit-all-default
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: security.authentication
|
|
35
|
+
severity: high
|
|
36
|
+
confidence: 0.82
|
|
37
|
+
tags:
|
|
38
|
+
- security
|
|
39
|
+
- java
|
|
40
|
+
- spring-security
|
|
41
|
+
message:
|
|
42
|
+
title: Tighten Spring Security authorization instead of `${captures.issue.text}`
|
|
43
|
+
summary: >-
|
|
44
|
+
`${captures.issue.text}` leaves requests broadly permitted; require authentication or explicit scoped rules for non-public routes.
|
|
45
|
+
remediation:
|
|
46
|
+
summary: >-
|
|
47
|
+
Replace broad permit-all with authenticated or role-based rules, keep public paths explicit, and add integration tests that assert unauthorized access is rejected.
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.spring-webmvc-unrestricted-data-binding
|
|
5
|
+
title: Constrain Spring MVC data binding for domain objects
|
|
6
|
+
summary: >-
|
|
7
|
+
Binding request parameters directly into entity-like models without `setAllowedFields` / `@InitBinder` controls risks mass-assignment privilege escalation.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Attackers can post unexpected fields (for example `role=admin`) that map onto persistent entities unless binding is explicitly allow-listed.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- spring-mvc
|
|
14
|
+
- mass-assignment
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.java"
|
|
24
|
+
exclude:
|
|
25
|
+
- "**/src/test/**"
|
|
26
|
+
- "**/tests/**"
|
|
27
|
+
- "**/*Test.java"
|
|
28
|
+
match:
|
|
29
|
+
fact:
|
|
30
|
+
kind: java.security.spring-webmvc-unrestricted-data-binding
|
|
31
|
+
bind: issue
|
|
32
|
+
emit:
|
|
33
|
+
finding:
|
|
34
|
+
category: security.misconfiguration
|
|
35
|
+
severity: high
|
|
36
|
+
confidence: 0.74
|
|
37
|
+
tags:
|
|
38
|
+
- security
|
|
39
|
+
- java
|
|
40
|
+
- spring-mvc
|
|
41
|
+
message:
|
|
42
|
+
title: Add binding guards instead of `${captures.issue.text}`
|
|
43
|
+
summary: >-
|
|
44
|
+
`${captures.issue.text}` suggests unconstrained binding; use DTOs, `@InitBinder#setAllowedFields`, or constructor binding with immutable commands.
|
|
45
|
+
remediation:
|
|
46
|
+
summary: >-
|
|
47
|
+
Prefer dedicated request DTOs, declare allowed fields explicitly, and avoid binding security-sensitive properties from raw requests.
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
apiVersion: critiq.dev/v1alpha1
|
|
2
|
+
kind: Rule
|
|
3
|
+
metadata:
|
|
4
|
+
id: java.security.template-unescaped-user-output
|
|
5
|
+
title: Escape template output that reflects request or model data
|
|
6
|
+
summary: >-
|
|
7
|
+
Thymeleaf `th:utext`, JSP scriptlets, and FreeMarker `?no_esc` patterns must not render untrusted request or model values without an explicit sanitization strategy.
|
|
8
|
+
rationale: >-
|
|
9
|
+
Non-escaped template sinks turn reflected input into XSS, which compromises browser sessions and administrative workflows.
|
|
10
|
+
tags:
|
|
11
|
+
- security
|
|
12
|
+
- java
|
|
13
|
+
- templates
|
|
14
|
+
- xss
|
|
15
|
+
- rules-catalog
|
|
16
|
+
stability: experimental
|
|
17
|
+
appliesTo: block
|
|
18
|
+
scope:
|
|
19
|
+
languages:
|
|
20
|
+
- java
|
|
21
|
+
paths:
|
|
22
|
+
include:
|
|
23
|
+
- "**/*.html"
|
|
24
|
+
- "**/*.htm"
|
|
25
|
+
- "**/*.java"
|
|
26
|
+
exclude:
|
|
27
|
+
- "**/src/test/**"
|
|
28
|
+
- "**/tests/**"
|
|
29
|
+
- "**/*Test.java"
|
|
30
|
+
match:
|
|
31
|
+
fact:
|
|
32
|
+
kind: java.security.template-unescaped-user-output
|
|
33
|
+
bind: issue
|
|
34
|
+
emit:
|
|
35
|
+
finding:
|
|
36
|
+
category: security.injection
|
|
37
|
+
severity: high
|
|
38
|
+
confidence: 0.8
|
|
39
|
+
tags:
|
|
40
|
+
- security
|
|
41
|
+
- java
|
|
42
|
+
- xss
|
|
43
|
+
message:
|
|
44
|
+
title: Prefer escaped template output instead of `${captures.issue.text}`
|
|
45
|
+
summary: >-
|
|
46
|
+
`${captures.issue.text}` renders template content without default escaping; switch to escaped directives or sanitize with a trusted library.
|
|
47
|
+
remediation:
|
|
48
|
+
summary: >-
|
|
49
|
+
Use Thymeleaf `th:text`, avoid raw JSP expressions for request data, and keep FreeMarker auto-escaping on unless a vetted sanitizer wraps dynamic HTML.
|