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

A brief summary of CVE-2026-42811, a critical CEL injection flaw in Apache Polaris that allows crafted namespace or table names to 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 that collapses the Credential Access Boundary meant to restrict temporary GCS tokens to a single Iceberg table's files, granting the holder 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, recently graduated to an Apache Top Level Project. It is used by Snowflake as the interoperability layer for its Horizon Catalog and by Fivetran as the foundation of its Iceberg REST Catalog across S3, ADLS, GCS, and OneLake destinations. Its position as shared infrastructure across major data platforms makes this vulnerability particularly consequential.

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 constructs a Google Cloud Storage Credential Access Boundary (CAB) that contains a Common Expression Language (CEL) condition. This CEL condition is intended to restrict the resulting temporary credentials so they only work against the storage path associated with the requested table. The CEL string is built from two inputs: the bucket name and the table path. The table path is derived from the namespace and table identifiers supplied by the client.

In versions prior to 1.4.1, the table path is inserted into the CEL expression without escaping. Because CEL uses single quotes to delimit string literals, a namespace or table identifier containing a single quote character, followed by additional URI safe CEL syntax, can terminate the intended string literal prematurely. The injected CEL fragments then become part of the expression logic itself, altering the condition so that the path restriction is effectively removed.

Attack Flow

The exploitation sequence works as follows:

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

  2. Request credentials. The attacker issues 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. Receive broadened credentials. Polaris constructs the CAB with the injected CEL condition and returns delegated GCS credentials. Because the CEL path restriction has been collapsed by the injection, these credentials are effectively scoped to the entire configured bucket rather than a single table prefix.

  4. Operate across the bucket. The attacker uses the returned credentials to perform operations 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 the full extent of the collapse. The delegated credentials could perform the following operations across the attacker's own table prefix, other tables' prefixes, and entirely unrelated external prefixes within the same bucket:

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

This is a complete collapse of tenant isolation within the bucket boundary. The issue is not limited to accessing "another table." Once Polaris returns credentials for the crafted table, the path restriction inside the configured bucket is effectively gone.

The testing used a Polaris principal with broad catalog privileges for setup. A separate least privilege Polaris RBAC variant has not yet been tested on GCS. However, the storage credential broadening behavior operates 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.

While the confirmed exploit targets GCS Credential Access Boundary conditions, the 1.4.1 release notes indicate improvements to storage URI handling for S3 as well. 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

Security magnifying glass visualization