Like a doorbell that jams if you hold the button — annoying, not dangerous
CVE-2023-3446 and CVE-2023-3817 are algorithmic complexity bugs in OpenSSL's DH_check(), DH_check_ex(), and EVP_PKEY_param_check() functions. When these functions process a crafted DH key with an excessively large p or q parameter, they enter a computationally expensive loop that can cause significant delays. The impact is purely denial-of-service — no memory corruption, no code execution, no data leak. Affected versions: OpenSSL 1.1.1 through 1.1.1u (fixed in 1.1.1v, released July 2023). The same bugs affected OpenSSL 3.0.x and 3.1.x lines and were fixed in their respective releases.
The vendor's MEDIUM / CVSS 5.3 rating is generous for the real-world risk here. Even the CVSS vector acknowledges only Low availability impact (A:L), meaning partial degradation rather than a full crash. Tenable's own VPR engine scored this at 1.2 (Low) — among the lowest possible — reflecting zero exploitation activity, no weaponized PoC, and a very narrow trigger path. Most production TLS servers never call DH_check() on untrusted input during normal handshake flows; the function is primarily used in key-generation and parameter-validation utilities. The vendor MEDIUM overstates the operational risk.
3 steps from start to impact.
Identify target using OpenSSL DH parameter validation
DH_check(), DH_check_ex(), or EVP_PKEY_param_check(). Standard TLS handshakes with static server DH params do NOT trigger this path. Custom key-exchange implementations or certificate validation tools that parse untrusted DH params are required.- Target application calls DH_check() on attacker-controlled input
- OpenSSL < 1.1.1v (or < 3.0.10, < 3.1.2)
- Most TLS servers use ECDHE, not finite-field DH
- DH_check() is rarely invoked on untrusted parameters in production flows
- Applications using ephemeral DH generate params internally, not from external input
Craft oversized DH parameter payload
p value (CVE-2023-3446) or q value (CVE-2023-3817). No special tooling is needed — OpenSSL command-line tools can generate arbitrarily large DH params. The crafted payload is sent to the target endpoint.- Network reachability to the target service
- The service accepts and parses the crafted DH parameters
- WAFs and protocol-level input validation may reject oversized payloads
- TLS libraries typically enforce maximum parameter sizes during handshake
Trigger CPU-bound loop in DH_check
DH_check() enters a computationally expensive primality-testing loop on the oversized parameter. The thread or process servicing this request stalls for an extended period. Impact is CPU consumption and request latency — not a crash or memory corruption. The service degrades but typically recovers when the check completes or times out.- Steps 1 and 2 successful
- Impact is A:L (partial degradation), not full service outage
- Multi-threaded or async servers may only block one worker
- Rate limiting or connection timeouts bound the blast radius
- Attacker must sustain malicious requests to maintain degradation
The supporting signals.
| In-the-wild exploitation | None observed. Not listed in CISA KEV. No known campaigns targeting these CVEs. |
|---|---|
| Proof-of-concept | No weaponized PoC available. Crafting oversized DH params is trivial with openssl dhparam, but no exploit tooling or Metasploit module exists. |
| EPSS (CVE-2023-3446) | 6.53% probability of exploitation in 30 days — 93rd percentile. Elevated percentile driven by OpenSSL's ubiquity, not actual exploitation signals. |
| EPSS (CVE-2023-3817) | 3.05% — 87th percentile. |
| KEV status | Not listed. Neither CVE appears in the CISA Known Exploited Vulnerabilities catalog. |
| CVSS vector | CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:L — Network-accessible, no auth required, but only *Low* availability impact. Zero confidentiality or integrity impact. |
| Affected versions | OpenSSL 1.1.1 through 1.1.1u, OpenSSL 3.0.0 through 3.0.9, OpenSSL 3.1.0 through 3.1.1. Also affects 1.0.2 (premium support only). |
| Fixed versions | 1.1.1v (2023-08-01), 3.0.10 (2023-08-01), 3.1.2 (2023-08-01). Distro backports: RHEL 8/9, Ubuntu 20.04/22.04, Debian 11/12 patched via OS packages. |
| Exposure data | OpenSSL powers ~70% of internet-facing TLS endpoints. However, the *vulnerable code path* (DH_check on untrusted input) is exercised by a vanishingly small fraction of deployments. |
| Disclosure & credit | CVE-2023-3446 reported via OSSfuzz on 2023-06-25, disclosed 2023-07-19. CVE-2023-3817 disclosed 2023-07-31 as an incomplete-fix follow-up. OpenSSL 1.1.1 reached end of life 2023-09-11 — no further public patches. |
noisgate verdict.
The single most decisive factor is the DoS-only impact ceiling combined with an exceptionally narrow trigger path — the vulnerable DH_check() function is almost never called on attacker-controlled input in production TLS deployments. Tenable's own VPR of 1.2 corroborates that real-world risk is well below the CVSS 5.3 label.
Why this verdict
- DoS-only, Low availability impact: The CVSS vector itself rates availability as
A:L— partial degradation, not service crash. No path to code execution, data exfiltration, or privilege escalation exists. - Narrow trigger path: The vulnerable functions (
DH_check,DH_check_ex,EVP_PKEY_param_check) are parameter-validation utilities. Standard TLS handshake flows using ECDHE — which dominate modern deployments — never invoke them on external input. - Zero exploitation evidence: No KEV listing, no known campaigns, no weaponized PoC, and VPR 1.2 (among the lowest possible scores). Three years post-disclosure with no exploitation activity is a strong negative signal.
- Role multiplier: OpenSSL runs on network edge appliances (F5, Citrix, HAProxy), identity providers, and CI/CD infrastructure. In *all* these high-value roles, the impact ceiling remains DoS — not compromise, not lateral movement, not data theft. A DoS against a load balancer is operationally disruptive but does not meet the floor criteria of domain takeover, fleet compromise, or supply-chain pivot. The floor rule does not apply.
Why not higher?
To warrant MEDIUM, we'd need either active exploitation, a realistic path to service-level outage (A:H), or evidence that a meaningful fraction of deployments call DH_check() on untrusted parameters. None of these conditions hold. The VPR 1.2 is the market's clearest signal that this is background noise.
Why not lower?
We don't drop to IGNORE because OpenSSL 1.1.1 is end-of-life since September 2023 — any host still running it has a broader hygiene problem, and this finding serves as a useful signal to drive migration. The CVEs are also real bugs with a theoretically exploitable path, even if impractical.
What to do — in priority order.
- Prioritize migration off OpenSSL 1.1.1 entirely — OpenSSL 1.1.1 has been EOL since September 2023. These specific CVEs are low-risk, but the branch receives no new security patches. Treat this finding as a migration trigger toward OpenSSL 3.x. No mitigation SLA for LOW — treat as backlog hygiene, but the EOL status should elevate migration priority in your roadmap.
- Audit application code for DH_check() on untrusted input — Grep your codebase and vendor configurations for calls to
DH_check(),DH_check_ex(), orEVP_PKEY_param_check()that operate on externally supplied parameters. If none exist (likely), this CVE is not reachable in your environment. - Enforce ECDHE-only cipher suites — Disable finite-field DH key exchange in TLS configurations (
DHE-*cipher suites). This eliminates the DH parameter exchange path entirely and is a best practice regardless of this CVE. - Apply OS vendor backport patches — RHEL, Ubuntu, Debian, and SUSE all shipped backported fixes. If you can't migrate to OpenSSL 3.x yet, apply your distro's patched 1.1.1 package as an interim step.
- WAF rules — These CVEs don't exploit HTTP-layer input. The DH parameter exchange happens at the TLS layer, below where a WAF operates.
- Rate limiting alone — While rate limiting bounds sustained DoS, the root issue is algorithmic complexity in a single request's processing, not volume-based flooding.
Crowdsourced verification payload.
Run this on each target host to check the installed OpenSSL version. Requires read access to the openssl binary (no root needed). Example: bash check_openssl_dh.sh
#!/bin/bash
# noisgate verification for Tenable 178475
# CVE-2023-3446 / CVE-2023-3817 — OpenSSL DH_check DoS
# Run on target host. No root required.
OPENSSL_BIN=$(command -v openssl 2>/dev/null)
if [ -z "$OPENSSL_BIN" ]; then
echo "UNKNOWN — openssl binary not found in PATH"
exit 2
fi
VERSION=$($OPENSSL_BIN version 2>/dev/null)
if [ $? -ne 0 ]; then
echo "UNKNOWN — failed to query openssl version"
exit 2
fi
echo "Detected: $VERSION"
# Extract version string
if echo "$VERSION" | grep -qE 'OpenSSL 1\.1\.1[a-u]?[ -]'; then
# Matches 1.1.1 through 1.1.1u (letters a-u)
echo "VULNERABLE — $VERSION is affected by CVE-2023-3446 / CVE-2023-3817"
echo "NOTE: OpenSSL 1.1.1 reached end-of-life on 2023-09-11"
exit 1
elif echo "$VERSION" | grep -qE 'OpenSSL 1\.1\.1[v-z]'; then
echo "PATCHED — $VERSION includes fixes for CVE-2023-3446 / CVE-2023-3817"
echo "WARNING: OpenSSL 1.1.1 is still end-of-life. Plan migration to 3.x."
exit 0
elif echo "$VERSION" | grep -qE 'OpenSSL 3\.[0-9]'; then
echo "PATCHED — $VERSION (OpenSSL 3.x branch). Verify >= 3.0.10 or >= 3.1.2 for full fix."
exit 0
else
echo "UNKNOWN — version string not recognized: $VERSION"
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.