This is a modern front door that still accepts an old skeleton key for compatibility
Tenable plugin 26928 is not a single product CVE; it is a configuration finding that fires when a scanned TLS/DTLS service will still negotiate weak cipher suites. In practice that means any product or version on the affected port can be flagged if it accepts suites like RC4, 3DES, DES, NULL, EXPORT, or other low-strength combinations, even when the same service also offers strong TLS 1.2/1.3 ciphers.
Tenable's MEDIUM label is reasonable as generic crypto hygiene, but it overstates the operational urgency for most enterprises. Real abuse usually requires the attacker to be an active client using a legacy offer set or to hold an on-path/MITM position, and the usual outcome is a confidentiality downgrade rather than host compromise, so for a 10,000-host patch queue this belongs in LOW unless the service is internet-facing, business-critical, and intentionally supports legacy clients.
4 steps from start to impact.
Enumerate the accepted cipher list
nmap --script ssl-enum-ciphers, openssl s_client, or testssl.sh. This is commodity enumeration, and Tenable itself is effectively doing the same class of handshake probing.- Network reachability to the TLS service
- A listening TLS/DTLS port on the target
- None if the port is reachable; this is easy recon
- Internal-only services already reduce exposed population materially
ssl-enum-ciphers, SSL Labs, and platform-native checks all detect this class well.Gain a position that can actually force or use the weak suite
bettercap, Ettercap, or a rogue proxy to influence downgrade behavior and observe traffic.- Either direct client access to the service or on-path network position
- The target protocol flow must allow the attacker to participate in or observe the handshake
- On-path access implies post-compromise, local network adjacency, or control of client routing
- Modern browsers and OS crypto stacks often refuse or filter many weak suites by default
Negotiate the weak cipher
RC4, DES, export, and null suites when strong crypto settings are used.- The server must still allow the weak suite
- The client stack must still be able to offer it
- Protocol/version compatibility must align
- Many modern client libraries cannot or will not offer the weakest suites anymore
- Servers that prefer strong suites and clients with sane defaults sharply limit practical downgrade paths
Turn weak crypto into useful access
SWEET32-style 64-bit block issues or deprecated RC4/MD5 usage are situational and often require favorable traffic volume, protocol behavior, or prolonged observation to become operationally useful.- A specific exploitable weakness in the negotiated suite
- Enough traffic or protocol context to extract value
- Sensitive data traversing the weakened channel
- This is not a one-packet win and usually not a mass-exploitation path
- Impact is session-level and data-path dependent, not host takeover
The supporting signals.
| In-the-wild status | No direct active-exploitation signal found for this plugin finding. This is a misconfiguration class, not a named CVE with current campaign tracking. |
|---|---|
| Proof-of-concept availability | Commodity enumeration exists everywhere via nmap ssl-enum-ciphers, openssl s_client, and testssl.sh; there is no single exploit repo because impact depends on the exact weak suite and traffic conditions. |
| EPSS | N/A. FIRST EPSS scores published CVEs; Tenable 26928 is a configuration finding without a CVE identifier. |
| KEV status | Not KEV-listed / not applicable. CISA KEV tracks exploited CVEs, and this finding does not map to a single CVE. |
| Vendor CVSS | 5.3 with vector CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:L/I:N/A:N from Tenable. That baseline assumes network reachability and low confidentiality impact, but it does not capture the real-world need for a legacy-capable client or on-path leverage. |
| Affected scope | Any TLS/DTLS service on any product/version that still negotiates low-strength suites on the scanned port. This is configuration-driven, not version-range-driven. |
| Fixed version | No universal patched version exists. Remediation is a cipher-policy/configuration change in the application, TLS terminator, load balancer, or OS crypto policy; distro backports are irrelevant unless they change default cipher policy. |
| Scanning/exposure data | No useful product-level Shodan/Censys/FOFA fingerprint exists because this spans many services and vendors. Exposure has to be measured per endpoint by cipher enumeration, not by product banner. |
| Disclosure timeline | Tenable published the plugin on 2007-10-08 and last updated it on 2021-02-03. |
| Reporting source | The NASL logic shows Tenable reports when cipher_report(..., eq:CIPHER_STRENGTH_LOW) finds supported low-strength suites, confirming this is a weak-cipher acceptance check, not a software-version vulnerability. |
noisgate verdict.
The decisive factor is attacker position and client capability friction: this is usually only useful if the attacker can negotiate legacy crypto directly or hold an on-path position. Without that, the finding is mostly exposure of old compatibility settings rather than a scalable internet exploit path.
Why this verdict
- Start from Tenable's 5.3 baseline, then subtract for attacker position. Real abuse commonly needs a malicious legacy-capable client or an on-path/MITM foothold, which is materially harder than a generic unauthenticated remote exploit.
- Exposure population is much narrower than the plugin name suggests.
26928fires on any reachable TLS service, including internal-only ports, admin planes, and compatibility listeners that are never exposed to arbitrary internet clients. - Blast radius is session confidentiality downgrade, not host compromise. Weak cipher acceptance is bad crypto hygiene, but by itself it does not give RCE, auth bypass, or domain-wide lateral movement.
Why not higher?
There is no KEV signal, no product-specific exploit chain, and no evidence that this finding alone is being mass-weaponized. Modern clients, load balancers, and OS crypto libraries also suppress many of the weakest suites by default, which breaks a lot of theoretical attack paths in practice.
Why not lower?
This is still a real security control gap, especially on internet-facing services or places where legacy clients are common. If the supported suite is truly broken (RC4, DES, NULL, EXPORT, weak MD5 constructions), an attacker with the right position can absolutely turn it into data exposure and compliance pain.
What to do — in priority order.
- Isolate legacy clients — Move any unavoidable legacy TLS support to a separate listener, VIP, or internal-only endpoint so the primary service can run a modern cipher set. For a LOW verdict there is no SLA (treat as backlog hygiene), but do it in the next scheduled TLS hardening cycle rather than leaving the exception on your main edge.
- Enforce strong cipher policy — Disable
RC4,3DES,DES,NULL,EXPORT, anonymous, and similarly weak suites in the application, reverse proxy, load balancer, or OS crypto policy, and preferTLS 1.2/1.3with modern AEAD suites. For a LOW verdict there is no SLA (treat as backlog hygiene), so fold this into standard config management instead of emergency patching. - Log negotiated ciphers — Turn on TLS handshake telemetry at the edge so you can see whether weak suites are ever actually negotiated before and after cleanup. For a LOW verdict there is no SLA (treat as backlog hygiene), but this is the fastest way to separate dead config from real business dependency.
- A WAF does not fix weak TLS negotiation; this happens before HTTP policy enforcement matters.
- Simply patching the OS often does not clear the finding if the application or load balancer still advertises legacy suites.
- Replacing the certificate alone does not help; key material and PKI are separate from cipher-suite policy.
Crowdsourced verification payload.
Run this from an auditor workstation or jump host with network reachability to the target service, not from the target itself. Invoke it as ./check_weak_tls.sh <host> <port> [sni], for example ./check_weak_tls.sh app01.example.com 443 app01.example.com; no root is required, but nmap should be installed for best results.
#!/usr/bin/env bash
# check_weak_tls.sh
# Purpose: detect whether a remote TLS service still negotiates weak cipher suites
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=VULNERABLE, 1=PATCHED, 2=UNKNOWN
set -u
HOST="${1:-}"
PORT="${2:-}"
SNI="${3:-${1:-}}"
if [[ -z "$HOST" || -z "$PORT" ]]; then
echo "Usage: $0 <host> <port> [sni]"
echo "UNKNOWN"
exit 2
fi
have_cmd() { command -v "$1" >/dev/null 2>&1; }
# Prefer Nmap because it enumerates accepted suites directly.
if have_cmd nmap; then
OUT="$(nmap -Pn -sV --script ssl-enum-ciphers -p "$PORT" --script-args tls.servername="$SNI" "$HOST" 2>/dev/null)"
if [[ -z "$OUT" ]]; then
echo "UNKNOWN"
exit 2
fi
# Flag classic weak patterns commonly associated with Nessus 26928-style findings.
if echo "$OUT" | grep -Eiq '(_3DES_|\b3DES\b|_RC4_|\bRC4\b|_DES_|\bDES\b|_NULL_|\bNULL\b|EXPORT|MD5 for message integrity|least strength: [C-F])'; then
echo "VULNERABLE"
exit 0
fi
if echo "$OUT" | grep -Eiq 'ssl-enum-ciphers:'; then
echo "PATCHED"
exit 1
fi
fi
# Fallback to OpenSSL point checks if Nmap is unavailable.
if ! have_cmd openssl; then
echo "UNKNOWN"
exit 2
fi
FOUND=0
TESTED=0
probe() {
local proto="$1"
local cipher="$2"
local out
out="$(echo | openssl s_client -connect "${HOST}:${PORT}" -servername "$SNI" "$proto" -cipher "$cipher" -brief 2>/dev/null || true)"
# OpenSSL may refuse local use of legacy ciphers; that means this probe is inconclusive, not safe.
if echo "$out" | grep -Eiq 'no cipher match|unsupported protocol|wrong version number|unknown option'; then
return 1
fi
TESTED=1
if echo "$out" | grep -Eiq 'Protocol *:|Ciphersuite *:'; then
FOUND=1
return 0
fi
return 1
}
# Common weak suites; availability depends on local OpenSSL build.
for proto in -tls1 -tls1_1 -tls1_2; do
for cipher in RC4-SHA RC4-MD5 DES-CBC3-SHA DES-CBC-SHA NULL-SHA NULL-MD5 EXP-RC4-MD5 ADH-AES128-SHA; do
if probe "$proto" "$cipher"; then
echo "VULNERABLE"
exit 0
fi
done
done
if [[ "$TESTED" -eq 1 ]]; then
echo "PATCHED"
exit 1
fi
echo "UNKNOWN"
exit 2
If you remember one thing.
Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.