Skip to main content

Bouncy Castle CVE-2026-71887

| EUVDEUVD-2026-91993 HIGH
Improper Verification of Cryptographic Signature (CWE-347)
2026-10-03 bcorg GHSA-cwf6-pghv-hq93
8.2
CVSS 4.0 · Vendor: bcorg
View

Attack ChainAIDerived

Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain

  1. Access
    Obtain victim's public signing subkey
  2. Delivery
    Bind subkey under attacker primary key
  3. Exploit
    Omit Key Flags and embedded Primary Key Binding
  4. Execution
    Supply certificate with victim's genuine signed message
  5. Persist
    High-level API skips cross-certification, isValid() returns true
  6. Impact
    Genuine 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.

This Week Schedule remediation this week. Why: HIGH severity (CVSS 7.0-8.9).
Patch available 0.1% exploitation probability (EPSS)

Get an e-mail when this CVE is exploited, patched or re-scored. Free account.

Alert me

AnalysisAIv1 – 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

BC-JAVA 1.81 <1.86

Affected Packages

euvd bc_java fix: 1.86

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

Vendor (bcorg) PRIMARY 8.2 HIGH
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
vuln.today AI 5.9 MEDIUM

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.

3.1 AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N
4.0 AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N
SUSE 5.9 MEDIUM
AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:H/A:N

Primary rating from Vendor (bcorg).

CVSS VectorVendor: bcorg

Attack Vector
Network
Attack Complexity
Low
Attack Requirements
Present
Privileges Required
None
User Interaction
None
Vulnerable system: Confidentiality
None
Vulnerable system: Integrity
High
Vulnerable system: Availability
None
Subsequent system: Confidentiality
None
Subsequent system: Integrity
None
Subsequent system: Availability
None

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.

Executive ViewAI

Why It Matters

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.

Business Impact: Medium
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.1%
Top 100% exploitable
Prevalence
High
Bouncy Castle is a very widely deployed Java crypto library; high-level OpenPGP API usage is a narrower subset
Social Media
2
Sightings
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment Vendor CIRCL GitHub

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.

SignalValue
Severity HIGH
CISA KEV No
Public POC No
EPSS 0.1%
Patch available Yes
Active threat No
Deciding rule
HIGH severity (CVSS 7.0-8.9)
What every action level means
Emergency Immediate action required. Criteria: CRITICAL + in CISA KEV (actively exploited) without patch, OR CRITICAL + EPSS > 30% without patch, OR CRITICAL + active threat signals without patch.
Act Now Prioritize within 24-48h. Criteria: in KEV with patch available, OR CRITICAL + public POC, OR HIGH + EPSS > 10%, OR CRITICAL + active threat, OR any CRITICAL severity.
This Week Schedule remediation this week. Criteria: HIGH severity (CVSS 7.0-8.9). Patch within normal change window.
This Month Plan within 30 days. Criteria: MEDIUM severity (CVSS 4.0-6.9), lower exploitation probability. Include in regular patch cycle.
Monitor Track and reassess. Criteria: LOW severity (CVSS 0.1-3.9), minimal exploitation risk. No immediate action needed.

SSVC AssessmentENISA

SSVC Decision
Scheduled
Exploitation
None
System Exposure· derived
Open
Automatable
No
Human Impact
Medium
Technical Impact
Partial

Priority Score

41
Low Medium High Critical
KEV: 0
EPSS: 0
CVSS: +41
PoC: 0
Weaponized: 0
Threat intel: 0
Gov advisory: 0

More in Java

View all
CVE-2012-4681 CRITICAL POC
9.8 Aug 28

Oracle Java SE 7 Update 6 and earlier contains multiple sandbox bypass vulnerabilities via the ClassFinder and forName m

CVE-2015-7450 CRITICAL POC
9.8 Jan 02

Remote code execution in IBM Sterling B2B Integrator, Sterling Integrator, and Tivoli Common Reporting allows unauthenti

CVE-2013-2465 CRITICAL POC
9.8 Jun 18

Java Runtime Environment sandbox bypass via incorrect image channel verification in 2D component allows remote unauthent

CVE-2011-3544 CRITICAL POC
9.8 Oct 19

Oracle Java SE JDK/JRE 7 and 6 Update 27 and earlier allows remote code execution with complete system compromise throug

CVE-2010-1871 HIGH POC
8.8 Aug 05

JBoss Seam 2 in Red Hat JBoss EAP 4.3.0 fails to sanitize JBoss Expression Language inputs, allowing remote attackers to

CVE-2012-1723 CRITICAL POC
9.8 Jun 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 update 4 and earlier, 6 up

CVE-2013-0422 CRITICAL POC
9.8 Jan 10

Multiple vulnerabilities in Oracle Java 7 before Update 11 allow remote attackers to execute arbitrary code by (1) using

CVE-2012-0507 CRITICAL POC
9.8 Jun 07

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 2 and earlier, 6 Up

CVE-2015-4852 CRITICAL POC
9.8 Nov 18

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

CVE-2012-5076 CRITICAL POC
9.8 Oct 16

Unspecified vulnerability in the Java Runtime Environment (JRE) component in Oracle Java SE 7 Update 7 and earlier allow

CVE-2017-3066 CRITICAL POC
9.8 Apr 27

Remote unauthenticated attackers can execute arbitrary code on Adobe ColdFusion servers through Java deserialization fla

CVE-2012-0391 CRITICAL POC
9.8 Jan 08

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

This site uses cookies essential for authentication and security. No tracking or analytics cookies are used. Privacy Policy