Tenable stapled seven paper cuts together and called it a sword
This plugin (296769) bundles seven CVEs affecting OpenSSL 1.1.1 versions before 1.1.1ze, all disclosed between December 2025 and January 2026. The flaws are type-confusion bugs in PKCS#12 parsing (CVE-2025-69421, CVE-2025-69419, CVE-2026-22795), PKCS#7 signature verification (CVE-2026-22796), Timestamp Response verification (CVE-2025-69420), low-level OCB API handling (CVE-2025-69418), and BIO_f_linebuffer short writes (CVE-2025-68160). Every single one produces the same outcome: a crash (NULL pointer deref or invalid read) when the application processes attacker-crafted malformed input. No data exfiltration, no code execution, no privilege escalation — just denial of service.
Tenable's HIGH / CVSS 7.5 rating is an aggregation artifact — it inflates severity by combining multiple individually Low and Medium CVEs into one plugin. The OpenSSL project itself rated every one of these issues as Low severity, with the two January 2026 additions (CVE-2026-22795 and CVE-2026-22796) scoring CVSS 5.5 and 5.3 respectively. The vendor's own assessment is far more accurate here. Tenable's VPR of 7.0 (98th percentile) is also misleading given the absence of any exploitation evidence. Additionally, OpenSSL 1.1.1 has been EOL since September 2023 — patches are only available to premium support customers, which means most organizations running 1.1.1 are carrying broader crypto debt that matters more than these specific bugs.
3 steps from start to impact.
Attacker crafts malformed input
pyasn1 is needed.- Knowledge of the specific ASN.1 malformation pattern
- Target application must parse one of PKCS#12, PKCS#7, or RFC 3161 input
- No public PoC or weaponized tool exists for any of these seven CVEs
- Crafting reliable triggers requires understanding internal OpenSSL ASN.1 parsing paths
Deliver malformed payload to victim application
PKCS12_parse() or PKCS12_get_friendlyname() on attacker-controlled data — typically a certificate import flow. For PKCS#7, the app must call PKCS7_verify() or PKCS7_digest_from_attributes() on untrusted signed data. For timestamps, the app must call TS_RESP_verify_response() on attacker-supplied responses.- Network or file-system path to deliver the payload to the target application
- Target application must accept and parse untrusted PKCS#12/PKCS#7/timestamp data
- Most TLS-serving applications (nginx, Apache, HAProxy) never parse PKCS#12 from untrusted sources at runtime — they load certs at startup from trusted files
- PKCS#7 legacy API usage is declining; OpenSSL recommends the CMS API instead
- RFC 3161 timestamp verification is an extremely narrow use case — mostly used in document signing and code signing workflows
- Email/S/MIME gateways that verify PKCS#7 signatures are the most realistic vector, but these typically run as backend services behind authentication
openssl version on hosts will show the installed version.Application crashes (DoS)
- Successful delivery of malformed input in step 2
- Modern process supervisors (systemd, container orchestrators) will restart the crashed service within seconds
- The attacker must re-deliver the payload for each crash — there is no persistence or lateral movement
- Impact is limited to availability of the specific process that parsed the input
The supporting signals.
| In-the-Wild Exploitation | None observed. No CVE in this bundle appears in the CISA KEV catalog. No campaigns, APT usage, or scanner activity reported by GreyNoise, Shadowserver, or vendor advisories. |
|---|---|
| Proof-of-Concept | None public. No PoC repositories on GitHub. All seven CVEs were reported by Luigino Camastra (Aisle Research) via coordinated disclosure. Aisle published a blog noting AI-assisted discovery but did not release exploit code. |
| EPSS | CVE-2026-22796: 0.51% (42nd percentile). Other CVEs in the bundle have lower or unmeasured EPSS scores. None cross the 1% threshold indicating meaningful predicted exploitation. |
| KEV Status | Not listed. None of the seven CVEs appear in the CISA Known Exploited Vulnerabilities catalog as of 2026-09-17. |
| CVSS Vectors | Highest individual: CVE-2026-22795 at CVSS:3.1/AV:L/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:H (5.5). CVE-2026-22796 at CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L (5.3). CVE-2025-69418 at CVSS:3.1/AV:L/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H (4.7). All others ≤ 4.0. Tenable's aggregate 7.5 is an artificial ceiling. |
| Affected Versions | OpenSSL 1.1.1 through 1.1.1zd. Also affects 3.0 through 3.0.18, 3.3 through 3.3.5, 3.4 through 3.4.3, 3.5 through 3.5.4, and 3.6.0. OpenSSL 1.0.2 variants affected by a subset. |
| Fixed Versions | 1.1.1ze (premium support only). Mainline fixes: 3.6.2, 3.5.6, 3.4.5, 3.3.6, 3.0.19. Distro backports: RHEL via RHSA-2026:1473, Ubuntu via USN updates, Debian via DSA. Check your distro's package version — the upstream version string may differ. |
| EOL Status | OpenSSL 1.1.1 reached end of life September 11, 2023. Patches for 1.1.1ze are only available to premium support customers. Organizations without premium support must migrate to OpenSSL 3.x. |
| Scanning / Exposure | OpenSSL 1.1.1 remains widely deployed on legacy systems. Shodan indexes millions of hosts serving TLS with 1.1.x banners. However, the attack surface for these specific CVEs (PKCS#12/PKCS#7 parsing of untrusted input) is far narrower than the TLS handshake surface. |
| Disclosure Date | 2026-01-27 (initial advisory with 5 CVEs). Corrected advisory adding CVE-2026-22795 and CVE-2026-22796 published same day. All discovered by Luigino Camastra at Aisle Research using AI-assisted fuzzing. |
noisgate verdict.
The single most decisive factor is DoS-only impact with no path to code execution: every CVE in this bundle terminates in a process crash from malformed input parsing, with no demonstrated memory corruption useful for RCE, privilege escalation, or data exfiltration. The Tenable HIGH / CVSS 7.5 is an aggregation artifact that does not reflect any individual vulnerability's actual severity.
Why this verdict
- All individual CVEs are Low/Medium: OpenSSL's own project rated every CVE in this bundle as Low severity. The two highest-scoring (CVE-2026-22795 at 5.5 and CVE-2026-22796 at 5.3) are Medium. Tenable's aggregate 7.5 is an artifact of bundling, not a reflection of any single exploitable flaw.
- Attack surface is narrow: Exploitation requires the victim application to parse untrusted PKCS#12, PKCS#7, or RFC 3161 data. The vast majority of OpenSSL deployments use it for TLS termination, where these code paths are never reached by external input. S/MIME verification gateways and certificate import workflows are the realistic vectors, representing a small fraction of the installed base.
- No exploitation evidence or PoC: Zero CVEs are KEV-listed, EPSS scores are below 1%, and no public proof-of-concept exists. The researcher (Aisle Research) performed coordinated disclosure without releasing exploit code.
- Role multiplier: OpenSSL is deployed across all role tiers — workstations, application servers, identity providers, edge appliances, and backup infrastructure. However, these specific CVEs only trigger via PKCS#12/PKCS#7/timestamp *parsing* of untrusted input, which is not a code path exercised in standard TLS serving. On a high-value target like an identity provider or edge appliance, the worst-case outcome is a service crash (availability impact) followed by automatic restart — not domain takeover, credential theft, or lateral movement. The DoS-only blast radius does not meet the HIGH floor threshold because no chain ends in fleet compromise or identity-scale impact.
- EOL amplifier noted but not severity-changing: OpenSSL 1.1.1 EOL status is a strategic risk (no free patches), but it does not increase the *technical* severity of these specific bugs. It belongs in remediation guidance, not the severity rating.
Why not higher?
These are DoS-only vulnerabilities with no demonstrated path to code execution. The one-byte out-of-bounds write in CVE-2025-69419 is constrained to a single byte before the buffer and is not believed exploitable for RCE. Without code execution, privilege escalation, or data access, the blast radius on even high-value targets is limited to temporary availability loss — recoverable via process restart. No KEV listing, no exploitation in the wild, and no public PoC further eliminate upward pressure.
Why not lower?
CVE-2026-22796 is network-reachable (AV:N) without authentication in applications that verify PKCS#7 signatures on untrusted input, such as S/MIME gateways. While the population of such applications is small, the unauthenticated remote DoS vector prevents a LOW rating. The sheer number of affected code paths (seven distinct bugs across three subsystems) also increases the probability that at least one vector is reachable in a given environment.
What to do — in priority order.
- Migrate off OpenSSL 1.1.1 to a supported 3.x branch — This is the real fix. OpenSSL 1.1.1 has been EOL since September 2023 and carries accumulating unpatched risk beyond these seven CVEs. Plan migration to OpenSSL 3.4+ within the noisgate remediation SLA of 365 days for MEDIUM findings. If you have premium support, apply 1.1.1ze as an interim step.
- Audit applications for untrusted PKCS#12/PKCS#7 input acceptance — Identify which applications call
PKCS12_parse(),PKCS7_verify(),PKCS7_digest_from_attributes(), orTS_RESP_verify_response()on data from untrusted sources. If none do, your effective exposure is zero. Prioritize S/MIME gateways, certificate enrollment portals, and document signing services. - Use CMS APIs instead of legacy PKCS#7 APIs — OpenSSL recommends the CMS API over the PKCS#7 API. Applications using CMS equivalents are not affected by CVE-2026-22796. This is a code-level change for application developers.
- Deploy WAF rules to inspect and reject malformed PKCS#7/PKCS#12 content types — If you have applications accepting signed data over HTTP, configure your WAF or reverse proxy to validate or reject
application/pkcs7-mimeandapplication/x-pkcs12payloads that fail basic structural checks.
- TLS configuration hardening (cipher suites, protocol versions) does not help — these bugs are in certificate/signature parsing code paths, not the TLS handshake.
- Network segmentation alone does not mitigate CVE-2026-22796 if the vulnerable application is intentionally exposed to receive signed data from external parties (e.g., S/MIME, B2B document exchange).
- Upgrading to a newer 1.1.1 patch without premium support is not possible — OpenSSL 1.1.1ze is only available to premium support subscribers.
Crowdsourced verification payload.
Run this on each target host as any user with read access to the OpenSSL binary. Example: bash check_openssl_1.1.1ze.sh or bash check_openssl_1.1.1ze.sh /usr/local/ssl/bin/openssl if OpenSSL is installed in a non-default location. No root privileges required.
#!/usr/bin/env bash
# check_openssl_1.1.1ze.sh — Verify whether host is vulnerable to Tenable 296769
# Checks for OpenSSL 1.1.1 < 1.1.1ze
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -euo pipefail
OPENSSL_BIN="${1:-openssl}"
if ! command -v "$OPENSSL_BIN" &>/dev/null; then
echo "UNKNOWN — openssl binary not found at '$OPENSSL_BIN'"
exit 2
fi
VERSION_STRING=$("$OPENSSL_BIN" version 2>/dev/null)
if [[ -z "$VERSION_STRING" ]]; then
echo "UNKNOWN — could not determine OpenSSL version"
exit 2
fi
echo "Detected: $VERSION_STRING"
# Check if this is a 1.1.1 release
if [[ "$VERSION_STRING" =~ OpenSSL\ 1\.1\.1([a-z]*) ]]; then
PATCH="${BASH_REMATCH[1]}"
# 1.1.1ze is the minimum safe version
# Patch letters: empty < a < b < ... < z < za < zb < ... < ze
if [[ -z "$PATCH" ]]; then
echo "VULNERABLE — OpenSSL 1.1.1 (no patch letter) is affected"
exit 1
elif [[ ${#PATCH} -eq 1 ]]; then
# Single letter: a-z, all vulnerable (need ze which is 2 chars)
echo "VULNERABLE — OpenSSL 1.1.1${PATCH} is below 1.1.1ze"
exit 1
elif [[ ${#PATCH} -eq 2 && "${PATCH:0:1}" == "z" ]]; then
SECOND="${PATCH:1:1}"
# Compare second character: a,b,c,d are below e
if [[ "$SECOND" < "e" ]]; then
echo "VULNERABLE — OpenSSL 1.1.1${PATCH} is below 1.1.1ze"
exit 1
else
echo "PATCHED — OpenSSL 1.1.1${PATCH} is at or above 1.1.1ze"
exit 0
fi
else
# 3+ char patch or non-z prefix — likely newer
echo "PATCHED — OpenSSL 1.1.1${PATCH} appears to be at or above 1.1.1ze"
exit 0
fi
elif [[ "$VERSION_STRING" =~ OpenSSL\ ([0-9]+)\.([0-9]+)\.([0-9]+) ]]; then
MAJOR="${BASH_REMATCH[1]}"
MINOR="${BASH_REMATCH[2]}"
# OpenSSL 3.x — not affected by this specific plugin (different branch)
# OpenSSL 1.0.x — different plugin covers that
if [[ "$MAJOR" -ge 3 ]]; then
echo "PATCHED — OpenSSL ${MAJOR}.${MINOR}.x is not in the 1.1.1 branch (check separate plugins for 3.x vulns)"
exit 0
else
echo "UNKNOWN — OpenSSL ${MAJOR}.${MINOR}.x detected; this script checks 1.1.1 only"
exit 2
fi
else
echo "UNKNOWN — version string '$VERSION_STRING' does not match expected OpenSSL format"
exit 2
fiIf you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.