Heartbleed (CVE-2014-0160) Explained: Impact and Remediation
Published July 29, 2026 · 9 min read
Heartbleed (CVE-2014-0160) was the vulnerability that gave bugs a logo. Disclosed in April 2014, it was a small mistake in OpenSSL — the library that secures a large fraction of the web — that let anyone read chunks of a server's memory, including the private keys meant to protect every connection. Here is exactly what went wrong, why it mattered so much, and how you find and fix it.

The heartbeat that bled
TLS has an optional heartbeatextension (RFC 6520): a keep-alive where one side sends a small payload and the other echoes it back, to confirm the connection is still live without renegotiating. The request says “here are N bytes, send them back to me.”
OpenSSL's implementation trusted the length field in that request without checking it against how much data actually arrived. An attacker could send a one-byte payload but claim it was 64 kilobytes. OpenSSL dutifully copied 64 kilobytes starting at the payload's location in memory — the one real byte plus roughly 64KB of whatever happened to sit next to it in the process — and sent all of it back. The attacker asked for more than they gave, and the server handed over its own memory. That is why the class of bug is a buffer over-read: no crash, no corruption, just data disclosure.
Why leaking memory was catastrophic
A 64KB read sounds modest until you consider what lives in the memory of a busy TLS server: decrypted requests and responses, usernames and passwords, session cookies, and — the worst case — the server's private key. The read was repeatable, so an attacker could poll a server thousands of times and reassemble a detailed picture of its memory over time.
A leaked private key is not a “change your password” problem. It lets an attacker impersonate the server or decrypt traffic they recorded earlier. And because the attack rode inside normal-looking TLS heartbeats, it left no unusual entries in typical application logs. Defenders had no reliable way to know whether their keys had already been taken — which is why the response had to assume the worst.
Affected versions
The heartbeat feature landed in the OpenSSL 1.0.1 branch in 2012, and the bug came with it. Older branches never had the code and were never affected:
| OpenSSL branch | Status | Fixed in |
|---|---|---|
| 1.0.1 – 1.0.1f | Vulnerable | 1.0.1g |
| 1.0.2-beta | Vulnerable | 1.0.2-beta2 |
| 1.0.0 branch | Not affected | — |
| 0.9.8 branch | Not affected | — |
The fixed release, 1.0.1g, shipped on the same day as public disclosure, April 7, 2014. Notably, Heartbleed carried a CVSS v2 base score of only 5.0— a “medium” — because that scoring model weighted confidentiality-only impact modestly. It is a classic example of why a raw score is not the whole story: the real-world impact of leaking private keys was far more severe than the number suggested. For how scores are built and where they fall short, see our guide to the NVD and CVSS scoring.
How to detect vulnerable OpenSSL
On a single host you can check the linked OpenSSL version, though the version banner is not the whole answer:
openssl version -a
The complication is the same one that dogs most OS-package CVEs: distributions backport the fix into their own package builds without changing the upstream 1.0.1 version string. A server can report a version that looks vulnerable while carrying the patch, or vice versa. The dependable signal is the distribution's package release metadata, not the OpenSSL banner — which is why we favor reading the actual installed state over matching version strings against advisories. For scanning at fleet scale, check the installed OpenSSL package in each image rather than probing every service by hand.
How to remediate
- Upgrade OpenSSL.Move to 1.0.1g or later — in practice, the current patched package for your distribution. Rebuilding with
-DOPENSSL_NO_HEARTBEATSdisables the feature entirely and was a valid stopgap at the time. - Restart everything linked against it. A library upgrade does not take effect in long-running processes until they restart. Bounce every service that uses OpenSSL, or the old, vulnerable code stays resident in memory.
- Reissue certificates with new keys. Assume the private key may already have leaked. Generate fresh keys, get new certificates, and revoke the old ones. Patching stops future leaks; it does nothing about a key that is already gone.
- Rotate exposed secrets. Reset passwords, invalidate session tokens, and rotate API keys that could have been sitting in server memory during the exposure window.
- Rebuild images, not just containers. As with any base-image CVE, patch the base and rebuild so new containers do not reintroduce the vulnerable library.
The lasting lesson
Heartbleed was a two-line mistake in one of the most scrutinized codebases on earth, and it sat undiscovered for two years. It reset expectations about foundational open-source infrastructure and helped spur investment in auditing critical libraries. For teams, the practical takeaways echo every major CVE since — Log4Shell and regreSSHion included: you cannot patch what you do not know you are running. Keep an accurate inventory of the libraries inside your images, scan continuously, and be able to answer “where is vulnerable OpenSSL?” before an attacker asks it for you.
Frequently asked questions
Who discovered Heartbleed?
It was found independently by a Google security researcher and by the security firm Codenomicon, which built the Heartbleed website and logo that made the bug a household name. Both reported it around the same time in April 2014.
Could Heartbleed be used to run code?
No. It was a read-only memory disclosure, not code execution. Its danger was entirely in what it exposed — private keys and secrets — not in letting an attacker directly run commands on the server.
Why did patching alone not fix it?
Because a private key that leaked before you patched stays valid. An attacker holding it can still impersonate the server or decrypt recorded traffic, so remediation required reissuing certificates with new keys, not just upgrading OpenSSL.
How does ScanRook find vulnerable OpenSSL?
ScanRook reads the package databases inside a container image, identifies the installed OpenSSL version, and matches it against multiple advisory sources while accounting for distribution backports — so a patched build is not flagged and a vulnerable one is not missed.
Catch vulnerable OpenSSL before it ships
ScanRook reads the real package databases inside your container images and matches OpenSSL — and every other component — against OSV, NVD, and vendor advisory data, accounting for backported fixes. Upload an artifact to see exactly what is installed.