ZeroHour

CVE-2026-81690

Symlink-Following Flaw in openssl-encrypt verify-usb Enables Evil-Maid Bypass

CVSS 4.0
8.7 high
EPSS
<1%p40
Published
()
Modified
AI analysis

openssl-encrypt before 1.4.9 contains a symlink-following flaw (CWE-59) in its verify-usb v2 added-file allowlist scan: the drive is enumerated with rglob(), which in CPython does not descend into symlinked directories, while the O_NOFOLLOW flag on the hashing side only protects the final path component, so files reached through a symlinked directory are never enumerated. An evil-maid attacker with brief physical access to the removable drive can replace a tool-tree directory with a symlink to a copy holding byte-identical files plus a planted __pycache__/*.pyc, which CPython loads in preference to recompiling the clean .py; verify-usb then reports PASSED with added_files remaining 0. When the victim runs the portable install, the planted .pyc executes, giving the attacker code execution on the victim's system despite the verification having passed. Users of the openssl-encrypt pip package (vendor jahlives) on 1.4.x before 1.4.9, and on the 1.5.x line which the advisory also lists as affected, who rely on verify-usb to validate portable USB installs are exposed. No exploitation is currently known: there is no public PoC, the flaw is not in CISA KEV, EPSS estimates a 0.5% probability of exploitation in the next 30 days, and the flaw carries a CVSS 4.0 score of 8.7 (High).

What to do: Upgrade openssl-encrypt to 1.4.9 or later; the advisory also lists the 1.5.x line as affected, so confirm the fixed release on that line before staying on it. Until patched, do not treat verify-usb 'PASSED' results as assurance for drives that have left physical custody, and manually inspect the USB tool tree for symlinked directories and unexpected __pycache__/*.pyc files, deleting the planted .pyc files to force clean recompilation.

Affected
jahlives openssl-encrypt (pip package)1.4.x before 1.4.9; the 1.5.x line is also listed as affected (fixed in 1.4.9 per the advisory; the fixed 1.5.x version is not specified in the available data)
Estimated exposure
unknown (no PyPI install or download figures provided; the tool serves a niche portable-USB evil-maid verification use case, so adoption is likely small but… — No PyPI download counts, active-install statistics, or exposure-scan data for the openssl-encrypt package were included in the available data, so no order of magnitude can be grounded beyond noting the tool's niche purpose.

Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.

Description

openssl-encrypt (pip package) before 1.4.9 contains a symlink-following flaw in its verify-usb v2 added-file allowlist scan. The scan enumerated the drive with rglob(), which in CPython does not descend into symlinked directories and treats the symlink as an ordinary directory, while O_NOFOLLOW on the hash side binds only the final path component. An evil-maid attacker with physical access to the removable drive could replace a tool-tree directory with a symlink to a copy containing byte-identical files plus a planted __pycache__/*.pyc file (which CPython loads in preference to recompiling the clean .py). The planted file is never enumerated, added_files stays 0, and verify-usb reports PASSED, resulting in code execution when the victim runs the portable install. Fixed in 1.4.9 (affects both 1.4.x and 1.5.x lines).

Vendors
jahlives
Products
openssl encrypt
Weakness
CWE-59
Vector
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X

In the news

No ingested article mentions this CVE yet.