{"id":"RUSTSEC-2026-0290","summary":"pqc_kyber: AVX2 backend skips Fujisaki-Okamoto implicit rejection, enabling chosen-ciphertext key recovery","details":"## Summary\n\nWhen `pqc_kyber` is built with the opt-in `avx2` feature on x86_64, its\nconstant-time conditional-move routine `cmov` is a no-op: it never performs the\ncopy. That `cmov` is exactly the step that applies the Fujisaki-Okamoto (FO)\nimplicit rejection during decapsulation. With it disabled, decapsulating an\n*invalid* ciphertext no longer returns a key-independent pseudorandom value;\nit returns a value that depends on the decrypted plaintext of the\nattacker-chosen ciphertext. This restores the chosen-ciphertext decryption\noracle that the FO transform exists to remove, and yields full recovery of the\nstatic secret key.\n\nThe attack requires no timing measurement, no side channel, and no faults; only\nthe ability to submit ciphertexts to a decapsulation operation under a reused\nkey pair and observe the resulting shared secret. See the linked pull request\nfor the root cause, the reachable call path, and reproduction details.\n\n## Affected configuration\n\nReachable only in builds with `features = [\"avx2\"]` on an x86_64 target. The\ndefault (reference) backend and all non-x86_64 targets are unaffected.\n\n## Impact\n\nComplete IND-CCA break. The plaintext-checking oracle drives a standard\nchosen-ciphertext key-recovery attack and extracts the entire static secret\nkey. Any protocol reusing a Kyber key pair across decapsulations (static or\nlong-term KEM keys, KEMTLS, HPKE recipients, pinned keys) is exposed;\nephemeral-only key shares are not. The defect was verified end to end on\nML-KEM-768: the full secret key was recovered in 4,272 decapsulation queries.\n\n## Maintenance status\n\nThe crate is unmaintained (last release 0.7.1, August 2023); no patched version\nexists or is expected.\n\n## Mitigation\n\n- If remaining on this crate, do not enable the `avx2` feature; the default\n  reference backend performs implicit rejection correctly.\n- Do not reuse a Kyber key pair across decapsulations.\n\n## Credit\n\nReported by 007bsd.","modified":"2026-09-18T09:15:05.128982400Z","published":"2026-08-16T12:00:00Z","database_specific":{"license":"CC0-1.0"},"references":[{"type":"PACKAGE","url":"https://crates.io/crates/pqc_kyber"},{"type":"ADVISORY","url":"https://rustsec.org/advisories/RUSTSEC-2026-0290.html"},{"type":"WEB","url":"https://github.com/Argyle-Software/kyber/pull/121"}],"affected":[{"package":{"name":"pqc_kyber","ecosystem":"crates.io","purl":"pkg:cargo/pqc_kyber"},"ranges":[{"type":"SEMVER","events":[{"introduced":"0.0.0-0"}]}],"ecosystem_specific":{"affected_functions":null,"affects":{"os":[],"functions":[],"arch":[]}},"database_specific":{"cvss":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N","informational":null,"categories":["crypto-failure"],"source":"https://github.com/rustsec/advisory-db/blob/osv/crates/RUSTSEC-2026-0290.json"}}],"schema_version":"1.9.0","severity":[{"type":"CVSS_V3","score":"CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:N"}]}