← Back to Feed CACHED · 2026-06-25 02:57:17 · CACHE_KEY tenable:17769
tenable:17769 · CWE-208 · Disclosed 2005-04-14

OpenSSL AES Timing Attack

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

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.

"A 21-year-old academic side-channel with no practical remote exploit. Vendor MEDIUM is generous — this is backlog hygiene."
02 · The Attack Path

3 steps from start to impact.

STEP 01

Identify vulnerable AES implementation

Attacker confirms target is running OpenSSL ≤ 0.9.8 with the legacy T-table AES implementation, no AES-NI dispatch, and is performing AES operations under attacker-influenced inputs (e.g., TLS handshake, IPsec, custom protocol). Tools: nmap --script ssl-enum-ciphers, banner grab, or the Tenable plugin itself.
Conditions required:
  • Reachable service negotiating AES with the vulnerable OpenSSL build
  • Service uses the same long-lived AES key across many sessions
Where this breaks in practice:
  • 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
Detection/coverage: Tenable 17769 fires on banner. Easy to detect on the defender side; not visible as an attack on the wire.
STEP 02

Collect millions of timed AES operations

Attacker must measure encryption/decryption latency across tens of millions of chosen-input AES calls against the same key. Bernstein's reference implementation used cachetiming.c to drive the target. The attacker is profiling cache-line access patterns through nanosecond timing variance.
Conditions required:
  • Ability to flood the target with AES requests under a stable key
  • Sub-microsecond timing precision relative to the target
Where this breaks in practice:
  • 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
Detection/coverage: An IDS/NDR would see anomalous request volume long before key recovery completes. No public exploit tool exists.
STEP 03

Statistical key recovery

Attacker runs offline analysis correlating timing deltas with S-box index hypotheses to recover the AES round key, byte-by-byte. Bernstein's tooling is academic — no metasploit/recipes/ module, no Cobalt Strike BOF, no nation-state implant has ever been documented using this technique against OpenSSL.
Conditions required:
  • Clean timing dataset
  • Same key used during entire collection window
Where this breaks in practice:
  • Any session/key rotation invalidates the entire dataset
  • TLS 1.2+ uses per-session keys derived via PRF — the attacked key has no longevity
Detection/coverage: None needed — chain doesn't complete in realistic conditions.
03 · Intelligence Metadata

The supporting signals.

In-the-wild exploitationNone known in 21 years since disclosure. Not in CISA KEV. No threat-actor playbook references this CVE.
Public PoCBernstein's original 2005 reference code at cr.yp.to/antiforgery/cachetiming-20050414.pdf. No weaponized tooling, no Metasploit module.
EPSSEffectively 0 (well below 1st percentile). FIRST does not track meaningful exploit-prediction signal on this CVE.
KEV statusNot listed. CISA has never added this CVE.
CVSS vectorAV: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 versionsOpenSSL ≤ 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 inRemediation 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 exposureShodan 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.
Disclosure2005-04-14 — Daniel J. Bernstein (University of Illinois at Chicago).
ResearcherDaniel J. Bernstein, with extensive academic follow-up by Osvik/Shamir/Tromer and others on cache side-channels generally.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (2.5/10)

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.

HIGH that this is not a real-world threat
HIGH that the underlying issue (OpenSSL 0.9.x being present at all) is the actual finding worth acting on

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.

05 · Compensating Control

What to do — in priority order.

  1. 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.
  2. 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.
  3. Confirm AES-NI is in use on TLS-terminating hosts — Run openssl speed -evp aes-128-gcm and confirm the throughput is hardware-accelerated. If AES-NI is in play, this CVE is moot regardless of OpenSSL version.
  4. 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.
What doesn't work
  • 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.
06 · Verification

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.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/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
07 · Bottom Line

If you remember one thing.

TL;DR
Stop treating 17769 as a timing-attack finding — treat it as an EOL OpenSSL 0.9.x detector. There is no mitigation SLA per the noisgate mitigation SLA for LOW; the timing attack itself has no practical exploit path and no KEV/EPSS signal in 21 years. The noisgate remediation SLA puts library upgrade on the 365-day track, but you should accelerate that on any host where the *same* OpenSSL 0.9.x install also carries higher-severity unpatched CVEs (which it almost certainly does). Monday-morning action: run the verification script across the fleet, generate a list of every host still running OpenSSL 0.9.x, hand that list to engineering as an EOL-library backlog item, and close out the 17769 ticket itself as LOW with documented rationale.

Sources

  1. Tenable plugin 17769
  2. Bernstein – Cache-timing attacks on AES (2005)
  3. OpenSSL release strategy / EOL policy
  4. Attacking AES Using Bernstein's Attack on Modern Processors (Springer)
  5. A Cache Timing Attack on AES in Virtualization Environments (FC12)
  6. Countermeasures against Bernstein's remote cache timing attack
  7. Intel AES-NI overview
  8. CISA KEV Catalog
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.