An academic side-channel paper from the Pentium III era being treated like an actual production threat
This finding tracks back to Daniel J. Bernstein's 2005 paper *Cache-timing attacks on AES*, which demonstrated that the lookup-table (T-table) AES implementation in OpenSSL 0.9.7a leaked key material through CPU cache timing on an 850 MHz Pentium III running FreeBSD 4.8 — across a localhost loopback. Affected versions in Tenable's plugin are roughly OpenSSL ≤ 0.9.8 / 0.9.7g and earlier, before AES-NI was standard and before constant-time bitsliced AES (aes_core rewrites, AES-NI dispatch, and later EVP_aes_*_ctr) became the default code path. The plugin checks the reported OpenSSL banner version and flags anything in the susceptible range.
Vendor severity is MEDIUM (CVSS2 5.1 / 5.9) and that is *generous*. Even Bernstein's original demonstration required tens of millions of timed queries against the same key on the same loopback with a cooperative server, and over 20 years of follow-up research has shown the attack collapses across realistic WAN jitter, modern CPUs with AES-NI, and OpenSSL's later constant-time paths. There has never been a credible in-the-wild exploitation of CVE-2005-1797 against a production system. If your scanner is lighting this up, you are looking at *ancient OpenSSL*, and that is the real problem — not the timing attack.
3 steps from start to impact.
Identify vulnerable AES implementation
nmap --script ssl-enum-ciphers, banner grab, or the Tenable plugin itself.- Reachable service negotiating AES with the vulnerable OpenSSL build
- Service uses the same long-lived AES key across many sessions
- Almost no production system still ships OpenSSL 0.9.x — EOL since 2015
- Modern CPUs (Sandy Bridge+) dispatch to AES-NI, which is constant-time and bypasses the vulnerable code path entirely
Collect millions of timed AES operations
cachetiming.c to drive the target. The attacker is profiling cache-line access patterns through nanosecond timing variance.- Ability to flood the target with AES requests under a stable key
- Sub-microsecond timing precision relative to the target
- WAN/LAN jitter dwarfs the cache-line timing signal — Bernstein's own paper used loopback
- Rate limiting, TLS session resumption, and ephemeral keys destroy the required sample volume
- Modern NICs, hypervisor scheduling, and SMT noise make remote signal extraction infeasible
Statistical key recovery
metasploit/recipes/ module, no Cobalt Strike BOF, no nation-state implant has ever been documented using this technique against OpenSSL.- Clean timing dataset
- Same key used during entire collection window
- Any session/key rotation invalidates the entire dataset
- TLS 1.2+ uses per-session keys derived via PRF — the attacked key has no longevity
The supporting signals.
| In-the-wild exploitation | None known in 21 years since disclosure. Not in CISA KEV. No threat-actor playbook references this CVE. |
|---|---|
| Public PoC | Bernstein's original 2005 reference code at cr.yp.to/antiforgery/cachetiming-20050414.pdf. No weaponized tooling, no Metasploit module. |
| EPSS | Effectively 0 (well below 1st percentile). FIRST does not track meaningful exploit-prediction signal on this CVE. |
| KEV status | Not listed. CISA has never added this CVE. |
| CVSS vector | AV:N/AC:H/Au:N/C:P/I:N/A:N — Network vector, *High* attack complexity, partial confidentiality only. The High AC is doing all the work. |
| Affected versions | OpenSSL ≤ 0.9.8 (pre-AES-NI dispatch, pre-constant-time AES). All currently supported OpenSSL branches (1.1.1, 3.0, 3.1, 3.2, 3.3) are unaffected. |
| Fixed in | Remediation is *not* a patch — it is upgrading off OpenSSL 0.9.x, which is EOL since December 2015. Distro backports for 0.9.8 stopped years ago. |
| Internet exposure | Shodan still shows a long tail of OpenSSL 0.9.x banners on embedded gear, old printers, and abandoned IoT — but these systems have *dozens* of higher-severity unpatched CVEs that matter far more. |
| Disclosure | 2005-04-14 — Daniel J. Bernstein (University of Illinois at Chicago). |
| Researcher | Daniel J. Bernstein, with extensive academic follow-up by Osvik/Shamir/Tromer and others on cache side-channels generally. |
noisgate verdict.
The single decisive factor is no practical remote exploitability in 21 years: Bernstein's attack required loopback timing precision and tens of millions of same-key operations, conditions that do not survive WAN jitter, AES-NI dispatch, or modern session-key rotation. The MEDIUM rating reflects theoretical confidentiality impact only; in real deployments the exploit chain does not close.
Why this verdict
- No weaponized exploit exists — only Bernstein's 2005 academic PoC, which was demonstrated on localhost. 21 years and zero in-the-wild use.
- AES-NI obsoletes the attack — every CPU built since ~2010 (Westmere onward) executes AES in constant time via dedicated instructions, and OpenSSL auto-dispatches to AES-NI when available.
- TLS session-key rotation destroys the sample requirement — the attack needs a stable long-lived key across millions of operations; modern protocols don't provide one.
- WAN jitter kills the timing signal — Bernstein himself measured on loopback. Real network paths add microseconds of noise that overwhelm the nanosecond cache-line delta.
- Role multiplier: Even on a high-value role (TLS terminator, VPN concentrator, identity provider), the chain does not close because those roles have already migrated off OpenSSL 0.9.x or use AES-NI hardware. There is no realistic deployment where this CVE alone leads to fleet compromise.
- The real signal is the OpenSSL version itself — if you're running 0.9.8, you have an EOL crypto library with dozens of higher-severity issues. Fix that, and this finding disappears.
Why not higher?
MEDIUM would imply some realistic chance of practical exploitation against a real target. There isn't one. CVSS2 5.1 reflects the theoretical confidentiality impact assuming all preconditions are met, but the preconditions never align outside a lab. Going to HIGH would be indefensible — no KEV, no EPSS signal, no campaigns.
Why not lower?
Not IGNORE because the *presence* of OpenSSL 0.9.x as detected by this plugin is itself a meaningful finding — that codebase is EOL and carries unrelated, far more serious vulnerabilities. The plugin is useful as an indicator, even if the named CVE is not a real threat.
What to do — in priority order.
- Treat the plugin hit as an EOL OpenSSL detector, not a timing-attack finding — If 17769 fires, your real exposure is *every other CVE* against OpenSSL 0.9.x — heartbleed-adjacent issues, padding-oracle, RNG, ASN.1 parsing. No mitigation SLA for the timing attack itself; address the EOL crypto library on the 365-day remediation track.
- Inventory and migrate OpenSSL 0.9.x consumers to 3.0 LTS or 1.1.1 (where vendor-supported) — Use
find / -name 'libcrypto.so.0.9*', package manager queries, and SBOM scans to locate. Migration is the only durable fix. Schedule within the 365-day window per noisgate remediation SLA. - Confirm AES-NI is in use on TLS-terminating hosts — Run
openssl speed -evp aes-128-gcmand confirm the throughput is hardware-accelerated. If AES-NI is in play, this CVE is moot regardless of OpenSSL version. - Enforce TLS 1.2+ with ephemeral key exchange — ECDHE/DHE ciphersuites prevent any single AES key from being reused across enough sessions to be attackable. Disable static RSA key exchange and any AES-CBC-without-EtM legacy modes.
- WAF rules — there is no malicious payload to match; the attack is purely timing observation of legitimate AES operations.
- Rate limiting alone — helpful in theory, but the attack already fails in practice for other reasons; relying on rate limits as the sole mitigation misses that the OpenSSL version is the real problem.
- Disabling AES ciphersuites — counterproductive; you'd fall back to weaker primitives. Fix the library, not the cipher.
Crowdsourced verification payload.
Run on the target Linux/Unix host as a non-privileged user. Invoke as ./check_openssl_aes_timing.sh — no arguments needed. Checks installed OpenSSL version against the affected range and reports AES-NI availability since that alone neutralizes the issue.
#!/usr/bin/env bash
# noisgate verification for tenable:17769 / CVE-2005-1797
# OpenSSL AES cache-timing vulnerability
# Exit codes: 0 = PATCHED, 1 = VULNERABLE, 2 = UNKNOWN
set -u
echo "[*] noisgate :: OpenSSL AES timing attack check"
if ! command -v openssl >/dev/null 2>&1; then
echo "UNKNOWN: openssl binary not found on PATH"
exit 2
fi
VER_RAW=$(openssl version 2>/dev/null | awk '{print $2}')
echo "[*] OpenSSL version: ${VER_RAW}"
# Anything 0.9.x is in the affected, EOL range
if echo "${VER_RAW}" | grep -Eq '^0\.9\.'; then
AFFECTED=1
else
AFFECTED=0
fi
# AES-NI check — if present, the vulnerable T-table path is not used
AESNI=0
if grep -qw aes /proc/cpuinfo 2>/dev/null; then
AESNI=1
echo "[*] CPU reports AES-NI support"
fi
# Confirm OpenSSL is actually dispatching to AES-NI
if command -v openssl >/dev/null 2>&1; then
if OPENSSL_ia32cap="~0x200000200000000" openssl speed -elapsed -evp aes-128-cbc 2>&1 \
| grep -q 'aes-128-cbc'; then
: # speed test ran; presence of HW path inferred from AESNI flag
fi
fi
if [ "${AFFECTED}" -eq 1 ] && [ "${AESNI}" -eq 0 ]; then
echo "VULNERABLE: OpenSSL ${VER_RAW} (0.9.x EOL) without AES-NI dispatch"
exit 1
fi
if [ "${AFFECTED}" -eq 1 ] && [ "${AESNI}" -eq 1 ]; then
echo "VULNERABLE: OpenSSL ${VER_RAW} is EOL — timing attack mitigated by AES-NI, but library MUST be upgraded for unrelated CVEs"
exit 1
fi
echo "PATCHED: OpenSSL ${VER_RAW} is outside the affected 0.9.x range"
exit 0
If you remember one thing.
Sources
- Tenable plugin 17769
- Bernstein – Cache-timing attacks on AES (2005)
- OpenSSL release strategy / EOL policy
- Attacking AES Using Bernstein's Attack on Modern Processors (Springer)
- A Cache Timing Attack on AES in Virtualization Environments (FC12)
- Countermeasures against Bernstein's remote cache timing attack
- Intel AES-NI overview
- CISA KEV Catalog
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.