This is a sharp blade locked inside three nested cabinets
Tenable plugin 171079 is a bundle finding for OpenSSL 1.1.1 before 1.1.1t. The headline driver is CVE-2023-0286: an X.400 GeneralName type confusion that can expose memory or crash the process, but only when the application enables CRL checking and the attacker can usually supply both the certificate chain and the CRL. The same release also fixed CVE-2022-4304 (RSA timing oracle) plus several mostly crash-grade parsing/API bugs such as CVE-2022-4450 and CVE-2023-0215.
The vendor's HIGH label is technically understandable because OpenSSL is everywhere and the lead CVE crosses a security boundary. In real enterprise deployments, though, the exploitable path is much narrower than the label suggests: uncommon X.400 handling, CRL-specific verification behavior, custom network CRL retrieval, or legacy RSA usage. That makes this a patch-worthy library issue, not a fleet-wide fire drill.
4 steps from start to impact.
Reach a service that actually uses vulnerable OpenSSL 1.1.1 code
libssl minor versions.- Target service is reachable from the attacker's network position
- The process is actually linked to vulnerable OpenSSL 1.1.1 code
- The distro/vendor has not already backported the fix
- A lot of enterprise findings are backport false positives when scanners key off upstream version strings
- Library presence does not mean the vulnerable code path is reachable from the network
Force the uncommon validation path for CVE-2023-0286
X509_V_FLAG_CRL_CHECK or equivalent CRL processing and then accept attacker-influenced certificate material. Per the OpenSSL advisory, the most realistic case is software with custom functionality for retrieving CRLs over a network. Weaponization here looks more like a custom test harness using openssl s_server/s_client plus crafted X.509 material than a turnkey spray-and-pray exploit.- CRL checking is enabled in the application
- Attacker can provide the certificate chain and usually the CRL
- Target path processes X.400 address content in
GeneralName
- Most mainstream TLS deployments do not rely on this exact CRL/X.400 combination
- If the attacker controls only one of the two inputs, the other must already contain an uncommon X.400 CRL distribution point
Alternative path: grind a Bleichenbacher-style timing campaign for CVE-2022-4304
- Target exposes RSA decryption behavior reachable across the network
- Attacker can collect many timing samples with low enough noise
- Observed traffic or a live session provides useful ciphertext targets
- Modern ECDHE-forward-secret handshakes and TLS defaults cut down applicability
- Network jitter, rate limits, and load balancers make remote timing attacks hard
- High query volume is likely to stand out in telemetry
Land impact: mostly memory read or process crash, not turnkey RCE
CVE-2023-0286, memory disclosure from the affected process. The rest of the bundled bugs are heavily API- and parser-dependent and usually collapse to denial of service. That matters operationally: this bundle is dangerous in the right app, but it is not broadly wormable across 10,000 hosts.- Exploit path reaches the specific vulnerable function
- The surrounding application behavior does not sanitize or short-circuit the bad input
- Impact often stops at one service process
- No strong evidence of a reliable mass-exploitation chain for the 1.1.1t bundle
The supporting signals.
| In-the-wild status | No solid active exploitation signal found. CVE-2022-4304 is marked Has Public Exploit: No and Has CISA KEV Exploit: No by Wiz; Docker Scout shows Exploits Found: - for CVE-2023-0286. |
|---|---|
| KEV status | Not in the current CISA KEV catalog for the lead issues in this bundle. Treat this as a broad hygiene patch, not a KEV-driven emergency. |
| Proof-of-concept availability | Weak practical PoC signal. There are public advisories, commit diffs, and research writeups, but no authoritative evidence here of a mature, broadly weaponized exploit chain for the 1.1.1t bundle. |
| EPSS | CVE-2023-0286 shows a high EPSS signal in Docker Scout: 0.88452 (99.5th percentile). CVE-2022-4304 is much lower in Wiz: 0.2 (44.9th percentile). For defenders, that mismatch says library prevalence is inflating attention more than reachable enterprise exploitability. |
| CVSS reality check | Lead CVE CVE-2023-0286 is 7.4 / HIGH with CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:H. That AC:H matters; this is not a clean unauthenticated RCE path. |
| Affected versions | OpenSSL lists CVE-2023-0286 and CVE-2022-4304 as affecting 1.1.1 before 1.1.1t. The bundled Tenable finding also includes additional February 7, 2023 fixes in that same upgrade train. |
| Fixed versions | Upstream fix is 1.1.1t. Distro backports matter: Ubuntu fixed 20.04 with 1.1.1f-1ubuntu2.17 and 18.04 with 1.1.1-1ubuntu2.1~18.04.21; Red Hat shipped backported fixes via advisory streams rather than requiring an upstream-looking 1.1.1t string. |
| Exposure/scanning reality | Internet-wide search engines are a poor fit here. You generally cannot prove this exact issue with Shodan/Censys/FOFA alone because they see the service banner, not the reachable CRL/X.400 code path inside the linked library. |
| Disclosure | OpenSSL published the advisory on 2023-02-07. CERT-EU summarized it the same day as an 8-bug OpenSSL security update with one High issue. |
| Reporting researchers | The lead issue CVE-2023-0286 was found by David Benjamin (Google). CVE-2022-4304 was found by Hubert Kario (Red Hat). |
noisgate verdict.
The decisive factor is prerequisite friction: the most serious path usually needs CRL checking plus attacker control of certificate material and, in many cases, custom CRL retrieval behavior. That sharply narrows the reachable population compared with a typical network-facing OpenSSL panic bug, so the vendor's HIGH label overstates fleet-level urgency.
Why this verdict
- CRL gate drops the population hard: the lead High bug only becomes interesting when the app enables CRL checking and the attacker can usually feed both the cert chain and CRL. That is a major downward adjustment from the vendor baseline because most enterprise TLS stacks do not expose that path to arbitrary remote peers.
AC:His doing real work here: the 7.4 CVSS is not lying about technical severity, but the high attack complexity maps to real deployment friction. This is not a default-handshake bug that every exposed HTTPS daemon will happily hand to an unauthenticated internet attacker.- The second-best path is legacy crypto abuse, not mass exploitation:
CVE-2022-4304needs a Bleichenbacher-style timing campaign, large query volume, and favorable network conditions. Requiring legacy RSA decryption behavior and lots of trial traffic is another explicit downward adjustment. - Most of the bundle is crash-grade or API-specific: the other February 7 fixes in 1.1.1t are mostly parser/DoS issues or misuse-prone public API problems. They matter, but they do not justify treating every
1.1.1 < 1.1.1thit like imminent remote code execution. - Ubiquity prevents a LOW: OpenSSL is embedded everywhere, and a few internal PKI, mutual-TLS, VPN, mail, and security products absolutely do use CRLs or brittle certificate parsing paths. That keeps this above backlog noise even after the friction audit.
Why not higher?
There is no strong evidence here of KEV listing, live mass exploitation, or a low-friction unauthenticated RCE path. The attack chain compounds downward: network reachability alone is insufficient, then CRL behavior narrows the population further, and legacy RSA timing attacks narrow it again.
Why not lower?
The lead issue can cross from crash to memory disclosure in the right application, and OpenSSL sits on critical trust boundaries. If you run custom PKI services, mTLS gateways, or products with network CRL retrieval, this bundle is very real even if it is not broadly sprayable.
What to do — in priority order.
- Inventory actual CRL use — Identify which flagged services enable CRL checking or custom CRL retrieval and prioritize those first. For a MEDIUM verdict there is no mitigation SLA — fold this into normal hardening while you work toward the 365-day remediation window.
- Disable legacy TLS_RSA where possible — Reduce exposure to the
CVE-2022-4304timing-oracle path by preferring modern forward-secret cipher suites and removing RSA key-exchange dependencies on externally reachable services. For this verdict there is no mitigation SLA, but do it during the same hardening cycle as your patch validation. - Constrain untrusted certificate material — For internal PKI apps, mTLS gateways, S/MIME/CMS processors, and security appliances, restrict who can feed certificate chains, CRLs, PEM, PKCS7, or CMS content into OpenSSL-backed workflows. With MEDIUM severity, use change-control windows rather than emergency blocks.
- Restart linked services after package updates — OpenSSL fixes do nothing until processes reload the patched library. When you patch, explicitly restart or roll the services that link against
libsslso the remediation actually lands inside the running process set.
- A WAF does not meaningfully protect certificate-validation, CRL-processing, or RSA-decryption code paths inside backend services.
- Pure perimeter exposure counts do not tell you if the vulnerable CRL/X.400 path is reachable; this is configuration- and application-dependent.
- An SBOM alone is not enough, because distro backports can make an old-looking version string patched or a bundled private OpenSSL copy invisible to OS package inventory.
Crowdsourced verification payload.
Run this on the target Linux host that Nessus flagged, not from an auditor workstation. Invoke it as sudo bash ./check_openssl_111t.sh or sudo bash ./check_openssl_111t.sh /usr/bin/openssl; root is recommended so it can query package metadata and inspect common library paths.
#!/usr/bin/env bash
# check_openssl_111t.sh
# Purpose: classify OpenSSL 1.1.1 < 1.1.1t findings as VULNERABLE / PATCHED / UNKNOWN
# Notes:
# - Understands upstream OpenSSL versioning for the 1.1.1 line.
# - Includes a few common distro backport checks (Ubuntu 18.04/20.04).
# - For other distro-backported builds, outputs UNKNOWN rather than guessing.
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN
set -u
OPENSSL_BIN="${1:-$(command -v openssl 2>/dev/null || true)}"
say() { printf '%s\n' "$*"; }
fail_unknown() { say "UNKNOWN: $*"; exit 2; }
fail_vuln() { say "VULNERABLE: $*"; exit 1; }
pass_patched() { say "PATCHED: $*"; exit 0; }
if [[ -z "$OPENSSL_BIN" || ! -x "$OPENSSL_BIN" ]]; then
fail_unknown "openssl binary not found; provide a path, e.g. sudo bash ./check_openssl_111t.sh /usr/bin/openssl"
fi
raw_ver="$($OPENSSL_BIN version 2>/dev/null || true)"
[[ -n "$raw_ver" ]] || fail_unknown "unable to execute openssl version"
# Extract versions like 1.1.1s, 1.1.1t, 3.0.8
ver="$(printf '%s' "$raw_ver" | awk '{print $2}')"
[[ -n "$ver" ]] || fail_unknown "could not parse OpenSSL version from: $raw_ver"
# Compare upstream 1.1.1 letter suffixes.
# Returns numeric ordinal for suffix after 1.1.1 (empty => 0, a => 1, ..., t => 20)
letter_ord() {
local suffix="$1"
if [[ -z "$suffix" ]]; then echo 0; return; fi
local c
c="${suffix:0:1}"
printf '%d' "$(( $(printf '%d' "'${c}") - 96 ))"
}
check_upstream_111() {
local v="$1"
if [[ "$v" =~ ^1\.1\.1([a-z]?)$ ]]; then
local sfx="${BASH_REMATCH[1]}"
local ord
ord="$(letter_ord "$sfx")"
# 1.1.1t == 20
if (( ord >= 20 )); then
pass_patched "upstream OpenSSL version is $v (>= 1.1.1t)"
else
fail_vuln "upstream OpenSSL version is $v (< 1.1.1t)"
fi
fi
}
# Handle obvious upstream cases first.
if [[ "$ver" =~ ^3\.|^1\.0\.2|^1\.1\.0|^1\.0\. ]]; then
fail_unknown "binary reports $ver; this script only verifies the Tenable 1.1.1 < 1.1.1t condition"
fi
check_upstream_111 "$ver"
# Distro package checks for common backports.
if command -v dpkg-query >/dev/null 2>&1; then
os_release="/etc/os-release"
distro_id=""
distro_ver=""
[[ -r "$os_release" ]] && . "$os_release"
distro_id="${ID:-}"
distro_ver="${VERSION_ID:-}"
pkg_ver="$(dpkg-query -W -f='${Version}' libssl1.1 2>/dev/null || true)"
if [[ -n "$pkg_ver" ]]; then
if [[ "$distro_id" == "ubuntu" && "$distro_ver" == "20.04" ]]; then
dpkg --compare-versions "$pkg_ver" ge "1.1.1f-1ubuntu2.17" && pass_patched "Ubuntu 20.04 libssl1.1 package is $pkg_ver (fixed >= 1.1.1f-1ubuntu2.17)"
fail_vuln "Ubuntu 20.04 libssl1.1 package is $pkg_ver (< 1.1.1f-1ubuntu2.17)"
fi
if [[ "$distro_id" == "ubuntu" && "$distro_ver" == "18.04" ]]; then
dpkg --compare-versions "$pkg_ver" ge "1.1.1-1ubuntu2.1~18.04.21" && pass_patched "Ubuntu 18.04 libssl1.1 package is $pkg_ver (fixed >= 1.1.1-1ubuntu2.1~18.04.21)"
fail_vuln "Ubuntu 18.04 libssl1.1 package is $pkg_ver (< 1.1.1-1ubuntu2.1~18.04.21)"
fi
fail_unknown "dpkg package libssl1.1 is $pkg_ver; this distro may use backports not encoded in this script"
fi
fi
if command -v rpm >/dev/null 2>&1; then
rpm_pkg="$(rpm -q --qf '%{NAME} %{VERSION}-%{RELEASE}\n' openssl 2>/dev/null || true)"
if [[ -n "$rpm_pkg" ]]; then
fail_unknown "rpm reports '$rpm_pkg'; use the vendor advisory/errata stream for this distro because backports make upstream-style checks unreliable"
fi
fi
fail_unknown "could not map this host cleanly; raw binary reports '$raw_ver' and no supported package rule matched"If you remember one thing.
171079, identify which ones terminate TLS, perform mTLS, validate CRLs, process PEM/PKCS7/CMS content, or still expose legacy RSA paths, and prioritize those first. Because this is a MEDIUM reassessment, there is no noisgate mitigation SLA — go straight to the 365-day remediation window; use that time to validate backported distro fixes, restart linked services after patching, and clean up the small subset of systems where OpenSSL is sitting in a real certificate-processing trust boundary. If you find custom CRL retrieval or legacy RSA in a public-facing service, treat that subset as an accelerated exception even though the fleet-wide score stays MEDIUM.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.