← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
tenable:173260

OpenSSL 1

ASSESSED — NOISGATE V0.5
Vendor
Reassessed
Verdict:
01 · The Real Story

This is less a broken front door than a side hatch most buildings never even installed

Plugin tenable:173260 rolls up four OpenSSL issues for 1.1.1 before 1.1.1u: CVE-2023-0464, CVE-2023-0465, CVE-2023-0466, and CVE-2023-2650. Three are certificate-policy verification edge cases, and the fourth is a slow ASN.1 OBJECT IDENTIFIER parsing bug. In plain English: an attacker needs the application to either explicitly enable non-default X.509 policy checks or to feed untrusted ASN.1 into OBJ_obj2txt() / similar niche parsing paths; this is not an OpenSSL-is-generally-RCE situation.

The vendor MEDIUM label is defensible only in a vacuum. In real enterprise deployments, this deserves a downgrade to LOW because the reachable population is much smaller than the score suggests: policy checks are disabled by default, OpenSSL itself says those policy bugs are Low, and it also says CVE-2023-2650 is effectively low concern on 1.1.1 unless an application directly calls the vulnerable translation path on attacker-controlled data.

"Mostly scanner noise: real risk needs rare OpenSSL code paths, not normal TLS handling."
02 · The Attack Path

4 steps from start to impact.

STEP 01

Land on an app that actually ships vulnerable 1.1.1 code

The attacker first needs a target application linked against OpenSSL 1.1.1 < 1.1.1u. Tooling here is ordinary inventory/scanner work: Nessus flags this mostly from version reporting, not exploit validation. On Linux, distro backports complicate this because a package can report an older upstream base while already carrying the fix.
Conditions required:
  • The target host runs software using OpenSSL 1.1.1 before 1.1.1u, or a scanner thinks it does
  • The vulnerable library is reachable through attacker-controlled input
Where this breaks in practice:
  • Tenable says detection relies on self-reported version, so false-positive priority inflation is common on backported distro packages
  • Many installations bundle OpenSSL only for local features that are never exposed to untrusted remote input
Detection/coverage: Good version-based scanner coverage; weak exploit-path validation. Expect lots of inventory hits, not many true remotely reachable cases.
STEP 02

Force a rare parsing or policy-validation path

For CVE-2023-0464/0465/0466, the attacker needs an app that actually enables certificate policy checking via -policy, X509_VERIFY_PARAM_set1_policies(), or an app logic equivalent. For CVE-2023-2650, the attacker needs the app to call OBJ_obj2txt() on untrusted ASN.1 or to expose one of the affected non-TLS parsing paths. A practical 'tool' is just a custom malicious certificate/ASN.1 generator built with openssl CLI plus a fuzzer or bespoke harness.
Conditions required:
  • Certificate policy checking is enabled, or the app directly uses OBJ_obj2txt() / related ASN.1 display or parsing paths
  • The attacker can submit a certificate chain, signed object, or ASN.1-bearing payload to that app
Where this breaks in practice:
  • Policy checks are disabled by default and uncommon in mainstream app deployments
  • OpenSSL states normal SSL/TLS handling is not the main affected path here, especially for the 1.1.1 impact of CVE-2023-2650
  • A lot of web-facing software never exposes these code paths to unauthenticated users
Detection/coverage: Network IDS/WAF signatures are poor because the trigger is application-specific parsing behavior, not a stable exploit string.
STEP 03

Trigger bypass or slow-parse behavior

If the app is one of the rare ones on the right path, a crafted certificate can skip expected policy enforcement (0465/0466) or drive excessive computation (0464/2650). There is no code execution chain here; the realistic outcomes are narrow policy-bypass or latency/CPU exhaustion in the affected process. This is a lot less dangerous than the word 'OpenSSL' usually implies.
Conditions required:
  • The application trusts OpenSSL's policy evaluation behavior for a meaningful security decision, or processes attacker-supplied ASN.1 in the vulnerable path
  • The malformed input reaches the library without being blocked by size or validation limits
Where this breaks in practice:
  • Impact is usually per-process or per-request, not domain-wide compromise
  • Many apps add their own certificate validation logic or message size limits before OpenSSL ever does the expensive work
Detection/coverage: Look for worker CPU spikes, request stalls, TLS/auth failures, or certificate-validation anomalies rather than a clean exploit artifact.
STEP 04

Turn technical bug into operational impact

The attacker only gets meaningful impact if the vulnerable process is business-critical enough that a stalled auth path, certificate-validation bypass, or parser slowdown matters. In most enterprises, that limits blast radius to a specific service or application component, not instant fleet compromise. This is why the practical severity lands low.
Conditions required:
  • The affected service is externally reachable or exposed to untrusted internal senders
  • That service is important enough that slowdown or policy mis-validation creates material business risk
Where this breaks in practice:
  • Most 10,000-host estates will have a lot of OpenSSL inventory but very few services where these exact prerequisites line up
  • Modern monitoring should catch CPU saturation or service degradation before this becomes silent catastrophic compromise
Detection/coverage: APM, service health checks, auth logs, and CPU telemetry are more useful than exploit feeds here.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusI found no CISA KEV listing for CVE-2023-0464, 0465, 0466, or 2650, and Tenable's plugin notes no known exploits are available.
Public PoC availabilityNo widely adopted weaponized exploit repo surfaced in primary-source review. Practical abuse would likely be a custom malicious certificate / ASN.1 generator, not an off-the-shelf exploit kit.
EPSSTenable's FIRST-backed CVE pages show 0.00857 (0464), 0.00341 (0465), 0.00417 (0466), and 0.92129 (2650). That last number looks misleadingly hot for this plugin's 1.1.1 population because OpenSSL says 2650 is only low-concern on 1.1.1 unless apps directly call OBJ_obj2txt() on untrusted data.
KEV status and datesNot listed in CISA KEV as reviewed; therefore there is no KEV due date attached to this finding.
CVSS vector and interpretationPlugin 173260 uses CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N from CVE-2023-0466. That baseline overstates real exposure because it ignores the biggest prerequisite: the vulnerable policy-check path is off by default.
Affected version rangeUpstream affected branch for this plugin is OpenSSL 1.1.1 before 1.1.1u. Related 3.x lines had separate fixed versions, but this Nessus check is specifically about the 1.1.1u threshold.
Fixed versions and backportsUpstream fix is 1.1.1u. Debian backported fixes earlier: bullseye 1.1.1n-0+deb11u5 and buster LTS 1.1.1n-0+deb10u5 already contain the remediation despite the older-looking upstream base string.
Scanning and exposure realityThis is not reliably internet-fingerprintable as a library issue. Tenable explicitly says the plugin did not test exploitability and instead relied on self-reported version numbers, so exposure counts will be noisy and often decoupled from real reachable risk.
Disclosure timelineCVE-2023-0464 disclosed 2023-03-22; 0465 and 0466 on 2023-03-28; 2650 on 2023-05-30.
Reporting researcher / originThe policy-related flaws were reported by David Benjamin (Google). CVE-2023-2650 was first detected by OSS-Fuzz and later re-evaluated by OpenSSL as a security issue.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (2.4/10)

The decisive factor is path rarity: the meaningful exploit paths require non-default certificate policy validation or direct use of niche ASN.1 translation routines rather than normal, widely exposed TLS handling. That sharply narrows both the reachable population and the likely blast radius, so a broad MEDIUM fleet priority is not justified.

HIGH Default OpenSSL behavior keeps most deployments out of the vulnerable policy-check path
MEDIUM Exact exposure depends on whether individual applications enabled policy checking or call `OBJ_obj2txt()` on untrusted data

Why this verdict

  • Default-off prerequisite: three of the four CVEs need certificate policy checking to be enabled, and OpenSSL says those checks are disabled by default; that is strong downward pressure from the vendor MEDIUM baseline.
  • 1.1.1-specific reality check: OpenSSL states CVE-2023-2650 is only low concern on 1.1.1/1.0.2 unless an application directly calls OBJ_obj2txt() with untrusted data. The noisier, more broadly reachable 3.x parsing scenarios do not map cleanly to this plugin.
  • No exploit pressure: no KEV listing, no public weaponized exploit trend, and Tenable says no known exploits are available. Without active abuse, this stays a narrow engineering flaw rather than an incident-driver.

Why not higher?

There is no default, broad, unauthenticated internet RCE story here. The attacker usually needs a specific application behavior that many enterprises never enable, and the likely outcomes are limited to policy bypass in niche PKI workflows or process-level DoS rather than whole-host takeover.

Why not lower?

It is still a real security defect family, not pure false positive noise. PKI-heavy environments, custom certificate-validation code, middleware doing signed-message parsing, or internal services ingesting attacker-controlled ASN.1 can absolutely make these bugs operationally relevant on the wrong app.

05 · Compensating Control

What to do — in priority order.

  1. Validate the code path before you escalate — For a LOW verdict, there is no mitigation SLA; use the next routine review cycle to confirm whether the affected application enables certificate policy checking or passes untrusted ASN.1 into OBJ_obj2txt(). If the answer is no, document the rationale and avoid treating every OpenSSL 1.1.1 hit as equally urgent.
  2. Prefer vendor or distro backport truth over raw version strings — Check package changelogs or vendor advisories before opening emergency work. Debian, for example, fixed these in backported package releases that still present an older upstream-looking base version; do that validation during normal backlog triage for this LOW item.
  3. Constrain untrusted certificate and ASN.1 inputs — Where you own the application stack, add message-size limits and avoid unnecessary certificate-policy validation paths. Do this in normal maintenance because there is no noisgate mitigation SLA for a LOW finding, but it materially reduces the only realistic abuse path here.
  4. Monitor for service-level stress, not just CVE presence — Because the practical failure mode is more likely latency or CPU burn than silent compromise, make sure the services using OpenSSL have process CPU, request latency, and auth-failure telemetry. That is the best operational hedge while the patch sits in backlog hygiene.
What doesn't work
  • A WAF does not magically solve this; the bug sits in library parsing and certificate-validation behavior, often outside ordinary HTTP normalization.
  • EDR alone is weak here because there is no obvious malware payload or child-process chain to stop; the realistic symptom is a busy or hung process.
  • Blindly keying off the OpenSSL version string does not work on backported distro packages; it over-prioritizes noise and hides the real question, which is whether the vulnerable path is reachable.
06 · Verification

Crowdsourced verification payload.

Run this on the target host or golden image that triggered plugin 173260. Invoke it as python3 verify_openssl_173260.py /usr/bin/openssl or just python3 verify_openssl_173260.py; no admin rights are required for the basic binary check, but package-manager backport validation works best with normal local package query access.

noisgate-verify.py
PYTHONREAD-ONLYSAFE
#!/usr/bin/env python3
# verify_openssl_173260.py
# Check whether a host appears vulnerable to Nessus plugin 173260
# (OpenSSL 1.1.1 < 1.1.1u multiple vulnerabilities).
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

import os
import re
import shutil
import subprocess
import sys

EXIT_PATCHED = 0
EXIT_VULNERABLE = 1
EXIT_UNKNOWN = 2


def run(cmd):
    try:
        p = subprocess.run(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True, timeout=10)
        return p.returncode, (p.stdout or '').strip(), (p.stderr or '').strip()
    except Exception as e:
        return 99, '', str(e)


def dpkg_compare(v1, op, v2):
    if not shutil.which('dpkg'):
        return None
    rc, _, _ = run(['dpkg', '--compare-versions', v1, op, v2])
    return rc == 0


def check_debian_backport():
    if not shutil.which('dpkg-query'):
        return None

    candidates = []
    for pkg in ['openssl', 'libssl1.1']:
        rc, out, _ = run(['dpkg-query', '-W', '-f=${Package}\t${Version}\n', pkg])
        if rc == 0 and out:
            candidates.extend([line for line in out.splitlines() if line.strip()])

    if not candidates:
        return None

    for line in candidates:
        try:
            pkg, ver = line.split('\t', 1)
        except ValueError:
            continue

        # Known fixed Debian backports for these CVEs
        fixed_versions = [
            '1.1.1n-0+deb11u5',
            '1.1.1n-0+deb10u5',
        ]

        for fixed in fixed_versions:
            if dpkg_compare(ver, 'ge', fixed):
                return ('PATCHED', f'{pkg} package version {ver} includes a known Debian backport at or above {fixed}')

        if ver.startswith('1.1.1'):
            return ('VULNERABLE', f'{pkg} package version {ver} is older than the known Debian fixed backports checked by this script')

    return None


def parse_openssl_version(text):
    # Examples:
    # OpenSSL 1.1.1t  7 Feb 2023
    # OpenSSL 1.1.1u  30 May 2023
    m = re.search(r'OpenSSL\s+(\d+\.\d+\.\d+)([a-z]*)', text)
    if not m:
        return None, None
    return m.group(1), m.group(2) or ''


def check_binary(path):
    rc, out, err = run([path, 'version', '-v'])
    if rc != 0:
        return ('UNKNOWN', f'failed to query {path}: {err or out or "no output"}')

    core, suffix = parse_openssl_version(out)
    if not core:
        return ('UNKNOWN', f'unrecognized version output from {path}: {out}')

    if core != '1.1.1':
        return ('UNKNOWN', f'{path} reports OpenSSL {core}{suffix}; plugin 173260 is specifically for the 1.1.1 < 1.1.1u branch')

    if suffix == '':
        return ('VULNERABLE', f'{path} reports OpenSSL 1.1.1 with no patch letter; this is older than 1.1.1u')

    if suffix < 'u':
        return ('VULNERABLE', f'{path} reports OpenSSL 1.1.1{suffix}; this is older than 1.1.1u')

    return ('PATCHED', f'{path} reports OpenSSL 1.1.1{suffix}; this is at or above 1.1.1u')


def main():
    if len(sys.argv) > 2:
        print('UNKNOWN - usage: python3 verify_openssl_173260.py [path_to_openssl]')
        sys.exit(EXIT_UNKNOWN)

    # Debian backport check first, because raw openssl version strings can be misleading there.
    deb = check_debian_backport()
    if deb:
        state, msg = deb
        print(f'{state} - {msg}')
        sys.exit(EXIT_PATCHED if state == 'PATCHED' else EXIT_VULNERABLE)

    path = sys.argv[1] if len(sys.argv) == 2 else shutil.which('openssl')
    if not path:
        print('UNKNOWN - openssl binary not found in PATH; provide an explicit path')
        sys.exit(EXIT_UNKNOWN)

    state, msg = check_binary(path)
    print(f'{state} - {msg}')
    if state == 'PATCHED':
        sys.exit(EXIT_PATCHED)
    if state == 'VULNERABLE':
        sys.exit(EXIT_VULNERABLE)
    sys.exit(EXIT_UNKNOWN)


if __name__ == '__main__':
    main()
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning: do not burn emergency patch capacity on plugin 173260 by default. First, validate which hits are real runtime consumers versus backported or unreachable OpenSSL copies, and specifically identify any apps that enable certificate-policy validation or parse untrusted ASN.1 in custom workflows; for a LOW verdict there is no noisgate mitigation SLA and no noisgate remediation SLA—treat it as backlog hygiene. Queue actual remediation in the next normal maintenance cycle, while tracking any broader migration off the EOL OpenSSL 1.1.1 branch as a separate program rather than using this plugin alone to trigger a fleet-wide fire drill.

Sources

  1. Tenable Nessus Plugin 173260
  2. OpenSSL Security Advisory 2023-03-22 (CVE-2023-0464)
  3. OpenSSL Security Advisory 2023-03-28 (CVE-2023-0465 / CVE-2023-0466)
  4. OpenSSL Security Advisory 2023-05-30 (CVE-2023-2650)
  5. OpenSSL 1.1.1 Series Release Notes
  6. NVD CVE-2023-0464
  7. CISA Known Exploited Vulnerabilities Catalog
  8. Debian DSA-5417-1 openssl security update
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.