CVE-2026-46333 in Kubernetes: unset seccomp let pods reach pidfd_getfd, RuntimeDefault blocked it
CVE-2026-46333 is the Linux __ptrace_may_access() bug Qualys disclosed on May 15. Most of the public discussion I saw centered on ssh-keysign-pwn, but for Kubernetes the more interesting part was the underlying pidfd_getfd path.
Pods share the node kernel, and a pod image can contain its own setuid helper. So I wanted to know whether a normal workload could reach the same fd-duplication primitive without host namespaces, hostPath, or touching node files.
We built a deliberately boring target for this: a root-owned disposable file inside the test image, a non-root process, and a purpose-built setuid helper in the same image. The attacker could not open the file directly. The helper opened it while privileged, dropped back to the non-root UID, and exited. The test was whether the attacker could race pidfd_getfd and duplicate that helper's fd after the vulnerable exit state.
We tested local Docker, local kind, EKS Auto Mode on Bottlerocket, and a private mixed-node lab cluster.
The short version:
- EKS Auto Mode / Bottlerocket reproduced controlled fd theft on all 4 tested nodes when seccomp was unset.
- Explicit
seccompProfile.type: Unconfinedreproduced the same result in the EKS lab. RuntimeDefaultblockedpidfd_getfd.- PSS Restricted blocked
pidfd_getfdand also stopped the setuid helper from opening the file becauseallowPrivilegeEscalation: falsesetNoNewPrivs. - PSS Baseline blocked explicit
UnconfinedandhostPID, but did not fix unset seccomp. The Baseline + unset-seccomp case still reproduced controlled fd theft. - Local kind matched the same broad pattern.
- A Debian arm64 worker in our private lab reproduced the unset/Unconfined result.
- Our Talos worker blocked normal pods with effective
Seccomp: 2; even in a deliberately unconfined lab namespace, it did not reproduce in 500 attempts, which appears consistent withptrace_scope=2adding another gate.
The part I would not gloss over is Baseline. It can reject some obvious knobs, like explicit Unconfined and hostPID, while still allowing a pod where seccomp is simply missing. In this test, that missing field was the difference between pidfd_getfd being reachable and blocked.
For clusters, I would check:
- workloads where effective seccomp is unset or
Unconfined - containers where
allowPrivilegeEscalationis true or unset - namespaces that rely on PSS Baseline for untrusted workloads
- node image/kernel status for CVE-2026-46333
- whether your runtime's default seccomp profile actually denies
pidfd_getfd - whether node-level ptrace hardening, especially Yama
ptrace_scope, is present
The mitigation stack is the boring one: patch affected node kernels, enforce RuntimeDefault or a tested Localhost seccomp profile for untrusted workloads, use Restricted where workloads tolerate it, set allowPrivilegeEscalation: false, drop capabilities, and keep CI/build/plugin/customer-controlled workloads away from sensitive workloads.
This does not prove host root, container escape, Kubernetes Secret access, node persistence, or theft of real host files. It also does not mean every EKS/Bottlerocket node is exploitable or every Talos cluster blocks this path. The point is narrower: in our EKS and kind labs, ordinary unset-seccomp pods could reproduce controlled fd theft; RuntimeDefault and Restricted changed the outcome.
We are not publishing exploit code, lab source, or reproduction commands. The writeup has the full matrix and defensive checks:
https://juliet.sh/blog/cve-2026-46333-kubernetes-eks-bottlerocket-seccomp-pidfd