Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessObtain victim's public signing subkey
-
DeliveryBind subkey under attacker primary key
-
ExploitOmit Key Flags and embedded Primary Key Binding
-
ExecutionSupply certificate with victim's genuine signed message
-
PersistHigh-level API skips cross-certification, isValid() returns true
-
ImpactGenuine signature misattributed to attacker identity
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A04:2025 - Cryptographic Failures
ASVS 5.0
V11 - Cryptography Signature verification
|
| Exploitation Conditions | Exploitation is limited to the high-level OpenPGP API (org.bouncycastle.openpgp.api, e.g. OpenPGPCertificate and OpenPGPDocumentSignature.isValid()); the low-level PGPSignature/PGPPublicKeyRing API performs no binding checks by design and is unaffected. The attacker must possess the victim's public signing subkey (public material) and an existing message genuinely signed by that subkey, then construct a Subkey Binding signature that omits both the Key Flags subpacket and the embedded Primary Key Binding (cross-certification) signature. The flaw only yields a harmful result when the relying party pins trust on the subkey's fingerprint or key ID while deriving the signer identity from the enclosing, attacker-controlled certificate's self-asserted User IDs. Key limiting factors: no new signature can be forged and no private key is recovered - only a signature the subkey actually made can be misattributed; and version 1.86 stops a subkey inheriting the primary key's flags, so the cross-certification check is enforced. |
| Impact | The vendor-supplied CVSS 4.0 base score is 8.2 (High), driven entirely by integrity impact (VI:H) with no confidentiality or availability effect (VC:N/VA:N) and no scope change to subsequent systems (SC:N/SI:N/SA:N). The vector is network-reachable with low complexity and no required privileges (AV:N/AC:L/PR:N/UI:N), but it carries AT:P (attack requirement present), which correctly reflects that exploitation is not self-contained: the attacker must already possess a genuine message signed by the victim's signing subkey plus that subkey's public material. No EPSS score was supplied, so exploitation probability cannot be quantified from the input. This CVE is NOT listed in CISA KEV and no public exploit code is referenced, so there is no public exploit identified at time of analysis and no confirmed active exploitation. The practical risk is narrower than 8.2 implies: the flaw only affects the high-level OpenPGP API (org.bouncycastle.openpgp.api) and only produces a harmful outcome for relying parties that pin trust on a subkey fingerprint/key ID while taking identity from the enclosing certificate; the low-level PGPSignature/PGPPublicKeyRing API is unaffected by design. It is signature misattribution (a genuine signature reported under an attacker-chosen identity), not key recovery or forgery of a new signature. Net: a legitimate, well-reasoned high-severity cryptographic verification defect worth prioritizing for users of the high-level OpenPGP certificate API, but absent EPSS/KEV/POC signals it reads as a correctness and RFC-9580-compliance fix rather than an imminent mass-exploitation threat. |
| Exploit ScenarioDerived | An attacker takes a victim's public signing subkey (public material) and binds it under their own primary key using a Subkey Binding signature they craft without a Key Flags subpacket and without the embedded Primary Key Binding (cross-certification) signature they could not legitimately produce. When a relying party uses Bouncy Castle's high-level OpenPGP API to verify one of the victim's genuinely signed messages against this attacker certificate, OpenPGPDocumentSignature.isValid() returns true and reports the attacker's identity as the signer. No public exploit code is referenced, but the technique requires only standard OpenPGP packet manipulation plus an existing genuine signature, consistent with the AV:N/AC:L/AT:P vector. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – Oct 03, 2026
Signature misattribution in the high-level OpenPGP API of Bouncy Castle for Java before 1.86 lets an attacker who holds a third party's public signing subkey - entirely public material - graft that subkey onto their own primary key with a Subkey Binding signature that omits both the Key Flags subpacket and the embedded Primary Key Binding (cross-certification) signature. Because OpenPGPCertificate.isSigningKey() and verifyEmbeddedPrimaryKeyBinding() resolved the subkey's key flags two different ways, the grafted subkey was treated as signing-capable while being exempt from the cross-certification requirement, so OpenPGPSignature.OpenPGPDocumentSignature.isValid() returned true for a message the subkey genuinely signed and reported the attacker's certificate as its issuer; GnuPG rejects the identical certificate and message. This yields misattribution of an existing genuine signature under an attacker-chosen, self-asserted identity - no private key is recovered and no new signature can be forged - and only affects relying parties that pin trust on the subkey's fingerprint or key ID while taking the signer identity from the enclosing certificate. The vendor rates it 8.2 (CVSS 4.0) with integrity-only impact; an independent assessment scores it CVSS 3.1 8.2-equivalent integrity-only (AC:H, PR:N, UI:N), no public exploit code and no confirmed active exploitation (not in CISA KEV) were identified at time of analysis.
RemediationAI
Upgrade to Bouncy Castle for Java 1.86 or later (vendor-released patch: 1.86; upstream commit b51452fa48ccb578fc16b8222fce9eedf92c94d6), which stops a subkey from inheriting the primary key's Key Flags so the cross-certification check is enforced consistently; see the vendor advisory at https://github.com/bcgit/bc-java/wiki/CVE%E2%80%902026%E2%80%9071887. Where upgrading immediately is not possible, the practical compensating controls are: (1) verify OpenPGP signatures with the low-level PGPSignature/PGPPublicKeyRing API instead of OpenPGPSignature.OpenPGPDocumentSignature.isValid(), at the cost of implementing binding and cross-certification validation yourself; (2) independently reject any Subkey Binding signature whose hashed subpackets omit a Key Flags subpacket or an embedded Primary Key Binding signature before accepting a subkey as signing-capable - this is the specific check the vulnerable path skipped, and it must be applied by the relying party since the library does not; (3) change trust-pinning policy so the reported signer identity is derived from the primary key's fingerprint (with cross-certification validated) rather than from the subkey's fingerprint or key ID while taking User IDs from the enclosing certificate, which removes the attacker's ability to substitute their own self-asserted identity - the trade-off is reduced flexibility for subkey-scoped trust models; and (4) cross-check suspicious certificates and messages against GnuPG, which refuses these certificates as not cross-certified. Note that these are partial mitigations only: they do not prevent the underlying misattribution if the relying party continues to accept attacker-constructed certificates, and they do not address forged signatures, since no new signature can be created by this flaw.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The root cause is CWE-347, improper verification of a cryptographic signature, arising from an internal inconsistency in how the Bouncy Castle Java high-level OpenPGP API (org.bouncycastle.openpgp.api) determined a component subkey's capabilities. RFC 9580 section 5.2.1.8 and section 10.1.3 require that any subkey able to issue signatures carry an embedded Primary Key Binding (cross-certification) signature inside its Subkey Binding signature - the subkey's own statement that it belongs to the primary key it is bound under. OpenPGPCertificate.OpenPGPComponentKey.isSigningKey() obtained the subkey's effective key flags indirectly through getKeyFlags()/getApplyingSubpacket(), which fell back to the primary key's direct-key or primary User ID self-signature whenever the Subkey Binding signature omitted the Key Flags subpacket; the subkey therefore inherited the primary key's SIGN_DATA capability. verifyEmbeddedPrimaryKeyBinding(), which enforces cross-certification, read only the binding signature's own hashed subpackets, found no SIGN_DATA there, and returned early treating the subkey as non-signing - so it never demanded the back signature. The two code paths disagreed about the same key, producing a state where a subkey's signature was attributed to the certificate and validated while the RFC-mandated cross-certification check was silently skipped. The fix aligns the two decisions with RFC 9580 section 5.2.3.29 (Key Flags describe the key the carrying signature refers to): a subkey no longer inherits flags from certificate-wide primary-key signatures, so a Subkey Binding signature that omits the subpacket leaves the subkey with no capabilities, and the flags the cross-certification check consults are the same flags every other decision consults. Preferences and other direct-key subpackets are still inherited, and primary keys - whose flags legitimately come from their own direct-key or User ID self-signature - are unaffected. The low-level PGPSignature / PGPPublicKeyRing API performs no binding checks by design and is not vulnerable; only the high-level API is impacted.
Know when Java gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/U:Amber
AC:H because the attacker must already hold a genuine subkey signature and the public subkey (the 4.0 AT:P condition); PR:N/UI:N as only public material is used; integrity-only misattribution, so C:N/A:N.
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N
Primary rating from Vendor (bcorg).
CVSS VectorVendor: bcorg
DescriptionCVE.org
In Bouncy Castle for Java before 1.86, the high-level OpenPGP API accepted a data signature made by a signing subkey whose Subkey Binding signature carried no embedded Primary Key Binding (cross-certification) signature, in the case where that binding omits a Key Flags subpacket. RFC 9580 sec. 5.2.1.8 and sec. 10.1.3 require the embedded Primary Key Binding signature on any subkey that can issue signatures; it is the subkey's own statement that it belongs to the primary key it is bound under. OpenPGPCertificate resolved the subkey's key flags two different ways. isSigningKey() goes through getKeyFlags() and getApplyingSubpacket(), which falls back to the primary key's direct-key or primary User ID self-signature when the binding signature omits the subpacket, so the subkey inherited the primary's SIGN_DATA and counted as signing-capable; verifyEmbeddedPrimaryKeyBinding(), which enforces the requirement, reads the binding signature's own hashed subpackets, found no SIGN_DATA there, and returned early as a non-signing key without ever demanding the back signature. The same subkey was therefore signing-capable - so its signatures were attributed to the certificate and OpenPGPSignature.OpenPGPDocumentSignature.isValid() returned true - while being exempt from cross-certification, where GnuPG refuses the identical certificate and message. An attacker needs only the victim's public signing subkey, which is public material: they bind it to their own primary key with a Subkey Binding signature they are able to make, carrying no Key Flags and no embedded Primary Key Binding signature, which they cannot make without the subkey's private key, and a relying party verifying one of the victim's genuinely signed messages against that certificate is told the signature is valid and given the attacker's certificate as its issuer. Because a certificate's User IDs are self-asserted, a verifier that pins on the subkey's fingerprint or key ID while taking the identity from the enclosing certificate reports a real signature under an attacker-chosen identity. This is misattribution of a genuine signature rather than forgery of a new one: no private key is recovered, and the signature must be one the grafted subkey actually made. The low-level PGPSignature / PGPPublicKeyRing API performs no binding checks by design and is unaffected. Key Flags are a statement about the key the carrying signature refers to (RFC 9580 sec. 5.2.3.29), so a subkey no longer inherits them from the certificate-wide signatures of the primary key: a Subkey Binding signature that omits the subpacket now leaves the subkey with no capabilities rather than the primary's, which makes the flags the cross-certification check consults the same flags every other decision consults. Preferences and the other subpackets a direct-key signature carries are inherited as before, and the primary key itself, whose flags legitimately come from its own direct-key or User ID self-signature, is unaffected.
Articles & Coverage 1
Executive ViewAI
Bouncy Castle for Java, a cryptographic library embedded in a wide range of enterprise applications, has a signature-verification flaw in its high-level OpenPGP API that allows an attacker to make a genuine signature appear to originate from a certificate and identity of their choosing. Any system or workflow that relies on Bouncy Castle to validate OpenPGP signatures - including artifact signing, software supply-chain verification, secure email, and identity attestation - may accept misattributed trust assertions, while the same input is correctly rejected by GnuPG. Leadership should care because this undermines the integrity of signature-based identity and provenance checks without any indication to the end user that verification was flawed.
Apply vendor patch.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m
Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti
Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent
Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug
JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up
Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up
The WLS Security component in Oracle WebLogic Server 10.3.6.0, 12.1.2.0, 12.1.3.0, and 12.2.1.0 allows remote attackers
Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow
Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla
The ExceptionDelegator component in Apache Struts before 2.2.3.1 interprets parameter values as OGNL expressions during
Vendor StatusVendor
SUSE
Severity: Moderate| Product | Status |
|---|---|
| SUSE Linux Enterprise Desktop 15 SP7 | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP7 | Affected |
| SUSE Linux Enterprise Server 15 SP7 | Affected |
| SUSE Linux Enterprise Server 16.0 | Affected |
| SUSE Linux Enterprise Server 16.1 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP7 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.0 | Affected |
| SUSE Linux Enterprise Server for SAP applications 16.1 | Affected |
| openSUSE Leap 16.0 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP4 | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP5 | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP6 | Affected |
| SUSE Linux Enterprise Server 15 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP4-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP5 | Affected |
| SUSE Linux Enterprise Server 15 SP5-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP6 | Affected |
| SUSE Linux Enterprise Server 15 SP6-LTSS | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP4 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP5 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP6 | Affected |
| SUSE Enterprise Storage 7 | Affected |
| SUSE Enterprise Storage 7.1 | Affected |
| SUSE Linux Enterprise Desktop 15 SP2 | Affected |
| SUSE Linux Enterprise Desktop 15 SP3 | Affected |
| SUSE Linux Enterprise Desktop 15 SP4 | Affected |
| SUSE Linux Enterprise Desktop 15 SP5 | Affected |
| SUSE Linux Enterprise Desktop 15 SP6 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4 | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP4-ESPOS | Affected |
| SUSE Linux Enterprise High Performance Computing 15 SP5-ESPOS | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP2 | Affected |
| SUSE Linux Enterprise Module for Development Tools 15 SP3 | Affected |
| SUSE Linux Enterprise Real Time 15 SP2 | Affected |
| SUSE Linux Enterprise Real Time 15 SP3 | Affected |
| SUSE Linux Enterprise Real Time 15 SP4 | Affected |
| SUSE Linux Enterprise Server 15 SP2 | Affected |
| SUSE Linux Enterprise Server 15 SP2-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP2-LTSS | Affected |
| SUSE Linux Enterprise Server 15 SP3 | Affected |
| SUSE Linux Enterprise Server 15 SP3-BCL | Affected |
| SUSE Linux Enterprise Server 15 SP3-LTSS | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP2 | Affected |
| SUSE Linux Enterprise Server for SAP Applications 15 SP3 | Affected |
| SUSE Manager Proxy 4.1 | Affected |
| SUSE Manager Proxy 4.2 | Affected |
| SUSE Manager Proxy 4.3 | Affected |
| SUSE Manager Retail Branch Server 4.1 | Affected |
| SUSE Manager Retail Branch Server 4.2 | Affected |
| SUSE Manager Retail Branch Server 4.3 | Affected |
| SUSE Manager Server 4.1 | Affected |
| SUSE Manager Server 4.2 | Affected |
| SUSE Manager Server 4.3 | Affected |
| openSUSE Leap 15.3 | Affected |
| openSUSE Leap 15.4 | Affected |
| openSUSE Leap 15.5 | Affected |
| openSUSE Leap 15.6 | Affected |
| SUSE Linux Enterprise Server for NVIDIA 16.1 | Affected |
EUVD-2026-91993
GHSA-cwf6-pghv-hq93
NVD
CVE.org
EPSS
Vulnrichment
Exploit-DB