Skip to main content

Bouncy Castle EUVDEUVD-2026-91988

| CVE-2026-85515 HIGH
Improper Validation of Integrity Check Value (CWE-354)
2026-10-03 bcorg GHSA-8hgf-w73g-3x6v
8.2
CVSS 4.0 · Vendor: bcorg
View

Attack ChainAIDerived

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

  1. Access
    Intercept or supply OpenPGP message
  2. Exploit
    Truncate leaving packet length unchanged
  3. Execution
    Integrity/MDC verification never runs
  4. Impact
    Recipient accepts altered or unsigned plaintext

Vulnerability Assessment

Weakness
CWE
OWASP Top 10:2025
A08:2025 - Software or Data Integrity Failures
ASVS 5.0
V15 - Secure Coding and Architecture Integrity verification
Exploitation Conditions

Exploitation requires an OpenPGP message that has been truncated such that the enclosing packet's length field is left unchanged, consumed through Bouncy Castle's OpenPGP decryption streams. Two distinct routes exist: (1) the AEAD path (SEIPD v2 and the v5 AEAD packet) triggers only when the literal data packet ends exactly on an AEAD chunk boundary AND the consumer reads in increments smaller than one AEAD chunk, so the trailing message tag (RFC 9580 sec. 5.13.2) is never reached; (2) the SEIPD version 1 (MDC) path is reachable only through the high-level org.bouncycastle.openpgp.api, which exists in bc-java but not the LTS or FIPS editions (those are affected on the AEAD route only). Limiting factors: the low-level API is unaffected (a caller invoking PGPEncryptedData.verify() directly still gets the check), consumers reading in whole-AEAD-chunk-or-larger increments are unaffected, and reachability is probabilistic per message length (AEAD shape in ~3 of 131 lengths; SEIPDv1 shape in ~1 of 16). No authentication is required (PR:N) but the attacker must be able to deliver or truncate the message to the victim.

Impact

The vendor CVSS 4.0 base score of 8.2 (CVSS:4.0/AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:H/VA:N) reflects a pure integrity failure: VC:N and VA:N mean there is no confidentiality or availability impact, while VI:H captures that OpenPGP authenticity/integrity guarantees can be defeated. No EPSS score, CISA KEV listing, or POC is present in the supplied data, so there is no public exploit identified at time of analysis and no evidence of active exploitation. The AT:P (attack requirements present) metric is important and is corroborated by the description: reachability is a property of the message shape rather than of attacker-supplied input - the AEAD shape held for only 3 of 131 consecutive payload lengths and the SEIPDv1 shape for 1 payload length in 16 - and exploitation additionally requires that the consuming application use the high-level streaming API and read in increments smaller than one AEAD chunk. The description also stresses this is a 'missing truncation error rather than a forgery' for the AEAD path (released bytes stay individually authenticated), which tempers severity; the SEIPDv1 path is more serious because no integrity check runs at all and 136 single-byte ciphertext modifications were accepted as altered plaintext. Net: a genuine, high-priority cryptographic-correctness defect for anyone relying on Bouncy Castle's high-level OpenPGP API for message authenticity, but constrained real-world exploitability (probabilistic message shapes, specific API usage, attacker must be able to deliver/truncate messages) rather than a mass-exploitable RCE. It is explicitly a residual of CVE-2026-12817.

Exploit ScenarioDerived

An attacker positioned to tamper with an OpenPGP message in transit (or who supplies a malicious message) truncates a signed-and-encrypted message while leaving the enclosing packet length unchanged, so the recipient's application using Bouncy Castle's high-level streaming OpenPGP API reads it back as a well-formed, unsigned message with the signature and all trailing packets silently dropped and no error raised. On the SEIPDv1/MDC path the integrity check never executes, so single-byte modifications of the ciphertext are accepted as altered plaintext. No public exploit identified at time of analysis; exploitability depends on the message happening to fall into the vulnerable shape and on the consumer reading in sub-chunk increments.

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

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

Alert me

AnalysisAIv1 – Oct 03, 2026

Truncated OpenPGP messages are silently accepted by Bouncy Castle for Java's OpenPGP decryption streams, letting an attacker who can deliver or truncate a message strip trailing packets and, on the SEIPD version 1 path, suppress the modification detection code check entirely, so recipients are handed unauthenticated CFB-decrypted plaintext. The AEAD route (SEIPD v2 and the version 5 AEAD packet) fails open when a literal data packet ends exactly on an AEAD chunk boundary and the consumer reads in increments smaller than one chunk, while the more severe SEIPDv1 route affects only the high-level org.bouncycastle.openpgp.api present in bc-java, not the LTS or FIPS editions. The vendor rates this CVSS 4.0 8.2 (VI:H, with no confidentiality or availability impact), and the fix is released in bc-java 1.86, bc-lts-java 2.73.13, and bcpg-fips 1.0.14 / 2.0.14.1 / 2.1.14; no public exploit identified at time of analysis.

RemediationAI

Vendor-released patches: upgrade bc-java to 1.86, Bouncy Castle for Java LTS to 2.73.13, and bcpg-fips to 1.0.14 (1.0.X), 2.0.14.1 (2.0.X), or 2.1.14 (2.1.X); the upstream fix is commit ab7a235d1c20e3da28ce77167a96b5c14025efa7 and the vendor advisory is https://github.com/bcgit/bc-java/wiki/CVE%E2%80%902026%E2%80%9085515. Where upgrading is not immediately possible, the most effective compensating control is to bypass the high-level org.bouncycastle.openpgp.api decryption streams for SEIPDv1 material and invoke PGPEncryptedData.verify() explicitly after reading, since the low-level API is unaffected - the trade-off is that callers must handle MDC/verify failures themselves and any code path that swallows exceptions reintroduces the exposure. On the AEAD route, ensure data is read in increments of one full AEAD chunk or larger, which avoids the truncated-chunk look-ahead; the trade-offs are higher memory buffering and dependence on callers correctly sizing their read buffers, so treat it as a hardening measure rather than a substitute for the patch. Rejecting or quarantining OpenPGP messages whose packet lengths are inconsistent with the ciphertext actually present, and enforcing message-integrity/signature expectations at the application layer, provide additional defence given that truncated signed-and-encrypted messages can otherwise read back as well-formed unsigned ones; note that enforcement at the application layer does not restore the missing MDC check for legacy SEIPDv1 traffic. No vendor-released workaround is documented beyond patching.

Affected VersionsENISA

BC-FJA 2.0.7 <2.0.14.1
BC-LTS-JAVA 2.73.0 <2.73.13
BC-FJA 2.1.0 <2.1.14
BC-JAVA 1.74 <1.86
BC-FJA 1.0.7 <1.0.14

Affected Packages

euvd bc_fja fix: 1.0.14, 2.0.14.1, 2.1.14
euvd bc_java fix: 1.86
euvd bc_lts_java fix: 2.73.13

Source: OSV (Open Source Vulnerabilities)

Affects your stack

Affects 3 packages 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-354 (Improper Validation of Integrity Check Value) in Bouncy Castle's OpenPGP packet-stream layers. OpenPGP (RFC 9580) requires that a decrypting implementation report a clear error as soon as truncation is detected (sec. 13.7) and that the AEAD trailing message tag authenticate the total plaintext length (sec. 5.13.2). Here, when a message is truncated but the enclosing packet's length field is left unchanged, BCPGInputStream.PartialInputStream raises an EOFException for the missing ciphertext, and BCPGInputStream.nextPacketTag() launders that EOF into what looks like a clean end of message, so the packet stream simply stops and the layers above never learn anything was missing. On the AEAD path, if the literal data packet ends exactly on an AEAD chunk boundary and the consumer reads in increments smaller than one chunk, the look-ahead for the next packet triggers the truncated chunk read and BcAEADUtil/JceAEADUtil never reach the trailing message tag; the caller receives the fully authenticated chunk plaintext, all subsequent packets are silently dropped, and a signed-and-encrypted message reads back as a well-formed unsigned one. Every byte released this way is individually authenticated, so this is a missing-truncation-error rather than a forgery, and it is a residual of CVE-2026-12817, which closed the same outcome for an attacker who corrects the outer packet length. On the SEIPD version 1 path, IntegrityProtectedInputStream verifies the MDC only from close(), and it reached close() solely by self-closing when a read returned -1, which a truncated message never produces; PGPEncryptedData.verify() therefore never ran. The upstream commit ab7a235d1c20e3da28ce77167a96b5c14025efa7 (1) makes the AEAD decryption streams re-throw the EOFException as a plain IOException that nextPacketTag() cannot launder, (2) makes OpenPGPMessageInputStream.close() close its layer's integrity-protected stream itself, and (3) makes IntegrityProtectedInputStream.close() idempotent as java.io.Closeable requires, since the stream is genuinely closed twice on the ordinary path and PGPEncryptedData.verify() consumes the digest state and cannot run twice.

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

Integrity-only impact (I:H; C:N/A:N); no authentication (PR:N) or interaction (UI:N); AC:H because the vulnerable outcome depends on a probabilistic message/truncation shape not controlled by the attacker.

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, a truncated OpenPGP encrypted message was accepted with no error reported, and on the SEIPD version 1 path with no integrity check performed at all. RFC 9580 sec. 13.7 permits an implementation to release the cleartext of the fully authenticated chunks when streaming but requires it to indicate a clear error as soon as the truncation is detected, and to report suspect integrity when it discovers malleable ciphertext. The truncation was detected and then discarded: when a message is truncated but the length field of the enclosing packet is left unchanged, BCPGInputStream.PartialInputStream raises an EOFException for the missing ciphertext, and BCPGInputStream.nextPacketTag() reports an EOFException as a clean end of message, so the packet stream above it stopped as though no packets remained. On the AEAD path (SEIPD version 2 and the version 5 AEAD packet), when the literal data packet ended on an AEAD chunk boundary and the consumer read in increments smaller than one chunk, the look-ahead for the packet after the literal triggered the truncated chunk read, so BcAEADUtil and JceAEADUtil never reached the trailing message tag of sec. 5.13.2 that authenticates the total plaintext length; the caller received the plaintext of the fully authenticated chunks, every packet following the literal was silently dropped, and no exception was raised, so a signed and encrypted message read back as a well-formed unsigned one. Every byte released on that path remained individually authenticated, making this a missing truncation error rather than a forgery, and it is a residual of CVE-2026-12817, which closed the same outcome for an attacker who corrects the outer packet length. On the SEIPD version 1 path the consequence was more serious: IntegrityProtectedInputStream verifies the modification detection code from close(), and reached close() only by closing itself when a read of it returned -1, which a truncated message never produces, so PGPEncryptedData.verify() never ran and the recipient was handed CFB-decrypted plaintext on which no integrity check of any kind had been performed. Measured on a message truncated into that shape, 136 distinct single-byte modifications of the ciphertext produced accepted, altered plaintext with no exception raised. Reachability is a property of the message rather than of attacker-supplied input: the AEAD shape held for 3 of 131 consecutive payload lengths measured, and the SEIPD version 1 shape for one payload length in sixteen, at a truncation offset that did not move with the payload length. The low-level API is unaffected, a caller that invokes PGPEncryptedData.verify() directly getting the check regardless, as are consumers reading in increments of a whole AEAD chunk or more. The AEAD decryption streams now re-throw such an EOFException as a plain IOException, which nextPacketTag() does not launder; OpenPGPMessageInputStream.close() now closes its layer's integrity-protected stream itself rather than relying on that stream having seen the end of its data; and IntegrityProtectedInputStream.close() was made idempotent, as java.io.Closeable requires, which that depends on, since the stream is genuinely closed twice on the ordinary path and PGPEncryptedData.verify() consumes the digest state behind it and cannot be run a second time. This issue also affects Bouncy Castle for Java LTS before 2.73.13, on the AEAD route only, as that edition does not ship the high-level OpenPGP API the SEIPDv1 route runs through. It also affects Bouncy Castle for Java FIPS (BC-FJA) before bcpg-fips 1.0.14 (1.0.X series), 2.0.14.1 (2.0.X series) and 2.1.14 (2.1.X series), on the AEAD route only, as those editions do not ship the high-level OpenPGP API.

Executive ViewAI

Why It Matters

A flaw in Bouncy Castle for Java's OpenPGP decryption streams allows tampered or truncated encrypted messages to be accepted as valid, meaning recipients can be handed plaintext that was never cryptographically verified as authentic. Any application, service, or pipeline in our estate that relies on this library to verify signed or encrypted OpenPGP data - including partner file exchanges, secure messaging, and package-signing workflows - could act on forged or altered content without detection. Because Bouncy Castle is a widely embedded cryptographic dependency, the exposure is likely broader than any single application team realizes, and the impact is primarily to data integrity and trust in our verification controls rather than to confidentiality or availability.

Business Impact: High
Compensating Controls

Apply vendor patch.

Threat Intelligence Overview

EPSS Score
0.2%
Top 96% exploitable
Prevalence
High
widely used Java crypto library; OpenPGP module common in Java PGP integrations
Data Quality
6 sources
Confidence: High
EUVD NVD CVE.org EPSS Vulnrichment Vendor 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.2%
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
High
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

Attack Technique

Information disclosure occurs when an application unintentionally exposes sensitive data that aids attackers in reconnaissance or directly compromises security.

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