CVE-2026-81690
Symlink-Following Flaw in openssl-encrypt verify-usb Enables Evil-Maid Bypass
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.
| 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) |
Order-of-magnitude estimate by the model from install counts, market share and public scan data it knows; verify before quoting.
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 news0 stories
No ingested article mentions this CVE yet.