CVE-2026-23519 is a flaw in the RustCrypto cmov crate, scored 9.8 in the record. On the thumbv6m-none-eabi target, covering Cortex M0, M0+ and M1 chips, the compiler can emit non constant time code for cmovnz. The fixed version is cmov 0.4.4, and affected firmware must be rebuilt.
What's affected
The cmov crate before 0.4.4 is affected, and only when built for thumbv6m-none-eabi, which is the target for Cortex M0, M0+ and M1 microcontrollers. The fix is 0.4.4.
The advisory says its author did not find another target with the same behavior, but also did not check every target Rust supports. So the only confirmed affected build is the Cortex M0 family.
This matters for embedded and firmware developers. A server or desktop build of a project using cmov is not described as affected.
How to check if you're exposed
Find out whether cmov is in your dependency tree and what version it resolves to:
cargo tree -i cmov
cargo tree | grep cmov
Then check your build targets. If you build for thumbv6m-none-eabi, you are in scope. Your Cargo configuration or CI scripts show the target triple. Remember that cmov often arrives through other crates, so use the inverse tree command to see which crate pulls it in.
What to do now
- Run
cargo update -p cmovto move to 0.4.4 or later, and commit the updated lockfile. - Rebuild and re-flash firmware for every thumbv6m-none-eabi product, since the issue is in compiled output.
- If cmov comes in through another crate, update that crate or add a dependency override.
- Review which secrets are handled by the affected code paths, to judge whether timing could expose them.
Why it matters
The record lists CWE-203 (Observable Discrepancy) and CWE-208 (Observable Timing Discrepancy). Cryptographic code is meant to take the same time whatever the secret values are. When it does not, an observer who can measure timing may learn something about the secret. The cmov crate exists to provide conditional moves that the compiler cannot turn back into branches.
On this target, an optimization pass spotted a value that could be read as a boolean and turned the masking into a conditional branch. The source code looks fine, which is why this class of bug is hard to see. Only the compiled output shows it. The advisory describes a non constant time result, not remote code execution, and the 9.8 score in the record should be read with that in mind: exposure depends on whether an attacker can measure timing of your device. The record does not mark this CVE as exploited in the wild.
Quick check
Is this a remote code execution bug?
No. The advisory describes non constant time assembly, a side channel weakness.
Do I need to rebuild?
Yes. The problem is in compiled output, so a new build with the fixed crate is needed.
Sources
Last reviewed: 19 October 2026.