OpenPGP data signature accepted from a signing subkey without cross-certification
Key facts
- Attack vector
- Network
- Privileges required
- None
- User interaction
- None
- Attack complexity
- Low
- Attack requirements
- Present
- Impact type
- Security bypass
- Confidentiality · integrity · availability
- None · High · None
- Fix status
- Partial Red Hat: 1 fixed, 6 without a fix
Attack profile from CVSS 4.0 · CNA. Fix status from CNA and Red Hat. Impact type from CWE-345.
Summary
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.
Why it matters now
SSVC decision points
CISA ADP · SSVC 2.0.3
- Exploitation
- None
- Automatable
- No
- Technical impact
- Partial
The decision (Track, Attend, Act) also depends on your mission and well-being impact; see CISA's SSVC guide.
Affected products
| Vendor | Product | Affected versions | Fixed in | Status | Source |
|---|---|---|---|---|---|
| Legion of the Bouncy Castle Inc. | BC-JAVA | 1.81 to before 1.86 | 1.86 | Patch available | CNA |
- BC-JAVA VendorLegion of the Bouncy Castle Inc. Affected 1.81 to before 1.86 Fixed in 1.86 Patch available CNA
CPE names Threatist (inferred) · 1
Inferred from how NVD named this product before; not given by a source.
| CPE | Versions | Role | Vendor |
|---|---|---|---|
| cpe:2.3:a:bouncycastle:bc-java:*:*:*:*:*:*:*:* | — | — | Legion of the Bouncy Castle Inc. |
- cpe:2.3:a:bouncycastle:bc-java:*:*:*:*:*:*:*:* Versions — — ·Legion of the Bouncy Castle Inc.
Remediation
- Fix · CNA BC-JAVA (Legion of the Bouncy Castle Inc.) Fixed in 1.86
Red Hat 1 advisory
- RHSA-2026:83670 Released 2026-10-15 · Red Hat rating ImportantRed Hat Build of Apache Camel 4.18 for Quarkus 3.33 update is now available (RHBQ 3.33.4.GA)
- Red Hat Build of Apache Camel 3.33.4.redhat com.fasterxml.jackson.core.jackson-core-2.21.7.redhat-00001.jar, com.fasterxml.jackson.core.jackson-databind-2.21.7.redhat-00001.jar, io.micrometer.micrometer-core-1.16.7.redhat-00002.jar +14
Fixed in the same release
Records fixed by the same vendor advisory or release, as the CNA lists them.
- Release ·
Legion of the Bouncy Castle BC-JAVA 1.86
11 records Highest priority Priority MEDIUM 4 MEDIUM, 7 LOW
Other records, highest priority first
- TI-2026-67477 MLS external commit can remove an arbitrary group memberPriority MEDIUM 43
- TI-2026-67476 PKIXCertPathReviewer does not apply X.509 name constraints to the target certificatePriority MEDIUM 43
- TI-2026-67475 CMS AuthenticatedData exposes attacker-inserted authAttrs when digestAlgorithm is absentPriority MEDIUM 42
Vendor assessments
Red Hat
Red Hat rating: Important. Red Hat's page for this CVE →
| Product | Status | Plan or fix |
|---|---|---|
| OpenShift Developer Tools and Services | Affected | No fix yet |
| Red Hat Fuse 7 | Affected | No fix yet: Fix deferred |
| Red Hat JBoss Enterprise Application Platform 7 | Affected | No fix yet: Fix deferred |
| Red Hat JBoss Enterprise Application Platform 8 | Affected | No fix yet |
| Red Hat Single Sign-On 7 | Affected | No fix yet: Fix deferred |
| Red Hat build of Apache Camel 4 for Quarkus 3 | Affected | No fix yet |
| Red Hat Build of Apache Camel 3.33.4.redhat | Fixed | RHSA-2026:83670 |
Not affected: 2 products
- Red Hat Build of Apache Camel 3.33.4.redhat
- Red Hat JBoss Enterprise Application Platform Expansion Pack
Timeline
- 2026-10-03 Threatist record created from CVE-2026-71887
- 2026-10-03 Alias added: GHSA-cwf6-pghv-hq93
- 2026-10-04 Priority changed: MEDIUM → LOW
- 2026-10-05 CISA SSVC decision points changed
- 2026-11-06 Fix available: Red Hat Build of Apache Camel 3.33.4.redhat · Red Hat
- 2026-11-06 CVSS score added · Red Hat
- 2026-11-06 Fix available: RHSA-2026:83670 · Red Hat
References
More Legion of the Bouncy Castle Inc. vulnerabilities
- TI-2018-15967 Legion of the Bouncy Castle Legion of the Bouncy Castle Java Cryptography APIs 1.58 up to… CVSS 3.1CRITICAL 9.8
- TI-2017-09736 BouncyCastle JCE TLS Bleichenbacher/ROBOT CVSS 3.0HIGH 7.5
- TI-2026-42545 MTI/A0 DH agreement exponentiates unvalidated peer value CVSS 4.0CRITICAL 9.3
- TI-2026-42533 JSSE hostname verifier CN-fallback enabled by default despite documented opt-in CVSS 4.0CRITICAL 9.3
- TI-2026-41816 Stapled OCSP response accepted without binding to the checked certificate CVSS 4.0CRITICAL 9.3
- TI-2026-07701 Name Constraints bypass via trailing dot in rfc822Name and URI CVSS 4.0CRITICAL 9.3
Sources
- CVE-2026-71887 · CVE Program
- CVE-2026-71887 · NVD
- FIRST EPSS
- GHSA-cwf6-pghv-hq93 · GitHub Advisory Database · CC BY 4.0
- CVE-2026-71887 · Red Hat security data · CC BY 4.0
This product uses the NVD API but is not endorsed or certified by the NVD. Sources and licences