← Back to Feed CACHED · 2026-05-17 09:42:19 · cache_key CVE-2025-29912
CVE-2023-0465 · CWE-295 · Disclosed 2023-03-28

Applications that use a non-default option when verifying certificates may be vulnerable to an attack from…

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

This is a badge-check bypass that only works if your building already uses a rare badge rule and the badge printer is crooked

CVE-2023-0465 is an OpenSSL certificate-validation logic flaw: if an application explicitly enables certificate policy processing, invalid policy OIDs in a leaf certificate can be ignored and the rest of policy checking for that certificate gets skipped. Affected upstream ranges are 3.1.0 to before 3.1.1, 3.0.0 to before 3.0.9, 1.1.1 to before 1.1.1u, and 1.0.2 to before 1.0.2zh; Debian and other distros may instead ship backported fixes under older-looking package versions.

Vendor/NVD MEDIUM overrates this in enterprise reality. OpenSSL itself classed it Low, and that matches operations better because certificate policy checks are disabled by default, OpenSSL says they are *not commonly used*, and the attacker also needs a malicious or compromised CA position rather than ordinary internet reachability. Date note: OpenSSL's vulnerability index lists this issue as published on 2023-03-23, while the advisory mail and NVD publication landed on 2023-03-28.

"Low urgency: this needs a malicious CA and an uncommon OpenSSL policy-check mode to matter"
02 · The Attack Path

4 steps from start to impact.

STEP 01

Gain a CA position

The attacker needs control of, compromise of, or cooperation from a certificate authority trusted by the target verifier. This is not a normal pre-auth internet attacker position; it is a trust-anchor abuse scenario. Weaponized tooling is mundane here: any CA issuance workflow or openssl ca-based pipeline can mint the certificate once the attacker has CA authority.
Conditions required:
  • Attacker can issue certificates chaining to a root/intermediate the target trusts
  • Target relies on X.509 certificate validation for auth or trust decisions
Where this breaks in practice:
  • Trusted CA compromise is rare and high-effort
  • Private PKI environments often tightly control who can issue certs
  • Certificate Transparency, CA logging, and issuance review may expose misuse
Detection/coverage: No vuln scanner sees this prerequisite. Detection is PKI-side: CA audit logs, issuance logs, CT monitoring, and unexpected-policy-OID review.
STEP 02

Craft a policy-bad leaf certificate

The attacker issues a leaf certificate with deliberately invalid certificatePolicies content intended to make OpenSSL ignore that leaf's policies. A custom cert can be generated with OpenSSL tooling or bespoke X.509 generation code; no public widely used exploit kit is needed because the bug sits in standards-compliant certificate parsing and verification.
Conditions required:
  • Attacker-controlled CA can sign the malicious leaf
  • Certificate includes malformed or invalid policy assertions relevant to the target's policy checks
Where this breaks in practice:
  • The cert must still pass ordinary chain building and signature validation
  • Many deployments do not use policy OIDs for authorization at all
Detection/coverage: Static scanners can flag vulnerable OpenSSL versions, but they do not validate whether malformed-policy test certs would be accepted in your specific application path.
STEP 03

Hit an application that enabled policy checking

This step is the real choke point. OpenSSL says policy processing is disabled by default and is enabled only when the app passes -policy, calls X509_VERIFY_PARAM_set1_policies(), or otherwise turns on policy checking; without that, CVE-2023-0465 is dead code for practical purposes.
Conditions required:
  • The application explicitly enabled certificate policy processing
  • The vulnerable OpenSSL library is actually in that verification path
Where this breaks in practice:
  • Most enterprises use hostname validation, EKU, or pinning instead of policy OID enforcement
  • Many apps link OpenSSL but never invoke policy-check APIs
  • Network exposure alone does not imply this code path is reachable
Detection/coverage: SCA/SBOM tools find OpenSSL versions, but only code review, config review, or targeted integration testing confirms policy-check usage.
STEP 04

Bypass the policy gate and get trust

When the vulnerable verifier processes the malicious leaf, the invalid leaf policies can be ignored and the remaining policy checks for that cert are skipped. Impact is a trust-decision bypass: a cert that should fail policy enforcement may be accepted, enabling spoofed peer identity in niche mTLS or PKI-segregation designs.
Conditions required:
  • Application actually relies on policy OIDs to separate trusted from untrusted certs
  • Accepted certificate meaningfully changes access or trust
Where this breaks in practice:
  • Blast radius is bounded to applications using policy OIDs as a decision point
  • This is not code execution, bulk worming, or broad DoS
  • Many environments can fall back on narrower trust stores or pinning
Detection/coverage: Best detection is targeted regression testing with known-bad certs; external scanners and perimeter tooling will miss the logic flaw.
03 · Intelligence Metadata

The supporting signals.

In-the-wild statusNo credible public evidence of active exploitation found in the reviewed primary sources; CISA ADP enrichment marks exploitation as none in the CVE JSON.
KEV statusNot KEV-listed as of 2026-06-05; this CVE does not appear in the CISA Known Exploited Vulnerabilities Catalog.
Proof-of-concept availabilityNo notable public weaponized PoC repo is referenced by OpenSSL, NVD, or the CVE record. Practical reproduction only needs a CA-capable cert-generation workflow plus a verifier that explicitly enabled policy checks.
EPSSUser-supplied intel says 0.00536, which is extremely low in absolute terms. That lines up with the narrow preconditions: uncommon app configuration plus malicious-CA positioning.
CVSS vector, interpretedCVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N says "network, no auth, no clicks," but that model misses the *real* gating factor: attacker control of a trusted CA and app opt-in to policy OID enforcement.
Affected versionsUpstream affected ranges: 3.1.0 < 3.1.1, 3.0.0 < 3.0.9, 1.1.1 < 1.1.1u, 1.0.2 < 1.0.2zh per the official CVE JSON and OpenSSL vulnerability index.
Fixed versionsUpstream fixes landed in 3.1.1, 3.0.9, 1.1.1u, and 1.0.2zh (premium). Example distro backport: Debian bullseye fixed this in 1.1.1n-0+deb11u5.
Exposure / scanning realityInference: this is *not directly internet-scannable*. Shodan/Censys can find TLS endpoints using OpenSSL-linked software, but they cannot tell whether the app enabled certificate policy processing or relies on policy OIDs for authorization.
Disclosure timelineCVE reserved 2023-01-24; OpenSSL lists the issue as published 2023-03-23; advisory email/NVD publication followed on 2023-03-28.
Reporter / fixerReported by David Benjamin (Google); fix developed by Matt Caswell.
04 · The Call

noisgate verdict.

Final Verdict
DOWNGRADED to LOW (2.7/10)

The decisive friction is that the vulnerable verification path is off by default and uncommon in real applications. Add the requirement for a malicious or compromised trusted CA, and this stops being a generic internet bug and becomes a narrow trust-abuse edge case.

HIGH Exploit preconditions require explicit policy-check usage and malicious-CA positioning
MEDIUM Enterprise exposure population is probably small, but most orgs do not inventory policy-OID usage cleanly

Why this verdict

  • Start at vendor 5.3: on paper it is remotely reachable and affects certificate validation, so MEDIUM is the baseline.
  • Down for attacker position: this is not "anyone on the internet"; it effectively requires a malicious, compromised, or otherwise trusted CA capable of issuing a chain the target accepts.
  • Down again for exposure fraction: OpenSSL states certificate policy checks are disabled by default and not commonly used, so only a small subset of real deployments reach the vulnerable logic.
  • Down for limited blast radius: even when hit, impact is a narrow trust-policy bypass, not RCE, not memory corruption, not broad service DoS.
  • Not IGNORE because some PKI designs really use this: in environments that separate trust domains with policy OIDs, this can directly defeat that control and let the wrong cert authenticate.

Why not higher?

There is no code execution path, no common unauthenticated exploit chain, and no evidence of active abuse. The attacker must already occupy an unusually privileged trust position and then find an application that opted into a rarely used verification mode.

Why not lower?

It still undermines a security decision, not just a cosmetic check. If you built certificate-policy enforcement into an internal PKI or mTLS architecture, a bad cert may pass where it should fail, so documenting and testing for exposure is still warranted.

05 · Compensating Control

What to do — in priority order.

  1. Inventory policy-check callers — Find applications that pass -policy, call X509_VERIFY_PARAM_set1_policies(), or explicitly set X509_V_FLAG_POLICY_CHECK. Because this is a LOW verdict, there is no mitigation SLA and no remediation SLA; do this during normal backlog hygiene so you can separate truly exposed apps from the much larger population that merely ships OpenSSL.
  2. Constrain trust stores — Reduce accepted roots/intermediates for high-assurance services so a stray public or over-broad private CA cannot mint acceptable chains. For a LOW issue, fold this into the next PKI maintenance cycle rather than emergency change windows.
  3. Use pinning or issuer allowlists on sensitive mTLS paths — Where service identity matters, pin the issuing CA or expected SPKI instead of depending solely on certificate policy OIDs. For this LOW case, deploy through routine config management and service hardening work.
  4. Audit certificate issuance for unexpected policy OIDs — Review CA logs, CT telemetry where applicable, and internal issuance records for weird or invalid policy extensions. This is a good detective control when patching is deferred into normal maintenance because the issue hinges on malicious certificate issuance.
What doesn't work
  • Perimeter vuln scanning doesn't help much, because it cannot tell whether the application enabled policy checking or uses policy OIDs as an auth control.
  • WAFs and NGFWs are irrelevant to certificate-path validation logic inside the application process.
  • MFA does not mitigate service-to-service, mTLS, or certificate-based trust decisions affected by this bug.
06 · Verification

Crowdsourced verification payload.

Run this on the target Linux host that provides the OpenSSL runtime, or over SSH via your fleet tool. Invoke it as bash check-cve-2023-0465.sh; no root is required, but package-manager queries work best with a normal shell on the host. It reports PATCHED if it sees a fixed upstream or known Debian backport, VULNERABLE if the installed OpenSSL version is in an affected upstream range, and UNKNOWN when distro backporting or package layout prevents a clean call.

noisgate-verify.sh
BASHREAD-ONLYSAFE
#!/usr/bin/env bash
# check-cve-2023-0465.sh
# Detect likely exposure to CVE-2023-0465 on Linux hosts.
# Output: VULNERABLE / PATCHED / UNKNOWN
# Exit codes: 0=PATCHED, 1=VULNERABLE, 2=UNKNOWN

set -u

say() {
  printf '%s\n' "$1"
}

have_cmd() {
  command -v "$1" >/dev/null 2>&1
}

ver_ge() {
  [ "$(printf '%s\n%s\n' "$1" "$2" | sort -V | tail -n1)" = "$1" ]
}

ver_lt() {
  [ "$1" != "$2" ] && ! ver_ge "$1" "$2"
}

is_affected_upstream() {
  local v="$1"
  if ver_ge "$v" "3.1.0" && ver_lt "$v" "3.1.1"; then return 0; fi
  if ver_ge "$v" "3.0.0" && ver_lt "$v" "3.0.9"; then return 0; fi
  if [[ "$v" =~ ^1\.1\.1[a-z]?$ ]] && ver_lt "$v" "1.1.1u"; then return 0; fi
  if [[ "$v" =~ ^1\.0\.2[a-z]?$ ]] && ver_lt "$v" "1.0.2zh"; then return 0; fi
  return 1
}

is_fixed_upstream() {
  local v="$1"
  if ver_ge "$v" "3.1.1"; then return 0; fi
  if ver_ge "$v" "3.0.9" && ver_lt "$v" "3.1.0"; then return 0; fi
  if [[ "$v" =~ ^1\.1\.1[a-z]?$ ]] && ver_ge "$v" "1.1.1u"; then return 0; fi
  if [[ "$v" =~ ^1\.0\.2[a-z]?$ ]] && ver_ge "$v" "1.0.2zh"; then return 0; fi
  return 1
}

check_debian_backport() {
  # Known fixed example from Debian bullseye advisory: 1.1.1n-0+deb11u5
  if have_cmd dpkg-query; then
    local pkgver
    pkgver=$(dpkg-query -W -f='${Version}' openssl 2>/dev/null || true)
    if [ -n "$pkgver" ]; then
      if dpkg --compare-versions "$pkgver" ge "1.1.1n-0+deb11u5"; then
        say "PATCHED: Debian/Ubuntu package version '$pkgver' is at or above Debian's known fixed bullseye backport level for CVE-2023-0465."
        exit 0
      fi
    fi
  fi
}

extract_openssl_ver() {
  if have_cmd openssl; then
    openssl version 2>/dev/null | awk '{print $2}' | sed 's/[[:space:]].*$//'
    return 0
  fi
  return 1
}

main() {
  check_debian_backport

  local v
  v=$(extract_openssl_ver || true)

  if [ -z "$v" ]; then
    say "UNKNOWN: 'openssl' binary not found. Inspect linked libssl/libcrypto packages directly or via SBOM/SCA tooling."
    exit 2
  fi

  # Strip possible suffixes such as '-fips' or distro annotations after the core version.
  v=$(printf '%s' "$v" | sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+[a-z]?).*/\1/')

  if is_fixed_upstream "$v"; then
    say "PATCHED: Upstream OpenSSL version '$v' is at or above a fixed release for CVE-2023-0465."
    exit 0
  fi

  if is_affected_upstream "$v"; then
    say "VULNERABLE: OpenSSL version '$v' falls in an affected upstream range for CVE-2023-0465. Note: practical exploitability still depends on an application explicitly enabling certificate policy checks."
    exit 1
  fi

  say "UNKNOWN: OpenSSL version '$v' is not in a straightforward upstream-parseable state. This may be a vendor-backported build; verify with distro advisories and package metadata."
  exit 2
}

main "$@"
07 · Bottom Line

If you remember one thing.

TL;DR
Monday morning, do not treat this like an internet-fire drill. First identify which applications actually enable OpenSSL certificate policy processing and rely on policy OIDs for trust segregation; if none do, document the downgrade and move on. For exposed apps, tighten trust anchors or pin issuers during routine engineering work, but there is noisgate mitigation SLA for a LOW verdict and effectively noisgate remediation SLA beyond backlog hygiene, so patch in normal maintenance rather than burning an emergency window.

Sources

  1. OpenSSL advisory
  2. Official CVE JSON 5 record
  3. NVD entry
  4. OpenSSL vulnerability index
  5. OpenSSL FIPS/CVE matrix
  6. Debian security advisory
  7. FIRST EPSS 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.