Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
ReconGain physical access to target USB drive
-
DeliveryReplace tool-tree directory with crafted symlink
-
ExploitPlant malicious __pycache__/*.pyc alongside byte-identical .py files
-
InstallReturn drive to victim undetected
-
C2Victim runs verify-usb, rglob() misses planted .pyc, reports PASSED
-
ExecuteCPython loads malicious bytecode on install launch
-
ImpactArbitrary code executes in victim user context
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A01:2025 - Broken Access Control
ASVS 5.0
V5 - File Handling Symlink resolution safety
|
| Exploitation Conditions | The victim must be running openssl-encrypt with the verify-usb v2 feature active against a removable drive before executing the portable install. The attacker must have had prior physical access to the specific USB drive to plant the malicious symlink and __pycache__/*.pyc file - remote exploitation is not possible. Exploitation is further limited by: (1) physical access window - the attacker must handle the drive before victim use; (2) mandatory victim interaction - the victim must run the portable install after verification completes; (3) feature-specific scope - only deployments using verify-usb on removable media are exposed; (4) package specificity - only software in the tool-tree that CPython can load as bytecode is a viable payload vehicle. The supplied CVSS vector (AV:N/PR:N/UI:N) contradicts all of these conditions and must not be used for access-control or prioritization decisions. |
| Impact | The supplied CVSS 4.0 vector (AV:N/AC:L/AT:N/PR:N/UI:N/VC:H) is materially inconsistent with the vulnerability description, which describes a physical evil-maid attack requiring the attacker to handle the USB drive before the victim uses it - security teams must not rely on this vector for triage and should apply the independently assessed vector (AV:P) instead. No EPSS score was provided, and CISA KEV status is absent, indicating no confirmed active exploitation. The technical impact upon successful exploitation is severe - arbitrary code execution in the victim's user context - but real-world risk is substantially constrained by the physical access prerequisite, the requirement for victim interaction, the niche deployment footprint of this package, and the targeted nature of the evil-maid scenario. Organizations using openssl-encrypt's verify-usb feature on removable media for supply-chain or field-deployment workflows represent the meaningful risk population; all others have negligible exposure. |
| Exploit ScenarioDerived | An attacker who briefly gains physical access to a USB drive - for example, during shipping, at an unattended workstation, or via insider access - replaces a tool-tree directory with a symlink pointing to an attacker-controlled directory tree containing the same byte-identical .py files plus a crafted __pycache__/*.pyc bytecode file. When the victim later retrieves the drive, runs verify-usb, sees PASSED, and launches the portable install, CPython silently loads the malicious .pyc in preference to the clean source, executing attacker-supplied code in the victim's user context. No public POC has been identified at time of analysis. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Aug 27, 2026
Symlink-following in the openssl-encrypt pip package (jahlives/openssl_encrypt) before 1.4.9 allows an evil-maid attacker with physical access to a target USB drive to bypass the verify-usb v2 integrity check and achieve code execution on the victim's machine. The attacker replaces a tool-tree directory with a symlink to a crafted copy that includes byte-identical visible source files and a planted __pycache__/*.pyc compiled bytecode file; CPython's rglob() does not enumerate symlinked directory contents, so the planted file is never counted, verify-usb reports PASSED, and the malicious bytecode executes when the victim launches the portable install. No public exploit has been identified at time of analysis, and the attack is gated behind physical drive access and victim interaction.
RemediationAI
Upgrade openssl-encrypt to version 1.4.9 or later, which resolves the symlink-following flaw in the verify-usb scan; this is confirmed as the vendor-released fix per the advisory at https://github.com/jahlives/openssl_encrypt/security/advisories/GHSA-hw7h-wqf5-6crx. If an immediate upgrade is not feasible, disable the verify-usb feature and perform USB drive integrity verification through an out-of-band mechanism such as GPG-signed manifests validated on a separate trusted system - note this trades away the convenience of the integrated check. The most effective compensating control for the evil-maid vector is physical custody control: ensuring USB drives used with portable installs are never left unattended or in untrusted hands eliminates the attack entirely without any software change.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in pypi
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-59 (Improper Link Resolution Before File Access), manifesting as an asymmetry between two components of the verify-usb v2 scan in openssl-encrypt. The enumeration path uses Python's pathlib rglob(), which in CPython yields a symlinked directory as a single entry but does not recurse into it, so contents of a symlink-replaced directory are invisible to the file-count logic (added_files). The hashing path uses O_NOFOLLOW, but this flag only prevents following a symlink in the final path component - it does not catch a symlink substituted at the directory level earlier in the path. CPython's bytecode caching compounds the flaw: .pyc files under __pycache__/ are loaded in preference to recompiling .py source files, so an attacker who plants a malicious .pyc alongside legitimate .py files achieves code execution without altering any file that the verifier actually inspects. The affected software is identified by CPE cpe:2.3:a:jahlives:openssl_encrypt:*:*:*:*:*:*:*:*, covering all pre-1.4.9 versions across the 1.4.x and 1.5.x lines.
Know when OpenSSL gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
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
Physical drive access is mandatory for the evil-maid attack, victim must run the install (UI:R), and arbitrary code runs in the victim's environment (scope change).
Primary rating from Vendor (VulnCheck).
CVSS VectorVendor: VulnCheck
Lifecycle Timeline
2DescriptionCVE.org
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).
Articles & Coverage 1
Executive ViewAI
The openssl-encrypt pip package contains a symlink-following vulnerability that bypasses verify-usb v2 integrity checks on portable USB installations, allowing attackers with physical drive access to execute arbitrary code. Organizations using this tool for USB security verification should immediately assess exposure and implement alternative controls, as the vulnerability undermines a critical trust checkpoint in portable deployment workflows.
No vendor-released patch identified at time of analysis. Interim mitigations include: deploy alternative file integrity verification tools that do not follow symlinks, enforce strict physical access controls on USB devices and infrastructure, disable or remove portable installation capabilities where business requirements permit, and implement application allow-listing to prevent unauthorized code execution on target systems.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Remote Code Execution represents the critical moment when an attacker successfully runs arbitrary code on a target system without physical access.
The (1) TLS and (2) DTLS implementations in OpenSSL 1.0.1 before 1.0.1g do not properly handle Heartbeat Extension packe
In order to decrypt SM2 encrypted data an application is expected to call the API function EVP_PKEY_decrypt(). Rated cri
The dtls1_reassemble_fragment function in d1_both.c in OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0
OpenSSL before 0.9.8za, 1.0.0 before 1.0.0m, and 1.0.1 before 1.0.1h does not properly restrict processing of ChangeCiph
The SSLv2 protocol, as used in OpenSSL before 1.0.1s and 1.0.2 before 1.0.2g and other products, requires a server to se
The ssl3_get_key_exchange function in s3_clnt.c in OpenSSL before 0.9.8zd, 1.0.0 before 1.0.0p, and 1.0.1 before 1.0.1k
In addition to the c_rehash shell command injection identified in CVE-2022-1292, further circumstances where the c_rehas
The TLS protocol 1.2 and earlier, when a DHE_EXPORT ciphersuite is enabled on a server but not on a client, does not pro
The SSL protocol 3.0, as used in OpenSSL through 1.0.1i and other products, uses nondeterministic CBC padding, which mak
The AES-NI implementation in OpenSSL before 1.0.1t and 1.0.2 before 1.0.2h does not consider memory allocation during a
The X509_verify_cert function in crypto/x509/x509_vfy.c in OpenSSL 1.0.1n, 1.0.1o, 1.0.2b, and 1.0.2c does not properly
A buffer overrun can be triggered in X.509 certificate verification, specifically in name constraint checking. Rated hig
EUVD-2026-67046
GHSA-vcf6-hg34-vx9w
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB