CVE-2026-26007: Verified Reproduction
CVE-2026-26007: pyca/cryptography SECT curve public key parsing lacks subgroup validation, enabling small-subgroup attacks that leak ECDH private key bits and allow ECDSA signature forgery.
CVE-2026-26007 is verified against the affected target. This medium reproduction includes runnable sandbox proof, artifacts, and a plain-text agent view under REPRO-2026-00089.
What Is CVE-2026-26007?
CVE-2026-26007 (GHSA-R6PH-V2QM-Q3C2) is a high-severity vulnerability in pyca/cryptography where SECT curve public key parsing lacks subgroup validation, enabling small-subgroup attacks that leak ECDH private key bits and allow ECDSA signature forgery. Pruva reproduced it (reproduction REPRO-2026-00089).
CVE-2026-26007 Severity & CVSS Score
CVE-2026-26007 is rated medium severity, with a CVSS base score of 6.5 out of 10.
Medium — meaningful risk under specific conditions. Schedule a fix in the normal cycle.
How to Reproduce CVE-2026-26007
pruva-verify REPRO-2026-00089 curl -O https://www.pruva.dev/api/v1/reproductions/REPRO-2026-00089/artifacts/repro/reproduction_steps.sh && chmod +x reproduction_steps.sh && ./reproduction_steps.sh Proof of Reproduction for CVE-2026-26007
Reproduced by Pruva's autonomous agents — 68 tool calls over 7 min. Full root-cause analysis and the complete transcript are below.
How the agent worked
Root Cause and Exploit Chain for CVE-2026-26007
- Affected versions: <= 46.0.4 (per ticket).
- Risk level and consequences: High. Small-subgroup points allow ECDH key leakage (private key mod small subgroup order) and can lead to ECDSA forgery in small subgroups.
Root Cause
The EC public key parsing/building logic relies on OpenSSL EC point construction without enforcing subgroup membership checks for binary SECT curves with nontrivial cofactor. In the Rust key parsing path (cryptography/src/rust/cryptography-key-parsing/src/spki.rs), points are accepted via EcPoint::from_bytes and EcKey::from_public_key without an explicit subgroup validation step. Similarly, EllipticCurvePublicNumbers.public_key() constructs a public key without verifying that the point is in the prime-order subgroup. This allows small-order points (e.g., order-2 point (0,1) on SECT163K1) to be accepted as valid public keys.
Reproduction Steps
- Run
repro/reproduction_steps.sh. - The script installs
cryptography==46.0.4, constructs a small-subgroup SECT163K1 public key at point (0,1), and performs ECDH with private keys 1–4. - Expected evidence: the point is accepted; odd private keys succeed with a constant shared secret, while even private keys fail, revealing private key parity (mod 2).
Evidence
- Log file:
logs/repro_output.txt - Key excerpts:
- "accepted small-subgroup point (0,1) on SECT163K1"
d=1 status=ok ...andd=2 status=err ...demonstrating parity leakage.
- Environment: Python 3 with
cryptography==46.0.4installed by the script.
Recommendations / Next Steps
- Add explicit subgroup membership checks for SECT curves with cofactor > 1 when constructing or loading public keys.
- Reject points not in the prime-order subgroup or perform cofactor multiplication validation.
- Upgrade to a fixed cryptography release once available and add regression tests for small-subgroup points.
Additional Notes
- Idempotent: running
repro/reproduction_steps.shrepeatedly yields the same acceptance/leakage pattern. - Limitation: demonstration focuses on SECT163K1 order-2 subgroup; other SECT curves with higher cofactors are also affected.
CVE-2026-26007 Reproduction Transcript
The agent's step-by-step process — every tool call, every handoff, the moment the exploit fired.
Full session Replay every step — scrub the timeline or play it back.