CVE-2026-18036
NTRU leaks private key information by reducing secret values with a non-constant-time integer division
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
Attack profile
How easy it is to exploit
- Attack vector
- Network
- Complexity
- High
- Privileges needed
- None
- User interaction
- None
What an attacker can affect
- Confidentiality
- High
- Integrity
- None
- Availability
- None
Exploit likelihood
What each source reports
CVE List Score used
8.2
NTRU leaks private key information by reducing secret values with a non-constant-time integer division
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
CVE-2026-18036- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/U:Amber - Weakness
- CWE-208
- Updated
- 2026-11-02
EUVDEUVD-2026-91317
8.2
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
EUVD-2026-91317- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/U:Amber - Updated
- 2026-11-02
GitHub AdvisoriesGHSA-frjj-v5w4-68pc
8.2
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three...
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
GHSA-frjj-v5w4-68pc- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:Amber - Weakness
- CWE-208
- Updated
- 2026-11-02
NVD
8.2
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
CVE-2026-18036- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:Amber - Weakness
- CWE-208
- Updated
- 2026-11-02
OSV
8.2
NTRU leaks private key information by reducing secret values with a non-constant-time integer division
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
CVE-2026-18036- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/U:Amber - Weakness
- CWE-208
- Updated
- 2026-11-04
OSVDEBIAN-CVE-2026-18036
8.2
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
DEBIAN-CVE-2026-18036- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:Amber - Updated
- 2026-11-02
Show 5 moreShow less
OSVUBUNTU-CVE-2026-18036
8.2
In Bouncy Castle for Java before 1.86, NTRU reduced secret values with the % operator in three helpers whose reference implementations are deliberately division-free, so each reduction was carried out by an integer division whose latency depends on the secret operand. Polynomial.modQ divided by a variable divisor, which a compiler cannot strength-reduce to a multiply the way it can a constant one, so it emitted a division on every call including on the decapsulation path where the dividend derives from the private key; Polynomial.mod3 and NTRUSampling.mod3 divided the secret key polynomials f and g during key generation, the message polynomials r and m during encapsulation, and coefficients recovered during decapsulation. An attacker able to measure that timing can recover information about the NTRU private key. modQ now masks, which is exact because q is always a power of two, and mod3 uses the reference implementation's division-free fold and select; the results are unchanged.
- Record
UBUNTU-CVE-2026-18036- CVSS 4.0
- 8.2 High
CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N/U:Amber - Updated
- 2026-11-02
OSVopenSUSE-SU-2026:12090-1 No score
bouncycastle-1.86-1.1 on GA media
These are all security issues fixed in the bouncycastle-1.86-1.1 package on the GA media of openSUSE Tumbleweed.
- Record
openSUSE-SU-2026:12090-1- Updated
- 2026-11-02
OSVopenSUSE-SU-2026:22169-1 No score
Security update for bouncycastle
This update for bouncycastle fixes the following issues:
Update to 1.86:
- CVE-2026-17507: negative signed leaf_index values from unsigned wire encodings can cause heap exhaustion (bsc#1284075).
- CVE-2026-17508: unbounded KDF iteration and memory parameters can cause resource exhaustion (bsc#1284073).
- CVE-2026-18036: variable-time modulo and division operations in NTRU implementation can allow timing side-channel attacks (bsc#1284065).
- CVE-2026-18040: table lookups and variable-time duplicate scanning in HQC can cause cache side-channel leaks (bsc#1284205).
- CVE-2026-71885: unbound X.509 certificates in MLS LeafNode verification can cause identity impersonation and group message interception (bsc#1284165).
- CVE-2026-71886: unvalidated CERTIFY_OTHER flags in OpenPGP subkeys can cause unauthorized trust delegations and identity spoofing (bsc#1284212).
- CVE-2026-71887: missing primary key back-signature validation on subkeys can cause signature misattribution and trust context spoofing (bsc#1284213).
- CVE-2026-71888: disagreement between digestAlgorithm and authAttrs in CMS parsing can cause unauthenticated attribute injection (bsc#1284215).
- CVE-2026-71889: skipped leaf certificate evaluation in checkNameConstraints can cause X.509 name constraint bypasses (bsc#1284218).
- CVE-2026-71890: unbounded Remove proposals in external MLS commits can cause arbitrary group member eviction and session takeover (bsc#1284219).
- CVE-2026-71891: forged ECPoint curves in BLS12-381 key validation can cause aggregate signature verification bypasses (bsc#1284220).
- CVE-2026-71892: type mismatch in CMS key-transport validation can cause key-size enforcement bypasses for HKDF-derived content keys (bsc#1284221).
- CVE-2026-85515: laundered EOF exceptions in OpenPGP message stream processing can cause unregistered truncation errors and integrity check bypasses (bsc#1284222).
- CVE-2026-97873: unbounded iteration counts in legacy PBES1 and PKCS#12 PBE implementations can cause resource exhaustion (bsc#1284224).
- Record
openSUSE-SU-2026:22169-1- Updated
- 2026-11-02
OSVSUSE-SU-2026:24461-1 No score
Security update for bouncycastle
This update for bouncycastle fixes the following issues:
Update to 1.86:
- CVE-2026-17507: negative signed leaf_index values from unsigned wire encodings can cause heap exhaustion (bsc#1284075).
- CVE-2026-17508: unbounded KDF iteration and memory parameters can cause resource exhaustion (bsc#1284073).
- CVE-2026-18036: variable-time modulo and division operations in NTRU implementation can allow timing side-channel attacks (bsc#1284065).
- CVE-2026-18040: table lookups and variable-time duplicate scanning in HQC can cause cache side-channel leaks (bsc#1284205).
- CVE-2026-71885: unbound X.509 certificates in MLS LeafNode verification can cause identity impersonation and group message interception (bsc#1284165).
- CVE-2026-71886: unvalidated CERTIFY_OTHER flags in OpenPGP subkeys can cause unauthorized trust delegations and identity spoofing (bsc#1284212).
- CVE-2026-71887: missing primary key back-signature validation on subkeys can cause signature misattribution and trust context spoofing (bsc#1284213).
- CVE-2026-71888: disagreement between digestAlgorithm and authAttrs in CMS parsing can cause unauthenticated attribute injection (bsc#1284215).
- CVE-2026-71889: skipped leaf certificate evaluation in checkNameConstraints can cause X.509 name constraint bypasses (bsc#1284218).
- CVE-2026-71890: unbounded Remove proposals in external MLS commits can cause arbitrary group member eviction and session takeover (bsc#1284219).
- CVE-2026-71891: forged ECPoint curves in BLS12-381 key validation can cause aggregate signature verification bypasses (bsc#1284220).
- CVE-2026-71892: type mismatch in CMS key-transport validation can cause key-size enforcement bypasses for HKDF-derived content keys (bsc#1284221).
- CVE-2026-85515: laundered EOF exceptions in OpenPGP message stream processing can cause unregistered truncation errors and integrity check bypasses (bsc#1284222).
- CVE-2026-97873: unbounded iteration counts in legacy PBES1 and PKCS#12 PBE implementations can cause resource exhaustion (bsc#1284224).
- Record
SUSE-SU-2026:24461-1- Updated
- 2026-11-04
OSVSUSE-SU-2026:4797-1 No score
Security update for bouncycastle
This update for bouncycastle fixes the following issues:
- CVE-2026-17507: negative signed leaf_index values from unsigned wire encodings can cause heap exhaustion (bsc#1284075).
- CVE-2026-17508: unbounded KDF iteration and memory parameters can cause resource exhaustion (bsc#1284073).
- CVE-2026-18036: variable-time modulo and division operations in NTRU implementation can allow timing side-channel attacks (bsc#1284065).
- CVE-2026-18040: table lookups and variable-time duplicate scanning in HQC can cause cache side-channel leaks (bsc#1284205).
- CVE-2026-71885: unbound X.509 certificates in MLS LeafNode verification can cause identity impersonation and group message interception (bsc#1284165).
- CVE-2026-71886: unvalidated CERTIFY_OTHER flags in OpenPGP subkeys can cause unauthorized trust delegations and identity spoofing (bsc#1284212).
- CVE-2026-71887: missing primary key back-signature validation on subkeys can cause signature misattribution and trust context spoofing (bsc#1284213).
- CVE-2026-71888: disagreement between digestAlgorithm and authAttrs in CMS parsing can cause unauthenticated attribute injection (bsc#1284215).
- CVE-2026-71889: skipped leaf certificate evaluation in checkNameConstraints can cause X.509 name constraint bypasses (bsc#1284218).
- CVE-2026-71890: unbounded Remove proposals in external MLS commits can cause arbitrary group member eviction and session takeover (bsc#1284219).
- CVE-2026-71891: forged ECPoint curves in BLS12-381 key validation can cause aggregate signature verification bypasses (bsc#1284220).
- CVE-2026-71892: type mismatch in CMS key-transport validation can cause key-size enforcement bypasses for HKDF-derived content keys (bsc#1284221).
- CVE-2026-85515: laundered EOF exceptions in OpenPGP message stream processing can cause unregistered truncation errors and integrity check bypasses (bsc#1284222).
- CVE-2026-97873: unbounded iteration counts in legacy PBES1 and PKCS#12 PBE implementations can cause resource exhaustion (bsc#1284224).
Changes for bouncycastle:
- Updated to version 1.86.
- Record
SUSE-SU-2026:4797-1- Updated
- 2026-11-02
Affected products
Affected packages
| Package | Affected | Fixed |
|---|---|---|
bouncycastleDebian:12 |
All versions, plus listed versions 1.72-21.77-11.80-11.80-21.80-31.86-1 |
None known |
bouncycastleDebian:13 |
All versions, plus listed versions 1.80-31.86-1 |
None known |
bouncycastleDebian:14 |
before 1.86-1, plus listed versions 1.80-3 |
1.86-1 |
bouncycastleSUSE:Linux Enterprise Server 16.0 From an advisory covering 14 CVEs |
before 1.86-160000.1.1 | 1.86-160000.1.1 |
bouncycastleSUSE:Linux Enterprise Server for SAP applications 16.0 From an advisory covering 14 CVEs |
before 1.86-160000.1.1 | 1.86-160000.1.1 |
bouncycastleSUSE:Linux Enterprise Module for Development Tools 15 SP7 From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
Show 15 moreShow less
| Package | Affected | Fixed |
|---|---|---|
bouncycastleSUSE:Linux Enterprise Server 15 SP4-LTSS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise Server 15 SP5-LTSS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise Server 15 SP6-LTSS From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise Server for SAP Applications 15 SP4 From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise Server for SAP Applications 15 SP5 From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleSUSE:Linux Enterprise Server for SAP Applications 15 SP6 From an advisory covering 14 CVEs |
before 1.86-150200.3.41.1 | 1.86-150200.3.41.1 |
bouncycastleUbuntu:Pro:16.04:LTS |
All versions, plus listed versions 1.49+dfsg-3ubuntu11.51-4ubuntu11.51-4ubuntu1+esm1 |
None known |
bouncycastleUbuntu:Pro:18.04:LTS |
All versions, plus listed versions 1.57-11.58-11.59-11.59-1ubuntu0.1~esm1 |
None known |
bouncycastleUbuntu:Pro:20.04:LTS |
All versions, plus listed versions 1.61-11.61-1ubuntu0.1~esm1 |
None known |
bouncycastleUbuntu:Pro:22.04:LTS |
All versions, plus listed versions 1.68-21.68-41.68-51.68-5ubuntu0.1~esm1 |
None known |
bouncycastleUbuntu:Pro:24.04:LTS |
All versions, plus listed versions 1.72-21.77-11.77-1ubuntu0.1~esm1 |
None known |
bouncycastleUbuntu:26.10 |
All versions, plus listed versions 1.80-3 |
None known |
bouncycastleUbuntu:26.04:LTS |
All versions, plus listed versions 1.80-3 |
None known |
bouncycastleopenSUSE:Tumbleweed From an advisory covering 14 CVEs |
before 1.86-1.1 | 1.86-1.1 |
bouncycastleopenSUSE:Leap 16.0 From an advisory covering 14 CVEs |
before 1.86-160000.1.1 | 1.86-160000.1.1 |
History
| Recorded | Changed | Sources |
|---|---|---|
| affected | ||
| affected, aliases, facts, references | OSV | |
| first indexed | CVE List, EUVD, GitHub Advisories, NVD, OSV |
Dates are when Every CVE recorded each change. Upstream dates may differ.
In short
CVE-2026-18036 is a high vulnerability (CVSS 8.2) in Legion Of The Bouncy Castle Inc. Bc-java, published October 2, 2026. No source lists public exploit code. EPSS puts the chance of exploitation in the next 30 days at 0.28%, the 20th percentile. Fixed in bouncycastle 1.86-1.
References
github.com/bcgit/bc-java/wiki/CVE%E2%80%902026%E2%80%9018036
github.com/bcgit/bc-java/commit/9c9ad88b6003bb6230d2434bd892cc1e95b294e4
nvd.nist.gov/vuln/detail/CVE-2026-18036
github.com/advisories/GHSA-frjj-v5w4-68pc
bouncycastle.org/download/bouncy-castle-java
github.com/CVEProject/cvelistV5/tree/main/cves/2026/18xxx/CVE-2026-18036.json
Show 34 moreShow less
github.com/bcgit/bc-java
security-tracker.debian.org/tracker/CVE-2026-18036
suse.com/support/update/announcement/2026/suse-su-202624461-1
bugzilla.suse.com/1284065
bugzilla.suse.com/1284073
bugzilla.suse.com/1284075
bugzilla.suse.com/1284165
bugzilla.suse.com/1284205
bugzilla.suse.com/1284212
bugzilla.suse.com/1284213
bugzilla.suse.com/1284215
bugzilla.suse.com/1284218
bugzilla.suse.com/1284219
bugzilla.suse.com/1284220
bugzilla.suse.com/1284221
bugzilla.suse.com/1284222
bugzilla.suse.com/1284224
suse.com/security/cve/CVE-2026-17507
suse.com/security/cve/CVE-2026-17508
suse.com/security/cve/CVE-2026-18036
suse.com/security/cve/CVE-2026-18040
suse.com/security/cve/CVE-2026-71885
suse.com/security/cve/CVE-2026-71886
suse.com/security/cve/CVE-2026-71887
suse.com/security/cve/CVE-2026-71888
suse.com/security/cve/CVE-2026-71889
suse.com/security/cve/CVE-2026-71890
suse.com/security/cve/CVE-2026-71891
suse.com/security/cve/CVE-2026-71892
suse.com/security/cve/CVE-2026-85515
suse.com/security/cve/CVE-2026-97873
suse.com/support/update/announcement/2026/suse-su-20264797-1
ubuntu.com/security/CVE-2026-18036
cve.org/CVERecord?id=CVE-2026-18036