Red Hat Security Advisory: General availability of the satellite/iop-host-inventory-rhel9 container image
Affects Red Hat kimi-cliSource GCVE Database
Not known to be exploited · CVSS 6.6 Medium · fixed in Red Hat package updates : update Red Hat kimi-cli when convenient.
Data as of 31 Oct 2026, 08:20 UTC
- EPSS
- 0.2% chance of exploitation in 30 days – higher than 16% of CVEsExploit Prediction Scoring System: the likelihood attackers will use this flaw soon.
- Patch
- Available – fixed in 1.17.0, 2.26.7, 2.13.0_3
CVSS:3.1/AV:L/AC:L/PR:L/UI:R/S:U/C:N/I:H/A:HExploitation evidence
Disclosed: evidence found.
CVE published 20 Apr 2026
Detectable: no evidence on record.
No public nuclei template indexed
Weaponized: no evidence on record.
No public exploit code indexed in Metasploit or Exploit-DB
Exploited in the wildExploited: no evidence on record.
Not in CISA KEV and no source reports exploitation
Observed by OffSeq MirageSeen by Mirage: no evidence on record.
No attack traffic recorded by OffSeq Mirage sensors
A missing step is not evidence of safety. Sources: cve.org (opens in a new tab), the Metasploit, Exploit-DB and nuclei-templates index as of 30 Oct 2026.
What to do
Upgrade kimi-cli to 1.17.0; pdm to 2.26.7; mcpm to 2.13.0_3.
Affected software
| Product | Affected | Fixed in |
|---|---|---|
Homebrewkimi-clipkg:brew/kimi-cliOther threats | Affected
| Fixed in
|
Homebrewpdmpkg:brew/pdmOther threats | Affected
| Fixed in
|
Homebrewmcpmpkg:brew/mcpmOther threats | Affected
| Fixed in
|
Check your own hosts for these packages with threat-finder (opens in a new tab), our free open-source scanner.
AI-suggested
Users should follow Red Hat Satellite documentation to install and configure Red Hat Lightspeed locally to generate recommendations without sending system data externally. If possible, restrict local access to trusted users to reduce risk. Customers with Red Hat Technical Account Managers (TAM) can consult them for tailored guidance. No additional mitigations are specified in the advisory.
Description
### Summary `set_key()` and `unset_key()` in python-dotenv follow symbolic links when rewriting `.env` files, allowing a local attacker to overwrite arbitrary files via a crafted symlink when a cross-device rename fallback is triggered. ### Details The `rewrite()` context manager in `dotenv/main.py` is used by both `set_key()` and `unset_key()` to safely modify `.env` files. It works by writing to a temporary file (created in the system's default temp directory, typically `/tmp`) and then using `shutil.move()` to replace the original file. When the `.env` path is a symbolic link and the temp directory resides on a different filesystem than the target (a common configuration on Linux systems using tmpfs for `/tmp`), the following sequence occurs: 1. `shutil.move()` first attempts `os.rename()`, which fails with an `OSError` because atomic renames cannot cross device boundaries. 2. On failure, `shutil.move()` falls back to `shutil.copy2()` followed by `os.unlink()`. 3. `shutil.copy2()` calls `shutil.copyfile()` with `follow_symlinks=True` by default. 4. This causes the content to be written to the **symlink target** rather than replacing the symlink itself. An attacker who has write access to the directory containing a `.env` file can pre-place a symlink pointing to any file that the application process has write access to. When the application (or a privileged process such as a deploy script, Docker entrypoint, or CI pipeline) calls `set_key()` or `unset_key()`, the symlink target is overwritten with the new `.env` content. This vulnerability does not require a race condition and is fully deterministic once the preconditions are met. ### Impact The primary impacts are to **integrity** and **availability**: - **File overwrite / destruction (DoS):** An attacker can cause an application or privileged process to corrupt or destroy configuration files, database configs, or other sensitive files it would not normally have access to modify. - **Integrity violation:** The target file's original content is replaced with `.env`-formatted content controlled by the attacker. - **Potential privilege escalation:** In scenarios where a privileged process (running as root or a service account) calls `set_key()`, the attacker can leverage this to write to files beyond their own access level. The scope of impact depends on the application using python-dotenv and the privileges under which it runs. ### Proof of Concept The following script demonstrates the vulnerability. It requires `/tmp` and the user's home directory to reside on different devices (common on systemd-based Linux systems with tmpfs). ```python import os import sys import tempfile from dotenv import set_key # Pre-condition: /tmp must be on a different device than the target directory. tmp_dev = os.stat("/tmp").st_dev home_dev = os.stat(os.path.expanduser("~")).st_dev assert tmp_dev != home_dev, "Skipped: /tmp and ~ are on the same device (no cross-device move)" with tempfile.TemporaryDirectory(dir=os.path.expanduser("~")) as workdir: # File an attacker wants to overwrite target = os.path.join(workdir, "victim_config.txt") with open(target, "w") as f: f.write("DB_PASSWORD=supersecret\n") # Attacker pre-places a symlink at the path the application will use as .env env_symlink = os.path.join(workdir, ".env") os.symlink(target, env_symlink) before = open(target).read() # Application writes a new key -- triggers the cross-device fallback set_key(env_symlink, "INJECTED", "attacker_value") after = open(target).read() print("Before:", repr(before)) print("After: ", repr(after)) print("Symlink target overwritten:", target) ``` **Expected output:** ``` Before: 'DB_PASSWORD=supersecret\n' After: "DB_PASSWORD=supersecret\nINJECTED='attacker_value'\n" Symlink target overwritten: /home/user/tmp806nut2g/victim_config.txt ``` ### Remediation The fix changes the `rewrite()` context manager in the following ways: 1. **Symlinks are no longer followed by default.** When the `.env` path is a symlink, `rewrite()` now resolves it to the real path before proceeding, or (by default) operates on the symlink entry itself rather than the target. 2. **A `follow_symlinks: bool = False` parameter** is added to `set_key()` and `unset_key()` for users who explicitly need the old behavior. 3. **Temp files are written in the same directory** as the target `.env` file (instead of the system temp directory), eliminating the cross-device rename condition entirely. 4. **`os.replace()` is used instead of `shutil.move()`**, providing atomic replacement without symlink-following fallback behavior. Users are advised to upgrade to the patched version as soon as it is available on PyPI. ### Timeline | Date | Event | | ------------ | ---------------
References
- access.redhat.com/errata/RHSA-2026:26226 (opens in a new tab)
- access.redhat.com/documentation/en-us/red_hat_satellite/6.18/html/updating_red_hat_satellite/index (opens in a new tab)
- access.redhat.com/security/cve/CVE-2026-28684 (opens in a new tab)
- access.redhat.com/security/cve/CVE-2026-32597 (opens in a new tab)
- access.redhat.com/security/cve/CVE-2026-44431 (opens in a new tab)
- access.redhat.com/security/cve/CVE-2026-48710 (opens in a new tab)
- access.redhat.com/security/updates/classification/ (opens in a new tab)
- catalog.redhat.com/software/containers/search (opens in a new tab)
- docs.redhat.com/en/documentation/red_hat_satellite/6.18/html/installing_satellite_server_in_a_connected_network_environment/performing-additional-configuration-on-server_satellite (opens in a new tab)
- docs.redhat.com/en/documentation/red_hat_satellite/6.18/html/installing_satellite_server_in_a_disconnected_network_environment/performing-additional-configuration (opens in a new tab)
- security.access.redhat.com/data/csaf/v2/advisories/2026/rhsa-2026_26226.json (opens in a new tab)
- suse.com/support/security/rating/ (opens in a new tab)
- ftp.suse.com/pub/projects/security/csaf/opensuse-su-2026_20952-1.json (opens in a new tab)
- bugzilla.suse.com/1262423 (opens in a new tab)
- suse.com/security/cve/CVE-2026-28684/ (opens in a new tab)
- github.com/theskumar/python-dotenv/security/advisories/GHSA-mf9w-mj56-hr94 (opens in a new tab)
- nvd.nist.gov/vuln/detail/CVE-2026-28684 (opens in a new tab)
- github.com/theskumar/python-dotenv/commit/790c5c02991100aa1bf41ee5330aca75edc51311 (opens in a new tab)
- github.com/theskumar/python-dotenv/commit/790c5c02991100aa1bf41ee5330aca75edc51311.patch (opens in a new tab)
- github.com/theskumar/python-dotenv (opens in a new tab)
- github.com/theskumar/python-dotenv/releases/tag/v1.2.2 (opens in a new tab)