Go · github.com/fission/fission
Fission Container Executor Function PodSpec Injection Leading to Node Escape
Fission's Container Executor path lets a tenant supply Function.spec.podspec directly; the executor merges it into the executor-built podspec and creates a Deployment whose pods run the user's container image.
Two flaws compounded:
pkg/apis/core/v1/validation.go::FunctionSpec.Validate only checked that spec.PodSpec != nil when executorType: container; it did not inspect the content of spec.PodSpec.pkg/executor/util/merge.go::MergePodSpec unconditionally forwarded hostPID, hostNetwork, hostIPC, hostPath volumes, serviceAccountName, and container privileged into the Deployment spec via the container-executor sink
(pkg/executor/executortype/container/deployment.go::getDeploymentSpec).A tenant with only functions.fission.io/create could deploy a Function with a crafted podspec that mounted the host root filesystem and shared host namespaces. The executor — running under its high-privilege SA, which holds
deployments/create on the function namespace — created that Deployment on the tenant's behalf, turning Function-create into effective deployments/create with arbitrary pod-security configuration.
This is the Function-CRD sibling of GHSA-gx55-f84r-v3r7 / GHSA-wmgg-3p4h-48x7, with a lower attack threshold: regular function developers typically hold functions/create but not environments/create.
A tenant with only functions.fission.io/create is escalated to node escape via a privileged, host-namespace pod scheduled by the executor.
Fixed in #3391 and released in v1.24.0.
FunctionSpec.Validate now calls ValidatePodSpecSafety("Function.spec.podspec", spec.PodSpec) after the existing spec.PodSpec == nil check.verbs=create;update, so it picks up the new validation with no marker change.util.MergePodSpec.See GHSA-gx55-f84r-v3r7 for the detailed fix.
Functions whose spec.podspec sets host namespaces, hostPath volumes, container privileged/allowPrivilegeEscalation, dangerous Linux capabilities, or a serviceAccountName override are now rejected at admission. Legitimate
container-executor functions that set image, command, args, env, resources, nodeSelector, tolerations, affinity, non-hostPath volumes, or volumeMounts are unaffected.
Is your project exposed to this? Stateward checks every dependency on every pull request and flags it only if your code actually reaches it.
Check my repoSources: CISA KEV (public domain), OSV.dev & GitHub Advisory Database (CC-BY-4.0), FIRST EPSS, NVD/CWE (public domain). Served live from the Stateward advisory database.