CVE-2026-120306 (GCVE-0-2026-120306)

Vulnerability from cvelistv5 – Published: 2026-11-01 12:49 – Updated: 2026-11-01 12:49
VLAI
Title
Beta9 build sandbox escape via chroot-only isolation
Summary
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.
CWE
  • CWE-653 - Improper Isolation or Compartmentalization
  • CWE-269 - Improper Privilege Management
Assigner
JFROG CNA under the mitre root
CNA scorecard B 76/100 over 66 records in the last 180 days details
Impacted products
Vendor Product Version CPE status
beam-cloud Beta9 worker Affected: 0 , < 0.1.756 (semver)
guessed Create a notification for this product.
Show details on NVD website

{
  "containers": {
    "cna": {
      "affected": [
        {
          "collectionURL": "https://github.com/beam-cloud/beta9/releases",
          "defaultStatus": "unaffected",
          "packageName": "github.com/beam-cloud/beta9",
          "product": "Beta9 worker",
          "programFiles": [
            "docker/Dockerfile.worker",
            "pkg/worker/image.go",
            "pkg/worker/image_build_layered.go",
            "pkg/abstractions/image/builder.go",
            "pkg/scheduler/pool_local.go"
          ],
          "repo": "git://github.com/beam-cloud/beta9",
          "vendor": "beam-cloud",
          "versions": [
            {
              "lessThan": "0.1.756",
              "status": "affected",
              "version": "0",
              "versionType": "semver"
            }
          ]
        }
      ],
      "credits": [
        {
          "lang": "en",
          "type": "finder",
          "value": "Natan Nehorai"
        },
        {
          "lang": "en",
          "type": "coordinator",
          "value": "JFrog Security Research"
        }
      ],
      "descriptions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eBeta9 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\u0027s 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\u0027s filesystem and is writable. That filesystem contains the runc, buildah, and runsc binaries the worker uses to start tenant containers, the worker\u0027s 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\u0027s 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.\u003c/p\u003e"
            }
          ],
          "value": "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\u0027s 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\u0027s filesystem and is writable. That filesystem contains the runc, buildah, and runsc binaries the worker uses to start tenant containers, the worker\u0027s 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\u0027s 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."
        }
      ],
      "metrics": [
        {
          "cvssV3_1": {
            "attackComplexity": "LOW",
            "attackVector": "NETWORK",
            "availabilityImpact": "HIGH",
            "baseScore": 9.9,
            "baseSeverity": "CRITICAL",
            "confidentialityImpact": "HIGH",
            "integrityImpact": "HIGH",
            "privilegesRequired": "LOW",
            "scope": "CHANGED",
            "userInteraction": "NONE",
            "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
            "version": "3.1"
          },
          "format": "CVSS",
          "scenarios": [
            {
              "lang": "en",
              "value": "Default clip v2 layered image build on a privileged build-pool worker"
            }
          ]
        }
      ],
      "problemTypes": [
        {
          "descriptions": [
            {
              "cweId": "CWE-653",
              "description": "CWE-653: Improper Isolation or Compartmentalization",
              "lang": "en",
              "type": "CWE"
            }
          ]
        },
        {
          "descriptions": [
            {
              "cweId": "CWE-269",
              "description": "CWE-269: Improper Privilege Management",
              "lang": "en",
              "type": "CWE"
            }
          ]
        }
      ],
      "providerMetadata": {
        "dateUpdated": "2026-11-01T12:49:05.857Z",
        "orgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
        "shortName": "JFROG"
      },
      "references": [
        {
          "name": "Beta9 repository",
          "tags": [
            "product"
          ],
          "url": "https://github.com/beam-cloud/beta9"
        },
        {
          "name": "Handle sandbox edge cases (fix pull request)",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/beam-cloud/beta9/pull/1897"
        },
        {
          "name": "Fix commit a28bf12",
          "tags": [
            "patch"
          ],
          "url": "https://github.com/beam-cloud/beta9/commit/a28bf12cf0007c792a25d8ed282b4e8bf6f30393"
        },
        {
          "name": "worker-0.1.756",
          "tags": [
            "release-notes"
          ],
          "url": "https://github.com/beam-cloud/beta9/releases/tag/worker-0.1.756"
        }
      ],
      "solutions": [
        {
          "lang": "en",
          "supportingMedia": [
            {
              "base64": false,
              "type": "text/html",
              "value": "\u003cp\u003eUpgrade the Beta9 worker to 0.1.756 or later. That release drops chroot isolation: Buildah RUN steps use OCI isolation with private PID, IPC, and network namespaces, and tenant build arguments are applied inside the build container rather than in the Buildah process environment. The fix is commit a28bf12 (pull request 1897), released as worker-0.1.756 on 2026-09-15. Gateway 0.1.776 is the gateway tag cut from the same commit; the isolation change itself is in the worker image.\u003c/p\u003e"
            }
          ],
          "value": "Upgrade the Beta9 worker to 0.1.756 or later. That release drops chroot isolation: Buildah RUN steps use OCI isolation with private PID, IPC, and network namespaces, and tenant build arguments are applied inside the build container rather than in the Buildah process environment. The fix is commit a28bf12 (pull request 1897), released as worker-0.1.756 on 2026-09-15. Gateway 0.1.776 is the gateway tag cut from the same commit; the isolation change itself is in the worker image."
        }
      ],
      "source": {
        "discovery": "EXTERNAL"
      },
      "timeline": [
        {
          "lang": "en",
          "time": "2026-09-15T04:03:00.000Z",
          "value": "Fix merged in pull request 1897 (commit a28bf12)"
        },
        {
          "lang": "en",
          "time": "2026-09-15T04:03:00.000Z",
          "value": "Fixed release worker-0.1.756 published. No vendor security advisory was filed with the pull request."
        }
      ],
      "title": "Beta9 build sandbox escape via chroot-only isolation",
      "x_generator": {
        "engine": "Vulnogram 1.0.5"
      }
    }
  },
  "cveMetadata": {
    "assignerOrgId": "48a46f29-ae42-4e1d-90dd-c1676c1e5e6d",
    "assignerShortName": "JFROG",
    "cveId": "CVE-2026-120306",
    "datePublished": "2026-11-01T12:49:05.857Z",
    "dateReserved": "2026-11-01T12:32:40.057Z",
    "dateUpdated": "2026-11-01T12:49:05.857Z",
    "state": "PUBLISHED"
  },
  "dataType": "CVE_RECORD",
  "dataVersion": "5.2",
  "vulnerability-lookup:meta": {
    "nvd": {
      "cve": {
        "affected": [
          {
            "affectedData": [
              {
                "collectionURL": "https://github.com/beam-cloud/beta9/releases",
                "defaultStatus": "unaffected",
                "packageName": "github.com/beam-cloud/beta9",
                "product": "Beta9 worker",
                "programFiles": [
                  "docker/Dockerfile.worker",
                  "pkg/worker/image.go",
                  "pkg/worker/image_build_layered.go",
                  "pkg/abstractions/image/builder.go",
                  "pkg/scheduler/pool_local.go"
                ],
                "repo": "git://github.com/beam-cloud/beta9",
                "vendor": "beam-cloud",
                "versions": [
                  {
                    "lessThan": "0.1.756",
                    "status": "affected",
                    "version": "0",
                    "versionType": "semver"
                  }
                ]
              }
            ],
            "source": "reefs@jfrog.com"
          }
        ],
        "cveTags": [],
        "descriptions": [
          {
            "lang": "en",
            "value": "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\u0027s 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\u0027s filesystem and is writable. That filesystem contains the runc, buildah, and runsc binaries the worker uses to start tenant containers, the worker\u0027s 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\u0027s 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."
          }
        ],
        "id": "CVE-2026-120306",
        "lastModified": "2026-11-01T13:18:01.300",
        "metrics": {
          "cvssMetricV31": [
            {
              "cvssData": {
                "attackComplexity": "LOW",
                "attackVector": "NETWORK",
                "availabilityImpact": "HIGH",
                "baseScore": 9.9,
                "baseSeverity": "CRITICAL",
                "confidentialityImpact": "HIGH",
                "integrityImpact": "HIGH",
                "privilegesRequired": "LOW",
                "scope": "CHANGED",
                "userInteraction": "NONE",
                "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:H/I:H/A:H",
                "version": "3.1"
              },
              "exploitabilityScore": 3.1,
              "impactScore": 6.0,
              "source": "reefs@jfrog.com",
              "type": "Secondary"
            }
          ]
        },
        "published": "2026-11-01T13:18:01.300",
        "references": [
          {
            "source": "reefs@jfrog.com",
            "url": "https://github.com/beam-cloud/beta9"
          },
          {
            "source": "reefs@jfrog.com",
            "url": "https://github.com/beam-cloud/beta9/commit/a28bf12cf0007c792a25d8ed282b4e8bf6f30393"
          },
          {
            "source": "reefs@jfrog.com",
            "url": "https://github.com/beam-cloud/beta9/pull/1897"
          },
          {
            "source": "reefs@jfrog.com",
            "url": "https://github.com/beam-cloud/beta9/releases/tag/worker-0.1.756"
          }
        ],
        "sourceIdentifier": "reefs@jfrog.com",
        "vulnStatus": "Received",
        "weaknesses": [
          {
            "description": [
              {
                "lang": "en",
                "value": "CWE-269"
              },
              {
                "lang": "en",
                "value": "CWE-653"
              }
            ],
            "source": "reefs@jfrog.com",
            "type": "Primary"
          }
        ]
      }
    }
  }
}



Log in or create an account to share your comment.




Tags
Taxonomy of the tags.


Loading…

Loading…

Loading…

Drag nodes to arrange them. Double-click a related vulnerability to open it, or a source to visit its link. The Physics button on the left tunes the layout and the simulation; the legend at the bottom left hides or shows nodes by kind and by sighting type.

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.
Vulnerability timeline

Sightings and recorded dates, grouped by day · UTC

JSON
Events included in the timeline

Loading timeline…


    Loading…

    Loading…

    Loading…

    Related by attack behaviour

    Vulnerabilities whose description is nearest to this one in the vector space of the CIRCL/vulnerability-attack-technique-biencoder model. This is a similarity search over the bi-encoder space (plain cosine), not a classification, and it has no measured accuracy.