GHSA-VCHH-R53J-8MPW

Vulnerability from github – Published: 2026-07-28 20:16 – Updated: 2026-07-28 20:16
VLAI
Summary
Fission: HTTPTrigger admission omits RelativeURL / Prefix validation; kubectl apply bypasses CLI checks
Details

HTTPTriggerSpec.Validate() validated Methods, FunctionReference, Host, IngressConfig, and CorsConfig, but silently skipped RelativeURL and Prefix. Those two fields were validated at the CLI level only (pkg/fission-cli/cmd/httptrigger/create.go:83). The post-CRD-modernization webhook for HTTPTrigger was retired in favor of API-server CEL — and CEL had no rules on those fields either — so an HTTPTrigger created via kubectl apply or a direct Kubernetes REST API call bypassed every URL-level check.

A tenant with HTTPTrigger create permission could therefore create triggers whose RelativeURL or Prefix:

  • was empty (with both fields unset, the trigger has no URL),
  • did not start with /,
  • was exactly / (claiming the entire router root),
  • contained .. traversal segments (e.g. /api/../admin),
  • collided with router-owned routes: /router-healthz, /readyz, /_version, /auth/login,
  • collided with the router-internal function prefix /fission-function/<ns>/<name>.

Affected

  • Project: github.com/fission/fission
  • Versions: all versions through v1.24.0
  • Audited commit: 647c141
  • Component: pkg/apis/core/v1/validation.go:HTTPTriggerSpec.Validate (and the missing CEL on HTTPTriggerSpec)
  • Configuration: default

Fix section (paste into the Fix / Patches field)

Fixed in v1.25.0 by:

  • PR #3464 (commit 0deed6bf) — enforce the path-safety invariants at both admission layers so the API server's CEL evaluation and the Go-side HTTPTriggerSpec.Validate() agree:
  • Three +kubebuilder:validation:XValidation rules on HTTPTriggerSpec (the API server's CEL admission gate, regenerated into crds/v1/fission.io_httptriggers.yaml):
    • at least one of relativeurl or prefix must be non-empty;
    • relativeurl, when set, must start with /, must not be /, must contain no .. segment, must not be in the reserved exact-path set, and must not start with /fission-function/;
    • prefix, when set, the same rules guarded by has(self.prefix).
  • validateTriggerPath helper in pkg/apis/core/v1/validation.go, invoked from HTTPTriggerSpec.Validate(), mirrors the CEL rules so the CLI's early rejection and the router reconciler's status-Condition path match what the API server admits.

Regression coverage: a new TestHTTPTriggerSpecValidate_Path table in pkg/apis/core/v1/validation_validators_test.go exercises every PoC case from the advisory plus literal ..-prefixed-segment positives that must remain allowed.

Show details on source website

{
  "affected": [
    {
      "database_specific": {
        "last_known_affected_version_range": "\u003c= 1.24.0"
      },
      "package": {
        "ecosystem": "Go",
        "name": "github.com/fission/fission"
      },
      "ranges": [
        {
          "events": [
            {
              "introduced": "0"
            },
            {
              "fixed": "1.25.0"
            }
          ],
          "type": "ECOSYSTEM"
        }
      ]
    }
  ],
  "aliases": [
    "CVE-2026-50569"
  ],
  "database_specific": {
    "cwe_ids": [
      "CWE-20"
    ],
    "github_reviewed": true,
    "github_reviewed_at": "2026-07-28T20:16:00Z",
    "nvd_published_at": "2026-06-10T18:17:13Z",
    "severity": "MODERATE"
  },
  "details": "`HTTPTriggerSpec.Validate()` validated `Methods`, `FunctionReference`, `Host`, `IngressConfig`, and `CorsConfig`, but silently skipped `RelativeURL` and `Prefix`. Those two fields were validated at the CLI level only\n(`pkg/fission-cli/cmd/httptrigger/create.go:83`). The post-CRD-modernization webhook for HTTPTrigger was retired in favor of API-server CEL \u2014 and CEL had no rules on those fields either \u2014 so an HTTPTrigger created via `kubectl apply` or\na direct Kubernetes REST API call bypassed every URL-level check.\n\nA tenant with HTTPTrigger create permission could therefore create triggers whose `RelativeURL` or `Prefix`:\n\n- was empty (with both fields unset, the trigger has no URL),\n- did not start with `/`,\n- was exactly `/` (claiming the entire router root),\n- contained `..` traversal segments (e.g. `/api/../admin`),\n- collided with router-owned routes: `/router-healthz`, `/readyz`, `/_version`, `/auth/login`,\n- collided with the router-internal function prefix `/fission-function/\u003cns\u003e/\u003cname\u003e`.\n\n### Affected\n\n- Project: `github.com/fission/fission`\n- Versions: all versions through v1.24.0\n- Audited commit: `647c141`\n- Component: `pkg/apis/core/v1/validation.go:HTTPTriggerSpec.Validate` (and the missing CEL on `HTTPTriggerSpec`)\n- Configuration: default\n\nFix section (paste into the Fix / Patches field)\n\nFixed in [v1.25.0](https://github.com/fission/fission/releases/tag/v1.25.0) by:\n\n- [PR #3464](https://github.com/fission/fission/pull/3464) (commit [`0deed6bf`](https://github.com/fission/fission/commit/0deed6bf2af2a0c0c6094b25e1a0afad36773e3b)) \u2014 enforce the path-safety invariants at both admission layers so the API\nserver\u0027s CEL evaluation and the Go-side `HTTPTriggerSpec.Validate()` agree:\n  - Three `+kubebuilder:validation:XValidation` rules on `HTTPTriggerSpec` (the API server\u0027s CEL admission gate, regenerated into `crds/v1/fission.io_httptriggers.yaml`):\n    - at least one of `relativeurl` or `prefix` must be non-empty;\n    - `relativeurl`, when set, must start with `/`, must not be `/`, must contain no `..` segment, must not be in the reserved exact-path set, and must not start with `/fission-function/`;\n    - `prefix`, when set, the same rules guarded by `has(self.prefix)`.\n  - `validateTriggerPath` helper in `pkg/apis/core/v1/validation.go`, invoked from `HTTPTriggerSpec.Validate()`, mirrors the CEL rules so the CLI\u0027s early rejection and the router reconciler\u0027s status-Condition path match what the API\nserver admits.\n\nRegression coverage: a new `TestHTTPTriggerSpecValidate_Path` table in `pkg/apis/core/v1/validation_validators_test.go` exercises every PoC case from the advisory plus literal `..`-prefixed-segment positives that must remain allowed.",
  "id": "GHSA-vchh-r53j-8mpw",
  "modified": "2026-07-28T20:16:00Z",
  "published": "2026-07-28T20:16:00Z",
  "references": [
    {
      "type": "WEB",
      "url": "https://github.com/fission/fission/security/advisories/GHSA-vchh-r53j-8mpw"
    },
    {
      "type": "ADVISORY",
      "url": "https://nvd.nist.gov/vuln/detail/CVE-2026-50569"
    },
    {
      "type": "WEB",
      "url": "https://github.com/fission/fission/pull/3464"
    },
    {
      "type": "WEB",
      "url": "https://github.com/fission/fission/commit/0deed6bf3f26bc0f10e9130cd0d479b0b9f5f609"
    },
    {
      "type": "PACKAGE",
      "url": "https://github.com/fission/fission"
    },
    {
      "type": "WEB",
      "url": "https://github.com/fission/fission/releases/tag/v1.25.0"
    }
  ],
  "schema_version": "1.4.0",
  "severity": [
    {
      "score": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N",
      "type": "CVSS_V3"
    }
  ],
  "summary": "Fission: HTTPTrigger admission omits RelativeURL / Prefix validation; kubectl apply bypasses CLI checks"
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Forecast uses a logistic model when the trend is rising, or an exponential decay model when the trend is falling. Fitted via linearized least squares.

Sightings

Author Source Type Date Other

Nomenclature

  • Seen: The vulnerability was mentioned, discussed, or observed by the user.
  • Confirmed: The vulnerability has been validated from an analyst's perspective.
  • Published Proof of Concept: A public proof of concept is available for this vulnerability.
  • Exploited: The vulnerability was observed as exploited by the user who reported the sighting.
  • Patched: The vulnerability was observed as successfully patched by the user who reported the sighting.
  • Not exploited: The vulnerability was not observed as exploited by the user who reported the sighting.
  • Not confirmed: The user expressed doubt about the validity of the vulnerability.
  • Not patched: The vulnerability was not observed as successfully patched by the user who reported the sighting.

Loading…

Detection rules are retrieved from Rulezet.

Loading…

Loading…