{"id":32523,"date":"2026-10-03T20:32:11","date_gmt":"2026-10-03T12:32:11","guid":{"rendered":"https:\/\/www.54iter.cn\/?vuln=cve-2026-71887"},"modified":"2026-10-03T20:32:11","modified_gmt":"2026-10-03T12:32:11","slug":"cve-2026-71887","status":"publish","type":"vuln","link":"https:\/\/www.54iter.cn\/?vuln=cve-2026-71887","title":{"rendered":"CVE-2026-71887 &#8211; In Bouncy Castle for Java before 1.86, the high-level OpenPGP API accepted a data signatur"},"content":{"rendered":"<p>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&#8217;s own statement that it belongs to the primary key it is bound under. OpenPGPCertificate resolved the subkey&#8217;s key flags two different ways. isSigningKey() goes through getKeyFlags() and getApplyingSubpacket(), which falls back to the primary key&#8217;s direct-key or primary User ID self-signature when the binding signature omits the subpacket, so the subkey inherited the primary&#8217;s SIGN_DATA and counted as signing-capable; verifyEmbeddedPrimaryKeyBinding(), which enforces the requirement, reads the binding signature&#8217;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 &#8211; so its signatures were attributed to the certificate and OpenPGPSignature.OpenPGPDocumentSignature.isValid() returned true &#8211; while being exempt from cross-certification, where GnuPG refuses the identical certificate and message. An attacker needs only the victim&#8217;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&#8217;s private key, and a relying party verifying one of the victim&#8217;s genuinely signed messages against that certificate is told the signature is valid and given the attacker&#8217;s certificate as its issuer. Because a certificate&#8217;s User IDs are self-asserted, a verifier that pins on the subkey&#8217;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&#8217;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.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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-certi<\/p>\n","protected":false},"template":"","meta":[],"categories":[],"tags":[],"class_list":["post-32523","vuln","type-vuln","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln\/32523","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/vuln"}],"about":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=\/wp\/v2\/types\/vuln"}],"wp:attachment":[{"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=32523"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=32523"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.54iter.cn\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=32523"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}