Description
In Bouncy Castle for Java before 1.86, the high-level OpenPGP certificate API accepted a third-party certification or trust delegation from any component key of the issuing certificate, without requiring that component to have been granted the authority to certify. OpenPGPCertificate.getCertificationBy() and getDelegationBy() resolve a third-party signature by matching its issuer key identifier against every key of the third-party certificate, then verify the issuing component's binding chain and the signature itself; nothing checked that the issuing component carried the RFC 9580 sec. 5.2.3.29 certification key flag (CERTIFY_OTHER) when the signature was created. A subkey bound only with SIGN_DATA - the online signing subkey of exactly the offline-primary arrangement those key flags exist to express - could therefore issue a positive User ID certification over an attacker-controlled identity, or a full-trust depth-one direct-key delegation of introducer trust, and the API returned it as a valid signature chain attributed to the third-party certificate. An application treating getCertificationBy(...).isValid() or getDelegationBy(...) as an identity or trusted-introducer decision would attribute the attacker's assertion to the offline primary key. The same held for a legacy RSA subkey bound only for encryption, whose algorithm is nonetheless able to sign. This does not forge the primary key's signature or recover any private key; it promotes an already-compromised restricted subkey to the primary key's identity-issuing authority, defeating the containment the key-flag separation provides. A third-party certification or delegation is now attributed to the issuing certificate only when the component key that made it is the primary key, or is a subkey holding CERTIFY_OTHER when the signature was created, so certification-capable subkeys continue to be accepted; primary keys are accepted whatever their key flags say, since a primary key is certification-capable by construction and certificates carrying no key flags subpacket at all are common. Third-party revocations are deliberately outside the rule, since declining to honour one would keep trust alive rather than withdraw it.
Published: 2026-10-03
Score: 8.2 High
EPSS: n/a
KEV: No
Impact: Undermines OpenPGP trust by allowing compromised subkeys to act as identity issuers
Action: Patch Now
AI Analysis

Impact

OpenPGP certificate handling in Bouncy Castle Java prior to version 1.86 mistakenly allows any component key of the issuer certificate to create a valid certification or delegation signature. Because the API does not verify that the subkey has the CERTIFY_OTHER key flag, an attacker who controls a restricted subkey can certify an arbitrary User ID or delegate trust, making the application trust the attacker’s identity as if it were signed by the certificate’s primary key. This weakness does not expose private keys but allows a compromised subkey to act as an identity‑issuing authority, undermining the trust boundaries the key‑flag separation intended.

Affected Systems

The flaw affects the Bouncy Castle cryptographic library for Java, commonly referred to as BC‑JAVA. Versions prior to 1.86 are vulnerable; the issue was fixed in the 1.86 release. Systems incorporating older BC‑JAVA jars that process OpenPGP certificates are at risk.

Risk and Exploitability

The CVSS score of 8.2 indicates a moderate‑to‑high severity vulnerability. The EPSS score is not available, and the vulnerability is not listed in CISA KEV. An attacker can exploit the flaw by supplying a signed OpenPGP certificate that contains a malicious certification or delegation created by a compromised subkey. Because the library accepts the chain as valid, the attacker can effectively assert identity or establish trust paths, potentially leading to privilege escalation or bypass of access controls. The attack requires that the application use the vulnerable OpenPGP API to validate certificates; the exploit can be delivered over any channel that allows a malicious certificate to be fed into the application, so the practical attack vector is likely remote but depends on the client’s usage of the library.

Generated by OpenCVE AI on October 3, 2026 at 10:22 UTC.

Remediation

No solution or workaround provided in the CVE record.

OpenCVE Recommended Actions

  • Upgrade Bouncy Castle Java to version 1.86 or later, which enforces proper CERTIFY_OTHER checks on subkeys.
  • If immediate upgrade is not possible, suppress or filter third‑party certifications and delegations created by subkeys that are not primary or lack the CERTIFY_OTHER flag, ensuring only primary key signatures are accepted.
  • Add application‑level validation that checks the key flags of the issuing component before trusting a certificate chain, rejecting signatures from subkeys without certification authority privileges.

Generated by OpenCVE AI on October 3, 2026 at 10:22 UTC.

Tracking

Sign in to view the affected projects.

Advisories

No advisories yet.

History

Sat, 03 Oct 2026 09:00:00 +0000

Type Values Removed Values Added
Description In Bouncy Castle for Java before 1.86, the high-level OpenPGP certificate API accepted a third-party certification or trust delegation from any component key of the issuing certificate, without requiring that component to have been granted the authority to certify. OpenPGPCertificate.getCertificationBy() and getDelegationBy() resolve a third-party signature by matching its issuer key identifier against every key of the third-party certificate, then verify the issuing component's binding chain and the signature itself; nothing checked that the issuing component carried the RFC 9580 sec. 5.2.3.29 certification key flag (CERTIFY_OTHER) when the signature was created. A subkey bound only with SIGN_DATA - the online signing subkey of exactly the offline-primary arrangement those key flags exist to express - could therefore issue a positive User ID certification over an attacker-controlled identity, or a full-trust depth-one direct-key delegation of introducer trust, and the API returned it as a valid signature chain attributed to the third-party certificate. An application treating getCertificationBy(...).isValid() or getDelegationBy(...) as an identity or trusted-introducer decision would attribute the attacker's assertion to the offline primary key. The same held for a legacy RSA subkey bound only for encryption, whose algorithm is nonetheless able to sign. This does not forge the primary key's signature or recover any private key; it promotes an already-compromised restricted subkey to the primary key's identity-issuing authority, defeating the containment the key-flag separation provides. A third-party certification or delegation is now attributed to the issuing certificate only when the component key that made it is the primary key, or is a subkey holding CERTIFY_OTHER when the signature was created, so certification-capable subkeys continue to be accepted; primary keys are accepted whatever their key flags say, since a primary key is certification-capable by construction and certificates carrying no key flags subpacket at all are common. Third-party revocations are deliberately outside the rule, since declining to honour one would keep trust alive rather than withdraw it.
Title OpenPGP certification accepted from a subkey without certification authority
Weaknesses CWE-285
CWE-863
References
Metrics cvssV4_0

{'score': 8.2, 'vector': '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'}


Subscriptions

No data.

cve-icon MITRE

Status: PUBLISHED

Assigner: bcorg

Published:

Updated: 2026-10-03T08:46:33.868Z

Reserved: 2026-08-08T00:06:06.982Z

Link: CVE-2026-71886

cve-icon Vulnrichment

No data.

cve-icon NVD

Status : Received

Published: 2026-10-03T09:17:04.897

Modified: 2026-10-03T09:17:04.897

Link: CVE-2026-71886

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-10-03T10:30:19Z

Weaknesses