← Back to Feed CACHED · 2026-09-17 06:46:43 · CACHE_KEY tenable:209149
tenable:209149 · CWE-787 · Disclosed 2024-10-16

OpenSSL 1.1.1 < 1.1.1zb Vulnerability

ASSESSED — NOISGATE
Vendor
Reassessed
Verdict:
Do you agree?
01 · The Real Story

Like finding a trap door in a room that no one has a key to

CVE-2024-9143 is an out-of-bounds memory read/write in OpenSSL's low-level GF(2^m) binary elliptic curve APIs — specifically EC_GROUP_new_curve_GF2m(), EC_GROUP_new_from_params(), and the BN_GF2m_*() family. When an application passes *untrusted explicit values* for the field polynomial into these APIs, the underlying BN_GF2m_poly2arr() function can walk past array boundaries. The bug affects every OpenSSL branch: 1.0.2 < 1.0.2zl, 1.1.1 < 1.1.1zb, 3.0 < 3.0.16, 3.1 < 3.1.8, 3.2 < 3.2.4, and 3.3 < 3.3.3. Disclosed 16 October 2024.

Tenable labels this MEDIUM (CVSS 4.3) but even OpenSSL's own project rates it LOW. The reason is simple: virtually no production application feeds untrusted explicit binary-curve parameters into these low-level APIs. Standard TLS handshakes use named curves. X.509 certificate processing uses X9.62 encoding, which *cannot represent* the malformed input required to trigger the bug. You would need a bespoke application that deliberately parses attacker-controlled curve definitions through the raw EC math layer — a scenario that borders on academic. Tenable's MEDIUM overstates the real-world risk; OpenSSL's own LOW is the honest call.

"Exotic elliptic-curve API nobody calls with untrusted input — patch in your normal cycle."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Identify a target application using GF(2^m) low-level APIs

The attacker must first find a service that exposes OpenSSL's low-level binary elliptic curve APIs to external input. This means the application is *not* using standard named curves or X9.62-encoded parameters — it is explicitly constructing curve groups from raw polynomial values supplied by the caller. Virtually no mainstream TLS server, VPN gateway, or web application does this.
Conditions required:
  • Target application uses EC_GROUP_new_curve_GF2m() or EC_GROUP_new_from_params() with explicit binary curve parameters
  • Application accepts these parameters from untrusted input
Where this breaks in practice:
  • Standard TLS (nginx, Apache, HAProxy) uses named curves exclusively
  • X.509 certificate validation uses X9.62 encoding which cannot carry the malformed input
  • No known mainstream application or protocol feeds untrusted explicit polynomial values to these APIs
Detection/coverage: Nessus plugin 209149 detects the *version* but cannot determine whether the vulnerable API is actually reachable.
STEP 02

Craft a malicious GF(2^m) field polynomial

The attacker constructs a specially crafted polynomial value that, when parsed by BN_GF2m_poly2arr(), causes the function to write beyond the bounds of an internal array. The malformed value must be a valid-looking but oversized polynomial representation.
Conditions required:
  • Knowledge of the internal array sizing in BN_GF2m_poly2arr()
  • Ability to deliver the crafted value to the vulnerable API call
Where this breaks in practice:
  • Exploitability depends on heap layout and ASLR; OpenSSL notes RCE cannot be ruled out but crash is the likely outcome
  • 17 GitHub PoCs exist but demonstrate crashes, not weaponized RCE
STEP 03

Trigger OOB read/write leading to crash or potential RCE

The malformed polynomial triggers an out-of-bounds memory access. In most scenarios this results in a segfault and application crash (DoS). Theoretical RCE would require precise heap grooming and ASLR bypass, which is not demonstrated in any known PoC. Impact is limited to the single process instance handling the malicious input.
Conditions required:
  • Successful delivery of crafted polynomial to the vulnerable code path
  • Heap state favorable for exploitation beyond DoS
Where this breaks in practice:
  • ASLR on modern Linux/Windows makes reliable RCE extremely difficult
  • Process-level crash only — no lateral movement, no privilege escalation inherent to the bug
  • Crash restarts cleanly under systemd / process supervisors
Detection/coverage: Application crash logs (SIGSEGV) would be visible. No specific IDS/IPS signature required given the improbability of the attack path.
03 · Intelligence Metadata

The supporting signals.

In-the-Wild ExploitationNone observed. Not listed in CISA KEV. No known campaigns or threat-actor usage.
Proof-of-Concept17 public PoC repositories on GitHub demonstrate crash/DoS onlyno weaponized RCE exploit. All require direct API invocation with crafted parameters.
EPSS Score0.058 (~6th percentile) — bottom tier, reflecting negligible real-world exploitation probability.
KEV StatusNot listed. No CISA KEV entry as of September 2026.
CVSS VectorCVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:L/A:N (Tenable, 4.3). OpenSSL self-rates as LOW. SUSE scored 7.0 using pure-impact methodology, but OpenSSL's exploitability-weighted LOW is more accurate.
Affected VersionsOpenSSL 1.1.1 through 1.1.1za (all prior to 1.1.1zb). Also affects 1.0.2 < 1.0.2zl, 3.0 < 3.0.16, 3.1 < 3.1.8, 3.2 < 3.2.4, 3.3 < 3.3.3.
Fixed Versions1.1.1zb (premium support only), 3.0.16, 3.1.8, 3.2.4, 3.3.3. Distro backports: RHEL/CentOS via openssl-1.1.1k errata, Debian/Ubuntu via point releases.
Scanning/ExposureOpenSSL 1.1.1 remains widely deployed on RHEL 8, Amazon Linux 2, and Ubuntu 20.04 LTS systems. However, exposure to the vulnerable code path is near-zero — version detection alone vastly overstates risk.
Disclosure Date2024-10-16 (OpenSSL security advisory)
ReporterReported by the OpenSSL project; fix authored by Roumen Petrov and Viktor Dukhovni.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (2.5/10)

The single most decisive factor is the near-zero reachable attack surface: the vulnerable GF(2^m) low-level APIs are not invoked by any standard TLS, X.509, or cryptographic protocol path, so the bug is unreachable in virtually all production deployments. No amount of OpenSSL's ubiquity compensates when the code path itself is dormant.

HIGH Vulnerability reachability assessment (standard TLS/X.509 unaffected)
HIGH No in-the-wild exploitation
MEDIUM Comprehensive PoC review (crash-only, no RCE demonstrated)

Why this verdict

  • Unreachable code path in production: Standard TLS handshakes, X.509 certificate parsing, and all common OpenSSL consumers (nginx, Apache, curl, Python ssl, Node.js) use named curves or X9.62 encoding. The vulnerable BN_GF2m_poly2arr() function is only reached via exotic explicit binary curve parameter APIs that no mainstream application calls with untrusted input.
  • No exploitation evidence or weaponization: Zero in-the-wild exploitation, no KEV listing, EPSS at 0.058. The 17 GitHub PoCs demonstrate controlled crashes via direct API calls — not network-deliverable exploits.
  • Role multiplier: OpenSSL is deployed on domain controllers, hypervisors, CI/CD servers, and network appliances — all high-value roles. However, the vulnerable code path (explicit GF(2^m) curve construction from untrusted input) is not exercised by any of these roles' standard operations (TLS termination, LDAPS, SSH, HTTPS). The blast radius is therefore zero in practice across all deployment roles, because reachability — not just presence of the library — determines exploitability. The role-multiplier floor does not apply when the code path is provably unreachable in standard configurations.
  • OpenSSL's own LOW rating is authoritative: The project that wrote the code assessed it as LOW severity, explicitly noting the extreme narrowness of the vulnerable scenario. Tenable's MEDIUM (4.3) overweights theoretical network reachability without accounting for API-level unreachability.

Why not higher?

Upgrading to MEDIUM or above would require evidence that production applications actually feed untrusted explicit binary curve parameters into the low-level GF(2^m) APIs. No such application has been identified. The 17 PoCs all require direct programmatic invocation — none demonstrate a network-deliverable attack. Without a reachable attack surface, severity inflation is unjustified.

Why not lower?

IGNORE would be appropriate only if the code were entirely dead. While the GF(2^m) APIs are rarely used, they *are* compiled into the library and theoretically callable. A custom or niche application could conceivably use them with untrusted input. Retaining LOW acknowledges this tail risk and ensures the fix is picked up in normal patching cycles rather than being completely dropped.

05 · Compensating Control

What to do — in priority order.

  1. Audit applications for GF(2^m) API usage — Grep your codebase and linked libraries for calls to EC_GROUP_new_curve_GF2m, EC_GROUP_new_from_params, and BN_GF2m_poly2arr. If none are found (overwhelmingly likely), document the finding and deprioritize. This is backlog hygiene — no mitigation SLA applies at LOW severity.
  2. Patch OpenSSL in your normal OS update cycle — Roll the fix in with your next quarterly or annual OS patching window. For RHEL 8 / Amazon Linux 2 / Ubuntu 20.04, apply the vendor-backported openssl package update. No emergency change window is warranted.
  3. Consider migrating off OpenSSL 1.1.1 — OpenSSL 1.1.1 reached end-of-life on 2023-09-11. Continued use requires premium support contracts for security patches like 1.1.1zb. Plan migration to OpenSSL 3.x as part of OS lifecycle (RHEL 9, Ubuntu 22.04+). This is a strategic item, not an urgent CVE response.
What doesn't work
  • WAF rules — the vulnerability is in a low-level cryptographic API, not an HTTP endpoint. No WAF signature can filter polynomial parameters embedded in binary protocol exchanges.
  • TLS configuration hardening (disabling weak ciphers/curves) — the bug is not in the TLS protocol layer. Disabling binary curves at the TLS config level does not prevent a local application from calling the raw API directly.
  • Network segmentation — irrelevant when the attack requires the application itself to misuse the API with untrusted input; network position is not the bottleneck.
06 · Verification

Crowdsourced verification payload.

Run on each target host as any user. Example: bash check_cve_2024_9143.sh. No elevated privileges required — it simply reads the OpenSSL version string.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash\n# check_cve_2024_9143.sh — Detect OpenSSL 1.1.1 < 1.1.1zb (CVE-2024-9143)\n# Run on the target host. No root required.\n# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN\n\nset -euo pipefail\n\nVERSION=$(openssl version 2>/dev/null || true)\n\nif [[ -z \"$VERSION\" ]]; then\n  echo \"UNKNOWN — openssl binary not found in PATH\"\n  exit 2\nfi\n\n# Extract version string, e.g. \"1.1.1za\" or \"3.0.16\"\nVER=$(echo \"$VERSION\" | grep -oP '\\d+\\.\\d+\\.\\d+[a-z]*')\n\n# Check if it is in the 1.1.1 branch\nif [[ \"$VER\" =~ ^1\\.1\\.1 ]]; then\n  SUFFIX=${VER#1.1.1}\n  # 1.1.1zb or later is patched. Suffixes: a < b < ... < z < za < zb\n  if [[ -z \"$SUFFIX\" ]]; then\n    echo \"VULNERABLE — OpenSSL $VER (no letter suffix, pre-1.1.1a)\"\n    exit 1\n  fi\n  # Compare suffix lexicographically; zb is the fix\n  # Suffixes go: a..z, za, zb, zc...\n  if [[ ${#SUFFIX} -eq 1 ]]; then\n    echo \"VULNERABLE — OpenSSL $VER (prior to 1.1.1zb)\"\n    exit 1\n  elif [[ ${#SUFFIX} -eq 2 ]]; then\n    if [[ \"$SUFFIX\" < \"zb\" ]]; then\n      echo \"VULNERABLE — OpenSSL $VER (prior to 1.1.1zb)\"\n      exit 1\n    else\n      echo \"PATCHED — OpenSSL $VER (>= 1.1.1zb)\"\n      exit 0\n    fi\n  else\n    echo \"PATCHED — OpenSSL $VER (suffix beyond zb)\"\n    exit 0\n  fi\nelif [[ \"$VER\" =~ ^3\\. ]]; then\n  echo \"UNKNOWN — OpenSSL 3.x branch detected ($VER). Check against 3.0.16/3.1.8/3.2.4/3.3.3 separately.\"\n  exit 2\nelse\n  echo \"UNKNOWN — Unexpected OpenSSL version: $VER\"\n  exit 2\nfi
07 · Bottom Line

If you remember one thing.

TL;DR
This is a backlog-hygiene patch, not an emergency. CVE-2024-9143 affects a low-level elliptic curve API that no standard TLS or X.509 workflow ever calls with untrusted input. At a noisgate-assessed LOW, there is no mitigation SLA — treat it as backlog. Roll the OpenSSL update into your next scheduled OS patching cycle under the noisgate remediation SLA of best-effort backlog. The more important action item is strategic: OpenSSL 1.1.1 is end-of-life since September 2023, meaning you are only getting patches like 1.1.1zb if you pay for premium support. Plan your migration to OpenSSL 3.x (via RHEL 9, Ubuntu 22.04+, or Amazon Linux 2023) — that EOL debt is a bigger risk than this CVE.

Sources

  1. Tenable Plugin 209149
  2. OpenSSL 1.1.1 Vulnerabilities Page
  3. NVD — CVE-2024-9143
  4. Red Hat CVE Page
  5. SentinelOne Vulnerability Database
  6. Snyk — CVE-2024-9143
  7. Extreme Networks Advisory SA-2024-111
Peer Review

What defenders are saying.

Submit a review attribution: handle + country only
0 flags selected · stored anonymously
Validation Results

Crowdsourced verification outputs.

Results submitted by users who ran the verification payload against their environment.