CVE-2024-48949
NoneCVSS
—
EPSS
0.5%
Published
Oct 10, 2024
CISA due date
—
Cloudanix analysis
Some applications may accept tampered versions of otherwise valid digital signatures, which can let attackers bypass checks that depend on signatures being unique.
- Exploitation
- Remote Unauthenticated
- Attacker needs
- None
- Complexity
- Moderate
- Impact
- Data Tampering
- Component
- Library
- Class
- Cryptographic Weakness
- Remediation
- Upgrade
- Effort
- Low
- Patch risk
- Low
What it actually does
The flaw is in the EdDSA signature verification logic of the Node.js elliptic package before 6.5.6. The verifier fails to reject signatures whose S component is negative or greater than or equal to the curve order. Because EdDSA scalar operations are normally reduced modulo the curve order, a non-canonical signature can be accepted even though it violates the required encoding rules. The most likely technical impact is signature malleability: an attacker who has a valid signature may be able to produce alternate encodings of that signature that still verify. In systems that rely on exact signature bytes for uniqueness, replay prevention, transaction identifiers, authorization tokens, or audit integrity, this can undermine those controls. This is not generally equivalent to recovering private keys or forging arbitrary signatures without first having a valid signature/message pair.
Why it matters to the business
Applications that use vulnerable versions of elliptic for EdDSA verification may accept malformed but valid-looking signatures. This can create operational risk where signatures are used for payments, signed messages, software update metadata, API authentication, blockchain-style transaction identity, non-repudiation, or deduplication. The current public exploitation signal is low: it is not in the CISA Known Exploited Vulnerabilities catalog, is not known to be used in ransomware campaigns, has low EPSS, and no exploit maturity is reported. However, because cryptographic libraries are often embedded transitively in many JavaScript applications, exposure may be hidden inside dependencies and should be remediated through dependency updates rather than dismissed.
How an attack unfolds
An attacker first identifies an application or protocol path that verifies EdDSA signatures using a vulnerable version of the elliptic package. The attacker obtains or observes a legitimate signed message, token, request, transaction, or artifact. Instead of creating a new signature from the private key, the attacker alters the S component of the existing signature into a non-canonical value, such as by adding the curve order, while preserving a value that reduces to the same scalar during verification. Because the vulnerable verifier does not enforce that S is non-negative and less than the curve order, the modified signature may still be accepted. The attacker then submits the altered signed object to bypass controls that assume a signature has one canonical byte representation, such as duplicate detection, replay prevention, transaction-hash calculation, signature allowlists, or audit correlation.
How to fix it
Upgrade the elliptic package to a fixed release. The vulnerability is fixed in elliptic 6.5.6 and in the upstream Git repository at commit 7ac5360118f74eb02da73bdf9f24fd0c72ff5281. For npm-based projects, update direct and transitive dependencies, regenerate lockfiles, and rebuild/redeploy affected applications. Where exact dependency control is required, pin elliptic to a fixed version or use package manager overrides/resolutions to force all transitive consumers to use the fixed release. If immediate upgrade is not possible, add compensating validation before calling the vulnerable verifier or at the signature ingestion boundary: reject EdDSA signatures whose S component is negative, not canonically encoded, or greater than or equal to the curve order. Also avoid relying on raw signature bytes as unique identifiers; derive identity from canonicalized message content and strict verification results.
How to confirm the fix worked
Confirm all deployed dependency trees use elliptic 6.5.6 or later, or contain the upstream fix commit 7ac5360118f74eb02da73bdf9f24fd0c72ff5281 if using a Git-sourced package. Run package inventory commands such as npm ls elliptic, yarn why elliptic, pnpm why elliptic, and software composition analysis tooling against source repositories, build artifacts, and container images. Inspect package-lock.json, yarn.lock, pnpm-lock.yaml, and bundled node_modules directories for elliptic versions older than 6.5.6. As a functional validation, add a negative test using an EdDSA signature with a non-canonical S value that previously verified; the fixed implementation should reject it. Verify production builds are rebuilt after dependency updates rather than only updating source manifests.
Typical attack path
- Find an application, service, API, wallet, protocol implementation, or verification workflow that uses elliptic EdDSA verification from a vulnerable package version.
- Obtain a legitimate message and its corresponding EdDSA signature, for example through normal user access, public transaction data, logs, intercepted traffic, or a previously issued token.
- Parse the signature and modify the S component into a non-canonical value that should be rejected by a strict EdDSA implementation.
- Submit the altered signed object to the target verifier.
- Rely on the vulnerable verifier accepting the malformed signature as valid.
- Abuse any downstream logic that treats the altered signature bytes as a distinct object, transaction, token, or authorization event.
How to detect it
There are no universal host, process, file, registry, or network indicators that prove exploitation because the issue is a cryptographic validation weakness inside application logic. Detection requires application-specific review of signed objects and verification workflows. Search application, API gateway, authentication, transaction, and message-processing logs for repeated submissions of the same message, request body, token payload, transaction payload, or artifact hash with different EdDSA signature byte strings. Where raw signatures are logged or retained, decode EdDSA signatures and flag any with an S component that is negative, non-canonically encoded, or greater than or equal to the curve order. Compare acceptance behavior between the vulnerable verifier and a strict EdDSA implementation; any historical object accepted only by the vulnerable implementation should be investigated. For exposed services, look for bursts of signature verification failures followed by successful submissions of semantically identical messages, which may indicate probing. In forensic analysis, identify vulnerable deployments by searching dependency manifests and deployed artifacts for elliptic versions before 6.5.6, then correlate their runtime logs with duplicate-message/different-signature patterns.
What your security team should do
- Inventory all JavaScript and Node.js applications, libraries, serverless functions, containers, and build artifacts for elliptic versions before 6.5.6, including transitive dependencies.
- Prioritize remediation for systems that verify EdDSA signatures for authentication, authorization, financial transactions, signed messages, software updates, blockchain or ledger workflows, or replay prevention.
- Upgrade elliptic to 6.5.6 or later, or ensure the upstream fix commit 7ac5360118f74eb02da73bdf9f24fd0c72ff5281 is present in Git-based dependencies.
- Use package manager overrides or resolutions to eliminate vulnerable transitive copies and verify lockfiles are updated.
- Add regression tests that reject non-canonical EdDSA signatures, especially S values greater than or equal to the curve order.
- Review application logic that uses signature bytes as identifiers, cache keys, transaction IDs, or deduplication keys; migrate to canonical representations where needed.
- Monitor for unusual repeated submissions of the same logical message with different signature byte strings, even though broad exploitation is not currently reported.
The record
The verify function in lib/elliptic/eddsa/index.js in the Elliptic package before 6.5.6 for Node.js omits "sig.S().gte(sig.eddsa.curve.n) || sig.S().isNeg()" validation.
Affected packages
| Ecosystem | Package | Introduced | Fixed |
|---|---|---|---|
| npm | elliptic | 0 | 6.5.6 |
| Debian:11 | node-elliptic | 0 | No fix |
| Debian:12 | node-elliptic | 0 | No fix |
| Debian:13 | node-elliptic | 0 | 6.5.7+dfsg-1 |
| Mageia:9 | yarnpkg | 0 | 1.22.22-0.10.9.2.1.mga9 |
| Red Hat:rhel_aus:8.2::appstream | grafana | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-azure-monitor | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-cloudwatch | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-debuginfo | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-elasticsearch | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-graphite | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-influxdb | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-loki | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-mssql | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-mysql | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-opentsdb | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-postgres | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-prometheus | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.2::appstream | grafana-stackdriver | 0 | 0:6.3.6-6.el8_2 |
| Red Hat:rhel_aus:8.4::appstream | grafana | 0 | 0:7.3.6-8.el8_4 |
| Red Hat:rhel_aus:8.4::appstream | grafana-debuginfo | 0 | 0:7.3.6-8.el8_4 |
| Red Hat:rhel_e4s:8.4::appstream | grafana | 0 | 0:7.3.6-8.el8_4 |
| Red Hat:rhel_e4s:8.4::appstream | grafana-debuginfo | 0 | 0:7.3.6-8.el8_4 |
| Red Hat:rhel_tus:8.4::appstream | grafana | 0 | 0:7.3.6-8.el8_4 |
| Red Hat:rhel_tus:8.4::appstream | grafana-debuginfo | 0 | 0:7.3.6-8.el8_4 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-ESPOS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP4-LTSS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-ESPOS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise High Performance Computing 15 SP5-LTSS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Module for Package Hub 15 SP6 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP4 | aws-cli | 0 | 1.33.26-150400.34.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP4 | python-boto3 | 0 | 1.34.138-150400.27.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP4 | python-botocore | 0 | 1.34.144-150400.41.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP5 | aws-cli | 0 | 1.33.26-150400.34.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP5 | python-boto3 | 0 | 1.34.138-150400.27.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP5 | python-botocore | 0 | 1.34.144-150400.41.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP6 | aws-cli | 0 | 1.33.26-150400.34.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP6 | python-boto3 | 0 | 1.34.138-150400.27.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP6 | python-botocore | 0 | 1.34.144-150400.41.7.1 |
| SUSE:Linux Enterprise Module for Public Cloud 15 SP7 | aws-cli | 0 | 1.33.26-150400.34.7.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | pgadmin4 | 0 | 8.5-150600.3.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP6 | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-boto3 | 0 | 1.34.138-150400.27.7.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-botocore | 0 | 1.34.144-150400.41.7.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Module for Python 3 15 SP7 | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Server 15 SP4-LTSS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Server 15 SP5-LTSS | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP4 | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| SUSE:Linux Enterprise Server for SAP Applications 15 SP5 | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| Ubuntu:18.04:LTS | node-elliptic | 0 | No fix |
| Ubuntu:20.04:LTS | node-elliptic | 0 | No fix |
| Ubuntu:22.04:LTS | node-elliptic | 0 | No fix |
| Ubuntu:24.04:LTS | node-elliptic | 0 | No fix |
| Ubuntu:24.10 | node-elliptic | 0 | No fix |
| Ubuntu:Pro:18.04:LTS | node-elliptic | 0 | No fix |
| Ubuntu:Pro:20.04:LTS | node-elliptic | 0 | No fix |
| openSUSE:Leap 15.6 | aws-cli | 0 | 1.33.26-150400.34.7.1 |
| openSUSE:Leap 15.6 | pgadmin4 | 0 | 8.5-150600.3.6.1 |
| openSUSE:Leap 15.6 | python-boto3 | 0 | 1.34.138-150400.27.7.1 |
| openSUSE:Leap 15.6 | python-botocore | 0 | 1.34.144-150400.41.7.1 |
| openSUSE:Leap 15.6 | python-coverage | 0 | 7.6.10-150400.12.6.1 |
| openSUSE:Leap 15.6 | python-flaky | 0 | 3.8.1-150400.14.6.1 |
| openSUSE:Leap 15.6 | python-pluggy | 0 | 1.5.0-150400.14.10.1 |
| openSUSE:Leap 15.6 | python-pytest | 0 | 8.3.5-150400.3.9.1 |
| openSUSE:Leap 15.6 | python-pytest-cov | 0 | 6.2.1-150400.12.6.1 |
| openSUSE:Leap 15.6 | python-pytest-mock | 0 | 3.14.0-150400.13.6.1 |
| openSUSE:Tumbleweed | python-pytest-html | 0 | 4.1.1-2.1 |
| openSUSE:Tumbleweed | velociraptor | 0 | 0.7.0.4.git142.862ef23-1.1 |
Related vulnerabilities
- GHSA-848j-6mx2-7j84 Elliptic Uses a Cryptographic Primitive with a Risky Implementation Also affects elliptic
- CVE-2025-14505 The ECDSA implementation of the Elliptic package generates incorrect signatures if an… Also affects elliptic
- GHSA-vjh7-7g9h-fjfh Elliptic's private key extraction in ECDSA upon signing a malformed input (e.g. a string) Also affects elliptic
- CVE-2024-48948 The Elliptic package 6.5.7 for Node.js, in its for ECDSA implementation, does not… Also affects elliptic
- CVE-2024-42460 In the Elliptic package 6.5.6 for Node.js, ECDSA signature malleability occurs because… Also affects elliptic
- CVE-2024-42459 In the Elliptic package 6.5.6 for Node.js, EDDSA signature malleability occurs because… Also affects elliptic
- CVE-2025-48387 tar-fs provides filesystem bindings for tar-stream. Also affects yarnpkg
- CVE-2024-12905 An Improper Link Resolution Before File Access ("Link Following") and Improper Limitation… Also affects yarnpkg