Skip to content

Merge pull request #81 from brave-intl/renovate/github-codeql-action-3-x #46

Merge pull request #81 from brave-intl/renovate/github-codeql-action-3-x

Merge pull request #81 from brave-intl/renovate/github-codeql-action-3-x #46

GitHub Actions / Security audit failed May 27, 2025 in 1s

Security advisories found

1 advisory(ies), 1 unmaintained

Details

Vulnerabilities

RUSTSEC-2024-0344

Timing variability in curve25519-dalek's Scalar29::sub/Scalar52::sub

Details
Package curve25519-dalek
Version 3.2.1
URL dalek-cryptography/curve25519-dalek#659
Date 2024-06-18
Patched versions >=4.1.3

Timing variability of any kind is problematic when working with potentially secret values such as
elliptic curve scalars, and such issues can potentially leak private keys and other secrets. Such a
problem was recently discovered in curve25519-dalek.

The Scalar29::sub (32-bit) and Scalar52::sub (64-bit) functions contained usage of a mask value
inside a loop where LLVM saw an opportunity to insert a branch instruction (jns on x86) to
conditionally bypass this code section when the mask value is set to zero as can be seen in godbolt:

A similar problem was recently discovered in the Kyber reference implementation:

<https://groups.google.com/a/list.nist.gov/g/pqc-forum/c/hqbtIGFKIpU/m/cnE3pbueBgAJ>

As discussed on that thread, one portable solution, which is also used in this PR, is to introduce a
volatile read as an optimization barrier, which prevents the compiler from optimizing it away.

The fix can be validated in godbolt here:

The problem was discovered and the solution independently verified by
Alexander Wagner <[email protected]> and Lea Themint <[email protected]> using
their DATA tool:

<https://github.com/Fraunhofer-AISEC/DATA>

Warnings

RUSTSEC-2023-0081

safemem is unmaintained

Details
Status unmaintained
Package safemem
Version 0.3.3
URL https://github.com/abonander/safemem
Date 2023-02-14

The latest crates.io release was in 2019. The repository has been archived by the author.

Migration

  • safemem::copy_over(slice, src_idx, dest_idx, len); can be replaced with slice.copy_within(src_idx..src_idx+len, dest_idx); as of rust 1.37.0.

  • safemem::write_bytes(slice, byte); can be replaced with slice.fill(byte); as of rust 1.50.0

  • safemem::prepend(slice, vec); can be replaced with

    let old_len = vec.len();
    vec.extend_from_slice(slice);
    vec.rotate_left(old_len);

    as of rust 1.26.0