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-19730

CVE-2026-19730: Podman Quadlet Install Non-Truncating Write Retains Removed Host-Access/Security Directives

Alon Barad
Alon Barad
Software Engineer

Sep 24, 2026·7 min read·4 visits

Executive Summary (TL;DR)

An oversight in Podman's configuration-overwriting mechanism fails to truncate files on standard filesystems. When an administrator attempts to reduce container privileges or remove volume mounts by installing a shorter configuration file, the old security-critical lines remain at the end of the file and are still parsed, causing the privileges to persist silently.

CVE-2026-19730 is a local security vulnerability in the Podman container engine's Quadlet systemd generator. When updating existing configurations using 'podman quadlet install --replace' on filesystems that do not support reflink operations (such as standard ext4), the file is opened without the O_TRUNC flag. If the new configuration file is shorter than the pre-existing file, the trailing lines of the old file remain intact and are successfully parsed by systemd, leading to a failure to remove security-critical parameters like AddCapability, User, or host storage mounts.

Vulnerability Overview

The affected component is Podman's systemd integration tool, Quadlet. Quadlet reads specialized configuration files ending in .container, .volume, or .network and dynamically generates standard systemd service units. This mechanism allows declarative, unit-based container lifecycle management on the host system. The attack surface of this utility is localized to systems where administrator or automated deployment tools manage and update systemd configurations using the podman quadlet install subcommand.

The vulnerability is classified under CWE-459: Incomplete Cleanup. When an administrator modifies an existing container configuration to reduce its capabilities and runs the install command with the --replace (or -r) flag, the application attempts to overwrite the existing file. If the updated configuration is shorter in length than the previous version, and the underlying filesystem does not support copy-on-write 'reflink' copies, the write fails to truncate the pre-existing file payload.

The resulting system state is highly counter-intuitive. Because the trailing lines of the previous configuration are not removed, they remain syntactically valid within systemd's INI-style parser. Consequently, any security reductions, volume removal directives, or user changes are silently ignored as the obsolete directives continue to be parsed and enforced, maintaining the container's previous high-privilege configuration.

Root Cause Analysis

The fundamental flaw lies in how the target file descriptor is opened during the file replacement operation in the Go implementation. Within the installQuadlet sequence, Podman attempts to open the destination path with the flags os.O_CREATE | os.O_WRONLY when the replace argument is set to true. Crucially, the flag os.O_TRUNC is completely omitted from this operation, which instructs the kernel to open the file at offset 0 without shrinking the file size to zero.

To write the new payload, Podman calls fileutils.ReflinkOrCopy. On copy-on-write filesystems such as Btrfs or modern XFS configured with reflink capability, the operating system executes an atomic block-sharing clone. However, on non-reflink filesystems such as standard ext4, this system call returns an unsupported error code. The execution path transparently falls back to a user-space buffer copy using Go's io.Copy(dst, src).

The io.Copy function sequentially reads blocks from the source configuration file and writes them into the target file descriptor. Because the destination file descriptor was never truncated to zero, the write sequence terminates once the end of the shorter source file is reached. The leftover bytes at the end of the original file remain physically present on disk. Since systemd and Quadlet parse files line-by-line, these trailing parameters are interpreted as active, overriding or appending to the new configuration.

Code Analysis

The vulnerability is located in the Go implementation files pkg/domain/infra/abi/quadlet.go and the storage utility fallback in vendor/go.podman.io/storage/pkg/fileutils/reflink_linux.go. In the vulnerable code, the application failed to ensure truncation when creating or opening the target unit file.

// Vulnerable Implementation
osFlags := os.O_CREATE | os.O_WRONLY
if !replace {
    osFlags |= os.O_EXCL
}
 
// Bug: O_TRUNC is missing when replace is true
file, err := os.OpenFile(finalPath, osFlags, 0o644)
if err != nil {
    return "", err
}
defer file.Close()
 
// Fallback logic inside reflink_linux.go
func ReflinkOrCopy(src, dst *os.File) error {
    // ... Attempt Btrfs/XFS reflink ioctl ...
    // If ioctl returns ENOTTY or EXDEV, transparent fallback occurs:
    _, err := io.Copy(dst, src)
    return err
}

If the replacement configuration removes an administrative configuration (for example, shrinking the file from 15 lines to 10 lines), only the first 10 lines of the file are overwritten on disk. The remaining 5 lines, which reside after the new EOF offset of the source file, are left completely intact.

// Remediation Implementation (Atomic replacement via temporary file)
var destFile *os.File
var tempPath string
 
if !replace {
    var err error
    // Open with O_EXCL to prevent race conditions during fresh installs
    destFile, err = os.OpenFile(finalPath, os.O_CREATE|os.O_WRONLY|os.O_EXCL, 0o644)
} else {
    var err error
    // Create a temporary file in the destination directory
    destFile, err = os.CreateTemp(filepath.Dir(finalPath), ".quadlet-install-*")
    if err != nil {
        return "", err
    }
    tempPath = destFile.Name()
}

By generating a clean temporary file via os.CreateTemp, the patched version ensures that the payload starts with a pristine allocation size of 0 bytes, completely mitigating any risk of residual trailing bytes. Once the write completes, the temporary file is closed, permissions are set to 0o644, and the old configuration is atomically replaced using os.Rename.

Exploitation Methodology

To execute this bypass, several target criteria must be met. The administrative system must be configured to use a filesystem lacking reflink copy capability, such as ext4 or standard Red Hat Enterprise Linux default XFS configurations where reflinks were not formatted. Additionally, the administrator must modify an existing, long Quadlet file to be physically shorter by deleting lines from the bottom of the file.

Assume a baseline scenario where a database container is configured with high-privilege access and system mounts. The administrator executes the initial deployment, which installs the configuration under /etc/containers/systemd/db.container. The configuration contains a volume mount linking critical host binaries to the container: Volume=/sbin:/sbin:ro.

To restrict this container's access, the administrator edits the master template to delete the Volume parameter, reducing the configuration size by 25 bytes. The administrator then executes podman quadlet install --replace. The new 100-byte file is written over the 125-byte file. The trailing 25 bytes, containing Volume=/sbin:/sbin:ro, survive intact. Upon systemd reload, the unit is parsed, and the container continues to launch with the host filesystem mount active.

Impact Assessment

The impact of CVE-2026-19730 is primarily focused on the security posture and privilege boundaries of container workloads. Although rated as Medium severity (CVSS 4.2), the silent nature of the failure means security configurations and compliance requirements are bypassed without raising errors or logs.

In multi-tenant or highly secured container hosts, developers use Quadlet configuration directives to enforce boundaries. The inability to cleanly remove administrative privileges (such as AddCapability=CAP_SYS_ADMIN), custom network routes, or host file system paths means containers remain in an over-privileged state indefinitely. A low-privileged local attacker or compromised container application can abuse these lingering configurations to escalate privileges to the host.

No active exploitation or automated malware campaigns target this vulnerability in the wild, which aligns with its low EPSS score. The exploit mechanism is fundamentally a localized logical race or persistence issue, which means threat actors cannot trigger it remotely unless they have a mechanism to manipulate local Quadlet files or induce administrators into running replacement routines.

Remediation & Mitigation Guidance

To fully resolve CVE-2026-19730, administrators must update Podman on their host systems to the patched versions. The official fix is included in upstream versions 5.8.6 and 6.0.0 or later. Red Hat has released security updates backporting the fix to RHEL 9 and RHEL 10 platforms.

If patching cannot be executed immediately, administrators must avoid using the --replace or -r options directly on active installations. Instead, a manual delete-then-install workflow should be implemented. This ensures that the destination file descriptor is entirely removed, forcing Podman to open a brand-new file with a clean size of 0 bytes:

# Mitigation: Manual clean before installation
TARGET_PATH="/etc/containers/systemd/vulnerable.container"
if [ -f "$TARGET_PATH" ]; then
    rm -f "$TARGET_PATH"
fi
podman quadlet install /source/vulnerable.container

Security teams can audit their existing directories using automated scripts to verify that systemd service configurations do not contain duplicated directives or unexpected parameters matching the tail of previous versions. Filesystems supporting reflink, such as Btrfs or modern XFS, are not vulnerable to this bug class and can be utilized as a structural mitigation.

Official Patches

Red HatRed Hat Security Advisory for CVE-2026-19730 on RHEL 9 platforms
Red HatRed Hat Security Advisory for CVE-2026-19730 on RHEL 10 platforms

Fix Analysis (2)

Technical Appendix

CVSS Score
4.2/ 10
CVSS:3.1/AV:L/AC:H/PR:L/UI:R/S:U/C:L/I:L/A:L
EPSS Probability
0.16%
Top 95% most exploited

Affected Systems

Red Hat Enterprise Linux 9 (podman package prior to 6:5.8.2-7.el9_8)Red Hat Enterprise Linux 10 (podman package prior to 7:5.8.2-9.el10_2)Upstream Podman installations using Quadlet features on ext4 filesystems

Affected Versions Detail

Product
Affected Versions
Fixed Version
Podman
Red Hat
< 5.8.65.8.6
Podman
Red Hat
>= 5.9.0, < 6.0.06.0.0
AttributeDetail
CWE IDCWE-459 (Incomplete Cleanup)
Attack VectorLocal (AV:L)
CVSS v3.1 Score4.2 (Medium)
EPSS Score0.00163 (Percentile: 4.85%)
Impact TypeSecurity Bypass / Privilege Persistence
Exploit StatusProof-of-Concept Available
CISA KEV StatusNot Listed

MITRE ATT&CK Mapping

T1543.002Create or Modify System Process: Systemd Service
Privilege Escalation
T1539Steal Web Session Cookie / File Remnants
Credential Access
CWE-459
Incomplete Cleanup

The software does not clean up all of its temporary or older resources, leaving obsolete configuration records that are subsequently executed or parsed as valid options.

Known Exploits & Detection

GitHubOriginal bug report and reproduction workflow detailing the lack of truncation on ext4 systems.

Vulnerability Timeline

Vulnerability identified and reported in Podman upstream GitHub Issue #29013
2026-06-23
Primary fix commit merges into master upstream branch
2026-07-15
CVE-2026-19730 officially assigned and published
2026-08-13
Vendor errata updates and CVSS mapping finalized by Red Hat
2026-09-22

References & Sources

  • [1]Red Hat CVE Portal for CVE-2026-19730
  • [2]GitHub Security Advisory GHSA-fx76-2j3w-2mx6
  • [3]Red Hat Bugzilla Bug #2508234

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•about 1 hour ago•CVE-2026-57232
3.1

CVE-2026-57232: Server-Side Request Forgery in Contao CMS Feed Reader Module

A Server-Side Request Forgery (SSRF) vulnerability exists in the Contao Open Source Content Management System (CMS) within the Feed Reader front-end module. When processing RSS feed configurations, the module initiates outbound HTTP connections using a default HTTP client that lacks loopback and private network controls. Authenticated backend users with permissions to configure frontend modules can exploit this flaw to coerce the server into sending requests to internal endpoints, loopback addresses, and cloud instance metadata services.

Amit Schendel
Amit Schendel
5 views•7 min read
•about 2 hours ago•CVE-2026-63498
8.7

CVE-2026-63498: Stored Cross-Site Scripting via Inline XML Rendering in Snipe-IT API

CVE-2026-63498 is a high-severity Stored Cross-Site Scripting (XSS) vulnerability in Snipe-IT prior to version 8.7.0. The flaw resides in the REST API's file retrieval endpoint, which allows files to be rendered inline without sanitizing or restricting malicious content types like XML and XSLT stylesheets, leading to browser-side script execution in the context of the application's origin.

Amit Schendel
Amit Schendel
3 views•6 min read
•about 4 hours ago•CVE-2026-63493
8.6

CVE-2026-63493: Multi-Factor Authentication Bypass via Stateless API Token Flow in Snipe-IT

Snipe-IT prior to version 8.7.0 is vulnerable to an authentication bypass (CVE-2026-63493 / GHSA-hxcx-9h4f-42xx) within its Laravel Passport API integration. When multi-factor authentication (MFA/2FA) is enabled, an attacker possessing a victim's password can bypass MFA controls completely. This occurs because the Laravel middleware that enforces MFA was registered only in the stateful 'web' middleware group, leaving the stateless 'api' middleware group unguarded. Consequently, an attacker can use a valid password to initiate a session, bypass the MFA prompt on the web UI by communicating directly with the API, and generate a long-lived Personal Access Token (PAT) to perform unauthorized operations.

Alon Barad
Alon Barad
5 views•6 min read
•about 20 hours ago•CVE-2026-57576
6.5

CVE-2026-57576: Application-Level Denial of Service via Uncontrolled Resource Consumption in Plone

CVE-2026-57576 is an application-level Denial of Service (DoS) vulnerability in Plone. It resides in the `plone.app.dexterity` and `plone.app.contenttypes` packages, allowing authenticated users with content creation permissions to submit excessively long metadata attributes. Because these fields are stored without length limits and subsequently processed by indexing and rendering engines, they trigger complete server resource exhaustion and thread starvation.

Alon Barad
Alon Barad
8 views•9 min read
•about 21 hours ago•GHSA-8PCW-H6W9-H46G
6.5

GHSA-8PCW-H6W9-H46G: Denial of Service via Uncontrolled Resource Consumption in plone.app.contenttypes

An uncontrolled resource consumption vulnerability in plone.app.contenttypes allows authenticated users to trigger application-level denial of service via oversized filename metadata in file uploads.

Amit Schendel
Amit Schendel
7 views•6 min read
•about 22 hours ago•CVE-2026-61685
7.5

CVE-2026-61685: SQL Injection via Dynamic Query Parameters in ReactPress

An unauthenticated remote SQL injection vulnerability exists in multiple API list endpoints of ReactPress prior to version 3.7.0. The vulnerability stems from unsafe construction of TypeORM QueryBuilder conditions, where untrusted HTTP query parameter keys are interpolated directly into SQL statements as identifiers without sanitization or validation.

Alon Barad
Alon Barad
9 views•9 min read