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.
4 steps from start to impact.
Gain a CA position
openssl ca-based pipeline can mint the certificate once the attacker has CA authority.- Attacker can issue certificates chaining to a root/intermediate the target trusts
- Target relies on X.509 certificate validation for auth or trust decisions
- 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
Craft a policy-bad leaf certificate
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.- Attacker-controlled CA can sign the malicious leaf
- Certificate includes malformed or invalid policy assertions relevant to the target's policy checks
- The cert must still pass ordinary chain building and signature validation
- Many deployments do not use policy OIDs for authorization at all
Hit an application that enabled policy checking
-policy, calls X509_VERIFY_PARAM_set1_policies(), or otherwise turns on policy checking; without that, CVE-2023-0465 is dead code for practical purposes.- The application explicitly enabled certificate policy processing
- The vulnerable OpenSSL library is actually in that verification path
- 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
Bypass the policy gate and get trust
- Application actually relies on policy OIDs to separate trusted from untrusted certs
- Accepted certificate meaningfully changes access or trust
- 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
The supporting signals.
| In-the-wild status | No credible public evidence of active exploitation found in the reviewed primary sources; CISA ADP enrichment marks exploitation as none in the CVE JSON. |
|---|---|
| KEV status | Not KEV-listed as of 2026-06-05; this CVE does not appear in the CISA Known Exploited Vulnerabilities Catalog. |
| Proof-of-concept availability | No 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. |
| EPSS | User-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, interpreted | CVSS: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 versions | Upstream 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 versions | Upstream 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 reality | Inference: 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 timeline | CVE reserved 2023-01-24; OpenSSL lists the issue as published 2023-03-23; advisory email/NVD publication followed on 2023-03-28. |
| Reporter / fixer | Reported by David Benjamin (Google); fix developed by Matt Caswell. |
noisgate verdict.
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.
Why this verdict
- Start at vendor 5.3: on paper it is remotely reachable and affects certificate validation, so
MEDIUMis 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.
What to do — in priority order.
- Inventory policy-check callers — Find applications that pass
-policy, callX509_VERIFY_PARAM_set1_policies(), or explicitly setX509_V_FLAG_POLICY_CHECK. Because this is aLOWverdict, 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. - 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
LOWissue, fold this into the next PKI maintenance cycle rather than emergency change windows. - 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
LOWcase, deploy through routine config management and service hardening work. - 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.
- 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.
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.
#!/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 "$@"
If you remember one thing.
LOW verdict and effectively noisgate remediation SLA beyond backlog hygiene, so patch in normal maintenance rather than burning an emergency window.Sources
What defenders are saying.
Crowdsourced verification outputs.
Results submitted by users who ran the verification payload against their environment.