CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-40109

CVE-2026-40109: Improper Authentication in Flux notification-controller GCR Receiver

Amit Schendel
Amit Schendel
Senior Security Researcher

Apr 11, 2026·7 min read·44 visits

Executive Summary (TL;DR)

Flux notification-controller < 1.8.3 fails to validate OIDC email/audience claims in the GCR Receiver, allowing unauthorized reconciliation triggers via any valid Google token.

The Flux notification-controller prior to version 1.8.3 suffers from improper authentication in its Google Container Registry (GCR) Receiver webhook logic. The controller verified Google OIDC token signatures but failed to validate the identity (email) and audience (aud) claims, allowing unauthorized triggering of resource reconciliations by anyone possessing a valid Google OIDC token and the target webhook URL.

Vulnerability Overview

The Flux notification-controller component manages event forwarding and dispatching for GitOps Toolkit controllers. Prior to version 1.8.3, the Google Container Registry (GCR) Receiver implementation contained an improper authentication vulnerability. This flaw resides in the handling of Google OpenID Connect (OIDC) tokens submitted via Pub/Sub push notifications.

The vulnerability, tracked as CVE-2026-40109, allows unauthorized principals to trigger Flux reconciliation processes. The root cause is a failure to properly implement identity binding during JWT verification. Specifically, the software checks that the token is signed by a trusted issuer but omits validation of the recipient and the subject.

The severity is classified as Low (CVSS 3.1) due to mitigating factors inherent to Flux's design. Successful exploitation requires prior knowledge of a high-entropy webhook URL. Furthermore, unauthorized reconciliations are generally benign because the operation is idempotent and state modifications only occur if the underlying Git or OCI source has changed.

This vulnerability exposes affected systems to unauthorized API invocation. It highlights the critical difference between verifying cryptographic signatures and verifying identity authorizations in modern authentication protocols.

Root Cause Analysis

The flaw manifests in the authenticateGCRRequest function responsible for validating incoming webhook payloads from Google Cloud Pub/Sub. When Pub/Sub dispatches a push notification, it includes a JSON Web Token (JWT) in the HTTP Authorization header. The unpatched controller uses the https://oauth2.googleapis.com/tokeninfo endpoint to verify the cryptographic signature of this token.

Relying solely on the tokeninfo endpoint confirms that the token was generated by Google, but it does not evaluate the claims within the payload. In a multi-tenant OIDC architecture like Google Cloud, verifying the issuer (iss) claim is insufficient for authentication. Google issues valid OIDC tokens to millions of distinct entities, including personal Gmail accounts and isolated GCP projects.

A secure OIDC implementation requires validating the identity (email or sub) and the intended audience (aud). Because the controller lacked these explicit checks, it accepted any Google-signed token. The system incorrectly mapped the possession of a valid generic token to authorization for the specific GCR Receiver endpoint.

The only protective measure was the obfuscation of the webhook path, generated as /hook/sha256sum(token+name+namespace). While this URL is difficult to brute-force, security through obscurity provides no defense if the URL is leaked through logs or misconfigured access controls. Once the endpoint is known, the application layer authentication completely fails.

Code Analysis

The vulnerable implementation lacked local JWT parsing capabilities and delegated validation to a generic Google API endpoint. This approach obscured the token claims from the controller logic, preventing granular access control. The patch introduced in version 1.8.3 replaces the remote endpoint check with local validation using the google.golang.org/api/idtoken library.

Commit 61b0521f3c7678ea2460a7ac06844b8d94c1140b implements the strict enforcement of standard OIDC claims. The refactored authenticateGCRRequest function now requires expectedEmail and expectedAudience parameters. It explicitly extracts the JWT payload and verifies the issuer against accounts.google.com or https://accounts.google.com.

Crucially, the patch introduces logic to verify that the token belongs to the expected Service Account. The code extracts the email and email_verified claims from the parsed token and compares them against the configured values. The email_verified claim must be explicitly true.

The following snippet demonstrates the core validation logic added in the patch. The implementation now explicitly rejects requests if the email does not match the configured Service Account, eliminating the vulnerability.

// New validation logic in version 1.8.3
func authenticateGCRRequest(ctx context.Context, bearer string, expectedEmail string, expectedAudience string) error {
    const bearerPrefix = "Bearer "
    if !strings.HasPrefix(bearer, bearerPrefix) {
        return fmt.Errorf("the Authorization header is missing or malformed")
    }
    token := bearer[len(bearerPrefix):]
 
    v, err := idtoken.NewValidator(ctx)
    if err != nil {
        return fmt.Errorf("cannot create ID token validator: %w", err)
    }
    payload, err := v.Validate(ctx, token, expectedAudience)
    if err != nil {
        return fmt.Errorf("invalid ID token: %w", err)
    }
 
    // Verify the token issuer.
    issuer, _ := payload.Claims["iss"].(string)
    if issuer != "accounts.google.com" && issuer != "https://accounts.google.com" {
        return fmt.Errorf("token issuer is '%s', want 'accounts.google.com' or 'https://accounts.google.com'", issuer)
    }
 
    // Verify the token was issued for the expected service account.
    email, _ := payload.Claims["email"].(string)
    emailVerified, _ := payload.Claims["email_verified"].(bool)
    if expectedEmail != "" && email != expectedEmail {
        return fmt.Errorf("token email is '%s', want '%s'", email, expectedEmail)
    }
    if !emailVerified {
        return fmt.Errorf("token email '%s' is not verified", email)
    }
    return nil
}

Exploitation

Exploitation of CVE-2026-40109 requires the attacker to fulfill two primary prerequisites. First, the attacker must discover the specific URL of the target Flux GCR Receiver webhook. Second, the attacker must possess or generate a valid Google OIDC token.

An attacker can generate a valid token using any standard Google account or a separate Google Cloud Service Account under their control. The specific permissions associated with the account do not matter, as the unpatched controller does not inspect the token's origin. The attacker packages this token into the Authorization header as a Bearer token.

The exploit is delivered via an HTTP POST request to the discovered webhook URL. Upon receiving the request, the notification-controller queries the Google token info endpoint, receives a confirmation of the signature validity, and authorizes the request.

Once authorized, the controller executes a reconciliation loop for all resources specified in the Receiver's .spec.resources array. Current vulnerability intelligence, including data from VulnCheck and CISA, indicates no known weaponized exploits or active exploitation in the wild, largely due to the low impact and the prerequisite of discovering the webhook URL.

Impact Assessment

The vulnerability exposes the notification-controller to unauthorized API invocation, resulting in a CVSS v3.1 base score of 3.1. The vector string CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N reflects the network attack vector, high attack complexity (due to the obfuscated URL), and low integrity impact. There is no direct impact on confidentiality or availability.

The concrete security consequences of this flaw are highly constrained by the design of the GitOps Toolkit. The notification-controller performs state reconciliations, which are inherently idempotent operations. Triggering a reconciliation via the webhook forces the system to compare the current cluster state against the defined source state in the Git or OCI repository.

If the source state has not been modified by an authorized user, the unauthorized reconciliation attempt results in a no-op. The attacker cannot inject arbitrary configuration data, alter container images, or access sensitive cluster resources. The attack only forces an early execution of a process that runs on a schedule regardless.

Additionally, Flux controllers implement event deduplication. If an attacker attempts to degrade performance by flooding the webhook endpoint with authenticated requests, the controller collapses the requests and processes a single reconciliation event. This behavior effectively neutralizes potential denial-of-service vectors associated with the unauthorized triggers.

Remediation

The primary remediation strategy is upgrading the fluxcd/notification-controller component to version 1.8.3 or later. This update replaces the vulnerable authentication mechanism with strict OIDC claim validation. Organizations utilizing Flux should deploy the updated manifests via their standard GitOps pipelines.

Upgrading the controller binary is necessary but insufficient to fully resolve the vulnerability. Administrators must also update the configuration of existing GCR Receivers. The Kubernetes Secret associated with each Receiver must be updated to include an email key, which specifies the authorized GCP Service Account email used for the Pub/Sub subscription.

If custom audiences are utilized within the GCP Pub/Sub configuration, the Secret must also include an audience key. When the audience key is absent, the updated controller falls back to reconstructing the expected audience from the request URL, which aligns with standard Pub/Sub behavior but may not cover advanced deployments.

In environments where an immediate upgrade is not feasible, mitigation options are limited. The system relies entirely on the secrecy of the webhook URL. Administrators should rotate the webhook tokens stored in the Kubernetes Secrets to invalidate any potentially leaked URLs, ensuring the new tokens are securely managed.

Official Patches

fluxcdFix Pull Request
fluxcdRelease v1.8.3

Fix Analysis (1)

Technical Appendix

CVSS Score
3.1/ 10
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
EPSS Probability
0.01%
Top 98% most exploited

Affected Systems

fluxcd/notification-controller (GCR Receiver type)

Affected Versions Detail

Product
Affected Versions
Fixed Version
notification-controller
fluxcd
< 1.8.31.8.3
AttributeDetail
CWE IDCWE-287, CWE-345
Attack VectorNetwork
CVSS v3.13.1
EPSS Score0.00012
ImpactUnauthorized Resource Reconciliation
Exploit StatusNone
KEV StatusNot Listed

MITRE ATT&CK Mapping

T1078Valid Accounts
Initial Access
T1190Exploit Public-Facing Application
Initial Access
CWE-287
Improper Authentication

Improper Authentication / Insufficient Verification of Data Authenticity

Vulnerability Timeline

Initial work on Azure Event Hub auth (Commit cace0eb6)
2026-03-19
Core refactor of GCR Receiver to include identity validation (Commit 61b0521f)
2026-04-03
Patch release v1.8.3 published
2026-04-07
Vulnerability publicly disclosed and CVE-2026-40109 published
2026-04-09

References & Sources

  • [1]GitHub Advisory: GHSA-h9cx-xjg6-5v2w
  • [2]NVD Record: CVE-2026-40109
  • [3]IBM X-Force Vulnerability Database
  • [4]SentinelOne Database

More Reports

•36 minutes ago•CVE-2026-107725
8.7

CVE-2026-107725: Remote Code Execution via Authorization Bypass in Hazelcast Predicates API

CVE-2026-107725 is a critical security bypass in Hazelcast where missing authorization checks in the MapPermission class permit unprivileged clients to issue queries containing aggregators or projections. This architectural oversight allows attackers to run arbitrary code on the cluster servers under the privileges of the active Hazelcast process.

Amit Schendel
Amit Schendel
1 views•7 min read
•about 2 hours ago•CVE-2026-107396
5.4

CVE-2026-107396: Stored Cross-Site Scripting (XSS) in Indico

A stored Cross-Site Scripting (XSS) vulnerability was identified in Indico, an open-source event management system developed at CERN, prior to version 3.3.13. The vulnerability stems from weak URL validation in custom link fields and lack of HTML sanitization during Marshmallow serialization of event notes. This allows authenticated attackers with event modification privileges to inject malicious payloads that execute in the browser of users viewing the event pages or collaborating on notes.

Alon Barad
Alon Barad
2 views•6 min read
•about 3 hours ago•CVE-2026-107397
4.4

CVE-2026-107397: Stored Cross-Site Scripting via Collaborative Editor Conflict Resolution and Custom Link Fields in Indico

A technical analysis of CVE-2026-107397, a stored Cross-Site Scripting (XSS) vulnerability in Indico's collaborative notes editor and custom link generation fields. Prior to version 3.3.13, Marshmallow serialization schemas omitted HTML sanitization during conflict resolution, and form validators failed to enforce strict URI schemes, enabling authenticated low-privilege attackers to execute arbitrary JavaScript.

Alon Barad
Alon Barad
0 views•7 min read
•about 4 hours ago•CVE-2026-107395
4.3

CVE-2026-107395: Missing Authorization in Indico Legacy Session Export API

An authorization bypass vulnerability exists in the legacy session export API of Indico, an open-source event management system developed at CERN. Due to a missing object-level access check, authenticated users can bypass configuration-level restrictions to extract private session metadata (including session titles, descriptions, and list of conveners) from events that they are otherwise authorized to view.

Alon Barad
Alon Barad
8 views•5 min read
•about 5 hours ago•CVE-2026-107394
6.8

CVE-2026-107394: Server-Side Request Forgery Bypass via Parser Differential in Indico

An incomplete Server-Side Request Forgery (SSRF) validation check in Indico prior to version 3.3.13 allows authenticated event organizers to bypass outbound network restrictions. By utilizing backslash characters within crafted URLs, attackers can exploit a parser differential between the application's validator and the downstream HTTP client library to access internal network resources.

Alon Barad
Alon Barad
7 views•6 min read
•about 6 hours ago•CVE-2026-107717
6.5

CVE-2026-107717: Chat Role Injection and Prompt Boundary Bypass in Banks Library

CVE-2026-107717 represents a critical prompt boundary bypass and chat role injection vulnerability in the Banks Python package (versions prior to 2.5.0). The library parses generated template outputs line-by-line, attempting to validate each segment as a JSON-serialized ChatMessage object without validating the source boundaries of the text. If an application integrates user input directly into a prompt template, a remote, unauthenticated attacker can supply multi-line inputs with structured JSON payloads. This input is then parsed as high-privilege system instructions or tool execution responses, completely hijacking downstream Large Language Model behavior.

Alon Barad
Alon Barad
8 views•6 min read