{"id":"CVE-2026-120306","kind":"vulnerability","aliases":["CVE-2026-120306"],"related":[],"title":"Beta9: tenant image builds escape to the build worker host","description":"Beta9 turns each shell command in a tenant image definition into a Dockerfile RUN line and executes it with Buildah on the build worker. The worker image sets BUILDAH_ISOLATION=chroot, and no buildah invocation passes --isolation, so the step only changes its filesystem root. It keeps the worker pod's PID, network, IPC, and user namespaces, runs as uid 0, and holds CAP_DAC_OVERRIDE. PID 1 in that procfs is the worker entrypoint, so /proc/1/root is the worker container's filesystem and is writable. That filesystem contains the runc, buildah, and runsc binaries the worker uses to start tenant containers, the worker's Kubernetes service account token, and the host directories mounted into the pod. Worker pods are privileged. Clip v2 layered builds are the default, so a tenant with a workspace token reaches this by submitting one image build. The read-only proof confirmed the shared namespaces, CAP_DAC_OVERRIDE, and that the worker's runc binary is visible at /proc/1/root. Fixed in worker 0.1.756: Buildah RUN steps, including the WORKDIR mkdir, use OCI isolation with private PID, IPC, and network namespaces, and tenant ARG values are passed only into the build container.","summary":"Beta9 runs each shell command from a tenant image definition as a Buildah RUN step using chroot isolation, which leaves the worker's PID, network, IPC and user namespaces shared and the process running as root with CAP_DAC_OVERRIDE. A tenant with a workspace token can use one image build to write into the worker container filesystem, reaching the runc, buildah and runsc binaries, the worker's Kubernetes service account token and mounted host directories.","severity":"critical","cvss":9.9,"epss":null,"exploited":false,"exploited_at":null,"products":[],"ecosystems":[],"tags":["beta9","container-builds","kubernetes","other","self-hosted"],"not_affected_if":["single-tenant-builds","worker-0.1.756-or-later"],"how_to_check":"- Check the worker image version; the sources say the fix is in worker `0.1.756`.\n- Check whether build workers run with `BUILDAH_ISOLATION=chroot` and whether buildah calls pass `--isolation`.\n- Check whether worker pods share host PID, network or IPC namespaces and whether they run privileged.","fix":"- Beta9 worker: move to `0.1.756` or later, which uses OCI isolation for Buildah RUN steps.","status":"open","published_at":"2026-11-01T13:18:01+00:00","first_seen_at":"2026-11-01T13:20:07+00:00","triaged_at":"2026-11-01T13:21:53+00:00","updated_at":"2026-11-01T13:21:53+00:00","category":"other","confidence":0.8,"triage":{"at":"2026-11-01T13:21:53Z","model":"claude-haiku-5-5","output":{"fix":"- Beta9 worker: move to `0.1.756` or later, which uses OCI isolation for Buildah RUN steps.","reach":"network","title":"Beta9: tenant image builds escape to the build worker host","impact":"high","summary":"Beta9 runs each shell command from a tenant image definition as a Buildah RUN step using chroot isolation, which leaves the worker's PID, network, IPC and user namespaces shared and the process running as root with CAP_DAC_OVERRIDE. A tenant with a workspace token can use one image build to write into the worker container filesystem, reaching the runc, buildah and runsc binaries, the worker's Kubernetes service account token and mounted host directories.","audience":"businesses","category":"other","nicknames":[],"who_cares":["beta9","kubernetes","self-hosted","container-builds"],"confidence":0.8,"fix_status":"available","needs_auth":"yes","worst_case":"Tenant reads and writes worker filesystem, service account token, and host mounts","analyst_note":"Confirm the affected version range beyond the fixed 0.1.756 and whether the NVD entry lists a Beta9 advisory with its own URL.","how_to_check":"- Check the worker image version; the sources say the fix is in worker `0.1.756`.\n- Check whether build workers run with `BUILDAH_ISOLATION=chroot` and whether buildah calls pass `--isolation`.\n- Check whether worker pods share host PID, network or IPC namespaces and whether they run privileged.","plain_action":"","needs_analyst":true,"not_affected_if":["worker-0.1.756-or-later","single-tenant-builds"],"who_is_affected":"Teams running Beta9 build workers that accept image definitions from tenants, particularly with Clip v2 layered builds, which are the default. Exposure needs a tenant workspace token and worker pods that are privileged with shared namespaces. Deployments where only trusted users submit builds, or that already run the fixed worker, are not exposed.","user_interaction":"no","needs_special_setup":"no","severity_if_unknown":"critical"},"cost_usd":0.000808,"input_tokens":4465,"output_tokens":723,"severity_before":"critical"},"analyst_status":null,"analyst_note":null,"search":"'-120306':13A,16A '-2026':12A,15A '/proc/1/root':178C,266C '0':162C '0.1.756':270C '1':169C 'account':96B,209C 'arg':290C 'beta9':1A,17B,26B,102C 'binari':90B,196C,262C 'build':4A,8A,20B,76B,124C,226C,243C,297C 'buildah':38B,87B,121C,130C,135C,193C,271C 'cap':63B,165C,253C 'chang':143C 'chroot':42B,132C 'clip':223C 'command':30B,106C 'confirm':249C 'contain':19B,82B,182C,190C,203C,298C 'container-build':18B 'cve':11A,14A 'dac':64B,166C,254C 'default':229C 'definit':35B,111C 'directori':101B,214C 'dockerfil':114C 'entrypoint':176C 'escap':5A 'execut':118C 'filesystem':83B,145C,184C,189C 'fix':267C 'hold':164C 'host':10A,25B,100B,213C 'imag':3A,34B,75B,110C,128C,242C 'includ':274C 'invoc':136C 'ipc':51B,155C,284C 'isol':43B,131C,138C,280C 'keep':148C 'kubernet':21B,94B,207C 'layer':225C 'leav':45B 'line':116C 'mkdir':277C 'mount':99B,215C 'namespac':54B,158C,252C,287C 'network':50B,154C,286C 'oci':279C 'one':74B,241C 'overrid':65B,167C,255C 'pass':137C,293C 'pid':49B,153C,168C,283C 'pod':151C,218C,220C 'privat':282C 'privileg':222C 'process':58B 'procf':172C 'proof':248C 'reach':84B,237C 'read':246C 'read-on':245C 'root':61B,146C 'run':27B,39B,59B,115C,159C,272C 'runc':86B,192C,261C 'runsc':89B,195C 'self':24B 'self-host':23B 'servic':95B,208C 'set':129C 'share':55B,251C 'shell':29B,105C 'start':201C 'step':40B,141C,273C 'submit':240C 'tenant':2A,33B,67B,109C,202C,232C,289C 'token':71B,97B,210C,236C 'turn':103C 'uid':161C 'use':41B,73B,199C,278C 'user':53B,157C 'v2':224C 'valu':291C 'visibl':264C 'workdir':276C 'worker':9A,47B,81B,92B,125C,127C,150C,175C,181C,198C,205C,219C,259C,269C 'workspac':70B,235C 'writabl':187C 'write':78B","nicknames":[],"mitigations":[],"who_affected":"Teams running Beta9 build workers that accept image definitions from tenants, particularly with Clip v2 layered builds, which are the default. Exposure needs a tenant workspace token and worker pods that are privileged with shared namespaces. Deployments where only trusted users submit builds, or that already run the fixed worker, are not exposed.","tier":"B","verified":{},"analyst_revisit_at":null,"fix_status":"available","audience":"businesses","plain_action":null,"first_public_at":"2026-11-01T13:18:01+00:00","kev":null,"cvss_vector":"CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H","cvss_by":"reefs@jfrog.com","poc_count":0,"sources":[{"source":"nvd","external_id":"CVE-2026-120306","url":"https://nvd.nist.gov/vuln/detail/CVE-2026-120306","severity":null,"published_at":"2026-11-01T13:18:01+00:00","modified_at":"2026-11-01T13:18:01+00:00","first_seen_at":"2026-11-01T13:20:07+00:00","fetched_at":"2026-11-01T13:20:07+00:00","note":null}],"documents":[],"notice":"Free to read at a human pace. An API with keys and an MCP server are in preparation; early access: hello@infrastack.ai"}