Automated Threat Modeling

Apache Polaris CVE-2026-42811: CEL Injection Collapses GCS Credential Scoping to Bucket Wide Access

CVE-2026-42811 is a critical CEL injection flaw in Apache Polaris. A crafted namespace or table name can expand GCS downscoped credentials from a single table to the entire configured bucket.

CVE Analysis

7 min read

ZeroPath CVE Analysis
ZeroPath CVE Analysis

2026-05-04

Apache Polaris CVE-2026-42811: CEL Injection Collapses GCS Credential Scoping to Bucket Wide Access
Experimental AI-Generated Content

This CVE analysis is an experimental publication that is completely AI-generated. The content may contain errors or inaccuracies and is subject to change as more information becomes available. We are continuously refining our process.

If you have feedback, questions, or notice any errors, please reach out to us.

[email protected]

Introduction

A single unescaped quote character in a table name can turn Apache Polaris's carefully scoped GCS credentials into a skeleton key for an entire cloud storage bucket. CVE-2026-42811, scored at CVSS 9.9, is a CEL expression injection in Apache Polaris. It collapses the Credential Access Boundary that is meant to restrict temporary GCS tokens to a single Iceberg table's files, and the holder ends up with read, write, list, and delete access across every prefix in the configured bucket.

Apache Polaris is the vendor-neutral, open-source implementation of the Iceberg REST Catalog API, and it recently graduated to an Apache Top-Level Project. Snowflake uses it as the interoperability layer for its Horizon Catalog. Fivetran uses it as the foundation of its Iceberg REST Catalog across S3, ADLS, GCS, and OneLake destinations. Because Polaris is shared infrastructure across major data platforms, a flaw in how it scopes credentials carries unusual weight.

Technical Information

Root Cause: Unescaped Input in CEL Expression Construction

The vulnerability is classified under CWE-917 (Improper Neutralization of Special Elements used in an Expression Language Statement) and CWE-20 (Improper Input Validation).

When a client requests access to a table, Polaris builds a Google Cloud Storage Credential Access Boundary (CAB) that contains a Common Expression Language (CEL) condition. That condition is meant to restrict the resulting temporary credentials so they only work against the storage path of the requested table. Polaris builds the CEL string from two inputs: the bucket name and the table path. The table path comes from the namespace and table identifiers that the client supplies.

In versions prior to 1.4.1, Polaris inserts the table path into the CEL expression without escaping it. CEL delimits string literals with single quotes, so a namespace or table identifier that contains a single quote, followed by more URI-safe CEL syntax, can close the intended string literal early. The injected CEL fragments then become part of the expression logic itself, and they change the condition so that the path restriction is effectively removed.

Attack Flow

Exploitation takes four steps:

  1. An attacker who can create namespaces or tables in a Polaris catalog creates a namespace or table name that contains a single quote and CEL fragments designed to neutralize the path condition.

  2. The attacker sends a standard credential vending request to Polaris for the crafted table. Polaris does not validate or sanitize the identifier before embedding it in the CEL expression.

  3. Polaris builds the CAB with the injected CEL condition and returns delegated GCS credentials. The injection has collapsed the CEL path restriction, so these credentials are effectively scoped to the entire configured bucket rather than a single table prefix.

  4. The attacker uses the returned credentials to operate against any prefix in the bucket.

Confirmed Impact on Polaris 1.4.0 with Real GCS

Private testing against Polaris 1.4.0 on real Google Cloud Storage confirmed how far the collapse goes. The delegated credentials could perform the following operations on the attacker's own table prefix, on other tables' prefixes, and on entirely unrelated external prefixes within the same bucket:

OperationOwn Table PrefixOther Table PrefixUnrelated External Prefix
List objectsPermittedPermittedPermitted
Read metadata JSONPermittedPermittedPermitted
Create objectPermittedPermittedPermitted
Delete objectPermittedPermittedPermitted

Tenant isolation within the bucket boundary collapses completely. Once Polaris returns credentials for the crafted table, the path restriction inside the configured bucket is effectively gone, so the exposure reaches well past "another table."

The test setup used a Polaris principal with broad catalog privileges. A separate least-privilege Polaris RBAC variant has not yet been tested on GCS. The credential broadening, though, happens at the GCS CAB layer, after Polaris has already decided to issue credentials, so the core flaw is independent of Polaris-level RBAC configuration.

Affected Systems and Versions

Apache Polaris versions prior to 1.4.1 are affected. The vulnerability was specifically confirmed on Polaris 1.4.0 running against Google Cloud Storage.

The confirmed exploit targets GCS Credential Access Boundary conditions, but the 1.4.1 release notes also mention improvements to storage URI handling for S3. Organizations running Polaris with any storage backend on versions before 1.4.1 should treat their deployments as potentially affected.

The fix is included in Apache Polaris version 1.4.1, released on May 1, 2026.

References

Detect & fix
what others miss

Works with
  • GitHub
  • GitLab
  • Bitbucket
  • Azure DevOps Services
  • Gerrit
  • CVS
  • Jira
  • Linear
  • Slack
  • Security Compass
Explore integrations
Security magnifying glass visualization