On Mon Mar 30, 2026 at 12:46 AM CEST, Yoann Congal wrote:
> From: Nguyen Dat Tho <[email protected]>
>
> CVE-2026-26007 is fixed upstream in version 46.0.5.
> Our current version (42.0.5, scarthgap) is still reported as vulnerable
> by NVD.
> Backport the upstream fix to address this CVE.
>
> Upstream commit:
>   
> https://github.com/pyca/cryptography/commit/0eebb9dbb6343d9bc1d91e5a2482ed4e054a6d8c
>
> CVE report:
>   https://nvd.nist.gov/vuln/detail/CVE-2026-26007
>
> Signed-off-by: Nguyen Dat Tho <[email protected]>
> Signed-off-by: Yoann Congal <[email protected]>
> ---
>  .../python3-cryptography/CVE-2026-26007.patch | 149 ++++++++++++++++++
>  .../python/python3-cryptography_42.0.5.bb     |   1 +
>  2 files changed, 150 insertions(+)
>  create mode 100644 
> meta/recipes-devtools/python/python3-cryptography/CVE-2026-26007.patch
>
> diff --git 
> a/meta/recipes-devtools/python/python3-cryptography/CVE-2026-26007.patch 
> b/meta/recipes-devtools/python/python3-cryptography/CVE-2026-26007.patch
> new file mode 100644
> index 00000000000..a78d287ccdd
> --- /dev/null
> +++ b/meta/recipes-devtools/python/python3-cryptography/CVE-2026-26007.patch
> @@ -0,0 +1,149 @@
> +From 42c914929b52eb16421a4ef1f7e09c8f9fdab7db Mon Sep 17 00:00:00 2001
> +From: Paul Kehrer <[email protected]>
> +Date: Wed, 18 Mar 2026 16:01:03 +0900
> +Subject: [PATCH] EC check key on cofactor > 1
> +
> +An attacker could create a malicious public key that reveals portions of
> +your private key when using certain uncommon elliptic curves (binary
> +curves).  This version now includes additional security checks to
> +prevent this attack.  This issue only affects binary elliptic curves,
> +which are rarely used in real-world applications. Credit to **XlabAI
> +Team of Tencent Xuanwu Lab and Atuin Automated Vulnerability Discovery
> +Engine** for reporting the issue.  **CVE-2026-26007**
> +
> +This is a partial backport of upstream commit
> +0eebb9dbb6343d9bc1d91e5a2482ed4e054a6d8c, to only include what's
> +relevant for CVE-2026-26007.
> +
> +CVE: CVE-2026-26007
> +
> +Origin: backport, 
> https://github.com/pyca/cryptography/commit/0eebb9dbb6343d9bc1d91e5a2482ed4e054a6d8c
> +Reference: 
> https://salsa.debian.org/python-team/packages/python-cryptography/-/commit/464e7ca3b0b4493d5906d0c3685de71fda770c59
> +
> +Signed-off-by: Nguyen Dat Tho <[email protected]>
> +Signed-off-by: Paul Kehrer <[email protected]>
> +Co-authored-by: Alex Gaynor <[email protected]>
> +---
> +Upstream-Status: Backport [Backport from 
> https://github.com/pyca/cryptography/commit/0eebb9dbb6343d9bc1d91e5a2482ed4e054a6d8c]

Tho, (I hope this is the proper way to address you, if not, sorry!)

This "Upstream-Status:" after the "---" triggers a patchtest failure:
  FAIL: test Upstream-Status presence: Upstream-Status is present only
  after the patch scissors. It must be placed in the patch header before
  the scissors line.
  (test_patch.TestPatch.test_upstream_status_presence_format)

This is very minor for stables where a patch rebase following an upgrade
is a very rare event.
But, that said, if you can send a v2 patch with the "Upstream-Status"
above the "---", I'll take it.

As a side note: this particular patchtest test is not in scarthgap
patchtech, I'll try to backport it.

Thanks!

> +
> + src/rust/src/backend/ec.rs         | 39 ++++++++++++++++++++----------
> + tests/hazmat/primitives/test_ec.py | 37 ++++++++++++++++++++++++++++
> + 2 files changed, 63 insertions(+), 13 deletions(-)
> +
> +diff --git a/src/rust/src/backend/ec.rs b/src/rust/src/backend/ec.rs
> +index 6a224b49f..27fced086 100644
> +--- a/src/rust/src/backend/ec.rs
> ++++ b/src/rust/src/backend/ec.rs
> +@@ -155,12 +155,9 @@ pub(crate) fn public_key_from_pkey(
> + ) -> CryptographyResult<ECPublicKey> {
> +     let ec = pkey.ec_key()?;
> +     let curve = py_curve_from_curve(py, ec.group())?;
> +-    check_key_infinity(&ec)?;
> +-    Ok(ECPublicKey {
> +-        pkey: pkey.to_owned(),
> +-        curve: curve.into(),
> +-    })
> ++    ECPublicKey::new(pkey.to_owned(), curve.into())
> + }
> ++
> + #[pyo3::prelude::pyfunction]
> + fn generate_private_key(
> +     py: pyo3::Python<'_>,
> +@@ -215,10 +212,7 @@ fn from_public_bytes(
> +     let ec = openssl::ec::EcKey::from_public_key(&curve, &point)?;
> +     let pkey = openssl::pkey::PKey::from_ec_key(ec)?;
> + 
> +-    Ok(ECPublicKey {
> +-        pkey,
> +-        curve: py_curve.into(),
> +-    })
> ++    ECPublicKey::new(pkey, py_curve.into())
> + }
> + 
> + #[pyo3::prelude::pymethods]
> +@@ -357,6 +351,28 @@ impl ECPrivateKey {
> +     }
> + }
> + 
> ++impl ECPublicKey {
> ++    fn new(
> ++        pkey: openssl::pkey::PKey<openssl::pkey::Public>,
> ++        curve: pyo3::Py<pyo3::PyAny>,
> ++    ) -> CryptographyResult<ECPublicKey> {
> ++        let ec = pkey.ec_key()?;
> ++        check_key_infinity(&ec)?;
> ++        let mut bn_ctx = openssl::bn::BigNumContext::new()?;
> ++        let mut cofactor = openssl::bn::BigNum::new()?;
> ++        ec.group().cofactor(&mut cofactor, &mut bn_ctx)?;
> ++        let one = openssl::bn::BigNum::from_u32(1)?;
> ++        if cofactor != one {
> ++            ec.check_key().map_err(|_| {
> ++                pyo3::exceptions::PyValueError::new_err(
> ++                    "Invalid EC key (key out of range, infinity, etc.)",
> ++                )
> ++            })?;
> ++        }
> ++
> ++        Ok(ECPublicKey { pkey, curve })
> ++    }
> ++}
> + #[pyo3::prelude::pymethods]
> + impl ECPublicKey {
> +     #[getter]
> +@@ -591,10 +607,7 @@ impl EllipticCurvePublicNumbers {
> + 
> +         let pkey = openssl::pkey::PKey::from_ec_key(public_key)?;
> + 
> +-        Ok(ECPublicKey {
> +-            pkey,
> +-            curve: self.curve.clone_ref(py),
> +-        })
> ++        ECPublicKey::new(pkey, self.curve.clone_ref(py))
> +     }
> + 
> +     fn __eq__(
> +diff --git a/tests/hazmat/primitives/test_ec.py 
> b/tests/hazmat/primitives/test_ec.py
> +index 334e76dcc..f7f2242f6 100644
> +--- a/tests/hazmat/primitives/test_ec.py
> ++++ b/tests/hazmat/primitives/test_ec.py
> +@@ -1340,3 +1340,40 @@ class TestECDH:
> + 
> +         with pytest.raises(ValueError):
> +             key.exchange(ec.ECDH(), public_key)
> ++
> ++
> ++def test_invalid_sect_public_keys(backend):
> ++    _skip_curve_unsupported(backend, ec.SECT571K1())
> ++    public_numbers = ec.EllipticCurvePublicNumbers(1, 1, ec.SECT571K1())
> ++    with pytest.raises(ValueError):
> ++        public_numbers.public_key()
> ++
> ++    point = binascii.unhexlify(
> ++        
> b"0400000000000000000000000000000000000000000000000000000000000000000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000000000"
> ++        
> b"0000000000010000000000000000000000000000000000000000000000000000000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000000000"
> ++        b"0000000000000000000001"
> ++    )
> ++    with pytest.raises(ValueError):
> ++        ec.EllipticCurvePublicKey.from_encoded_point(ec.SECT571K1(), point)
> ++
> ++    der = binascii.unhexlify(
> ++        
> b"3081a7301006072a8648ce3d020106052b810400260381920004000000000000000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000000000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000100000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000000000"
> ++        
> b"0000000000000000000000000000000000000000000000000000000000000000000"
> ++        b"00001"
> ++    )
> ++    with pytest.raises(ValueError):
> ++        serialization.load_der_public_key(der)
> ++
> ++    pem = textwrap.dedent("""-----BEGIN PUBLIC KEY-----
> ++    MIGnMBAGByqGSM49AgEGBSuBBAAmA4GSAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> ++    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> ++    AAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
> ++    AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAE=
> ++    -----END PUBLIC KEY-----""").encode()
> ++    with pytest.raises(ValueError):
> ++        serialization.load_pem_public_key(pem)
> diff --git a/meta/recipes-devtools/python/python3-cryptography_42.0.5.bb 
> b/meta/recipes-devtools/python/python3-cryptography_42.0.5.bb
> index 732f925d926..c4573fa6891 100644
> --- a/meta/recipes-devtools/python/python3-cryptography_42.0.5.bb
> +++ b/meta/recipes-devtools/python/python3-cryptography_42.0.5.bb
> @@ -11,6 +11,7 @@ LDSHARED += "-pthread"
>  SRC_URI[sha256sum] = 
> "6fe07eec95dfd477eb9530aef5bead34fec819b3aaf6c5bd6d20565da607bfe1"
>  
>  SRC_URI += "file://0001-pyproject.toml-remove-benchmark-disable-option.patch 
> \
> +            file://CVE-2026-26007.patch \
>              file://check-memfree.py \
>              file://run-ptest \
>             "


-- 
Yoann Congal
Smile ECS

-=-=-=-=-=-=-=-=-=-=-=-
Links: You receive all messages sent to this group.
View/Reply Online (#234202): 
https://lists.openembedded.org/g/openembedded-core/message/234202
Mute This Topic: https://lists.openembedded.org/mt/118570975/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-core/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to