☠️
EXFILTRATING
DATA...
01010111 10110010 00101001 11000110 01101100 10011011 00010001 11100101 01000010 10101111
[ <-- BACK_TO_SEARCH ]

CVE-2025-54426

CVE-2025-54426 Security Advisory in Polkadot
📅 PUBLISHED: 2025-07-28 20:08 UTC 🔄 UPDATED: 2026-10-08 19:48 UTC
[ PATCH UNDER REVIEW ↓ ] Remains UNDER REVIEW until an independent source confirms the fix
[ DEFENSE PATCH ↓ ]
💣 PoC: None
👁️
Proof of Concept - Indicates if functional exploit code is publicly available, drastically increasing the risk of immediate attacks.
🎯 EPSS: 0.32%
👁️
0.32% probability
8.1× above the median CVE
Tier: ELEVATED
30-day exploitation window · FIRST.org · updated daily
VULNERABLE: version not auto-detected — verify your deployed version locally
CVSS SEVERITY SCALE
9.0–10.0 CRITICAL
7.0–8.9 HIGH
4.0–6.9 MEDIUM
0.1–3.9 LOW
0.0 NONE
9.9
THREAT LEVEL
■ tracking this CVE ✓ independent patch confirmation ⧗ same-origin mirror (GHSA) ⚠ active exploitation verification policy →

Executive Summary

CVE-2025-54426 is a vulnerability in the Polkadot Frontier project, which provides an Ethereum and EVM compatibility layer for Polkadot and Substrate. The flaw resides in the Curve25519Add and Curve25519ScalarMul precompiles. These functions incorrectly handle invalid Ristretto point representations. Instead of returning an error when given malformed input bytes, they silently treat the invalid data as the Ristretto identity element. This can lead to incorrect cryptographic computations, potentially undermining the security of applications relying on these precompiles for operations like zero-knowledge proofs or privacy-preserving transactions.

The vulnerability has a CVSS score of 0.0, indicating that it has not been officially scored by NVD. However, the cryptographic nature of the flaw suggests a high potential impact on integrity and correctness of operations. No public proof-of-concept or exploit code is available at this time.

⚡ AUTOMATE YOUR CVE INTELLIGENCE

This record — and 170,000+ others — are available via the ValtersIT API. One endpoint replaces five: NVD + GitHub CVE + CISA KEV + EPSS + Nuclei + Exploit-DB, unified.

›Patch confidence — UNVERIFIED to CONFIRMED, cross-referenced NVD + RHSA + Debian
›Exploit & PoC — poc_status, poc_url, has_exploit. Not in NVD.
›Shodan dorks — ready-made queries to find exposed vulnerable systems
›Detection rules — YARA · Wazuh · Elastic (all plans) · Sigma (Pro)
›pending_fields — know exactly which of 7 fields NVD hasn't processed yet
›Free backfill — data incomplete when you paid? Re-check within 30 days = 0 credits
PAYG €0.08/lookup Standard €19/mo (was €29) · 5k credits Pro €65/mo (was €99) · 20k credits FOUNDING PRICE · LOCKED FOR LIFE · ENDS 31 DEC 2026
[ FROM €19/MO ]
Free sandbox key available
No signup required

Supply Chain & Package Security

This vulnerability affects the Polkadot Frontier project, which is a Rust-based component integrated into the Substrate framework. It is not distributed via NPM, PyPI, Go, or Ruby registries. The project is typically compiled from source or included as a dependency in Rust projects via Cargo. Users should verify their dependency tree and ensure they are using a version that includes the fix (commit 36f70d1 or later).

CVSS Breakdown & Threat Level

The CVSS score is currently 0.0 (UNKNOWN). Based on the vulnerability description, a reasonable assessment would be:

  • Attack Vector (AV): Network (N) – The precompiles are accessible via RPC calls.
  • Attack Complexity (AC): Low (L) – Sending malformed input is straightforward.
  • Privileges Required (PR): None (N) – No authentication needed.
  • User Interaction (UI): None (N) – No user action required.
  • Scope (S): Unchanged (U) – The vulnerability affects the precompile execution context.
  • Confidentiality (C): None (N) – No direct data disclosure.
  • Integrity (I): High (H) – Incorrect cryptographic results can break protocol guarantees.
  • Availability (A): Low (L) – Could lead to denial of service if exploited repeatedly.

Estimated CVSS Vector: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:L
Estimated Score: 7.5 (High)

Threat Level: High – The vulnerability can be exploited remotely without authentication, leading to incorrect cryptographic operations that may compromise the security of higher-level protocols.

Deep Dive & Mechanics

The Ristretto group is a prime-order group built on top of Curve25519, designed for use in cryptographic protocols like zero-knowledge proofs and confidential transactions. The Curve25519Add and Curve25519ScalarMul precompiles in Polkadot Frontier implement point addition and scalar multiplication on the Ristretto group.

The vulnerability arises from improper input validation. When a user provides bytes that do not represent a valid Ristretto point (e.g., malformed encoding or a point not in the group), the precompile should return an error. Instead, the code silently maps the invalid input to the identity element (point at infinity). This behavior can be exploited in several ways:

  1. Bypassing Cryptographic Checks: If a protocol relies on the precompile to verify that a point is non-identity, an attacker can provide invalid input that is treated as identity, bypassing the check.
  2. Denial of Service: Repeated calls with invalid input could cause unexpected behavior in downstream logic.
  3. Protocol Manipulation: In multi-party computations, an attacker could submit invalid points to alter the final result.

The root cause is a missing or incorrect validation step in the decoding of Ristretto point bytes. The fix in commit 36f70d1 likely adds proper error handling to reject invalid encodings.

Vulnerable vs. Patched Code

The following is a conceptual comparison based on the vulnerability description. Actual code may differ.

Vulnerable Code (pseudo-Rust):

fn curve25519_add(input: &[u8]) -> Result<Vec<u8>, Error> {
    let point_a = RistrettoPoint::from_bytes(input[..32].try_into().unwrap());
    let point_b = RistrettoPoint::from_bytes(input[32..].try_into().unwrap());
    // Missing: check if either point is invalid
    let result = point_a + point_b;
    Ok(result.compress().to_bytes().to_vec())
}

Patched Code (pseudo-Rust):

fn curve25519_add(input: &[u8]) -> Result<Vec<u8>, Error> {
    let point_a = RistrettoPoint::from_bytes(input[..32].try_into().unwrap());
    let point_b = RistrettoPoint::from_bytes(input[32..].try_into().unwrap());
    // Added validation
    if point_a.is_none() || point_b.is_none() {
        return Err(Error::InvalidPoint);
    }
    let result = point_a.unwrap() + point_b.unwrap();
    Ok(result.compress().to_bytes().to_vec())
}

The key difference is the addition of a check that returns an error if the input bytes do not represent a valid Ristretto point.

Exploitation & Lab Setup

Red Team

Prerequisites:

  • Access to a Polkadot node with Frontier enabled (e.g., a local development node).
  • Ability to send Ethereum-style transactions or RPC calls to the precompile addresses.

Exploitation Steps:

  1. Identify the precompile addresses for Curve25519Add and Curve25519ScalarMul. These are typically at specific addresses in the Frontier EVM.
  2. Craft a transaction that calls the precompile with invalid Ristretto point bytes (e.g., all zeros or a point not in the group).
  3. Observe that the precompile returns a result instead of an error, and the result corresponds to the identity element.
  4. Use this behavior to bypass cryptographic checks in a higher-level protocol (e.g., a zero-knowledge proof verification).

Example Payload (Hex):

// For Curve25519Add: 64 bytes of invalid Ristretto points
0x0000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000000000000000000000000000000000000

Expected Result: The precompile returns the compressed identity element (32 bytes of zeros).

Blue Team

Detection:

  • Monitor for transactions that call the Curve25519Add or Curve25519ScalarMul precompiles with unusual input patterns (e.g., all zeros, repeated bytes).
  • Log and alert on any errors returned by these precompiles (though the vulnerability means no error is returned for invalid input).

Mitigation:

  • Apply the patch from commit 36f70d1 immediately.
  • If patching is not possible, implement a custom validation layer that checks Ristretto point validity before calling the precompile.
  • Restrict access to these precompiles to trusted callers only.

Indicators of Compromise (IOCs)

  • Network IOCs:

    • Transactions to precompile addresses (e.g., 0x0000000000000000000000000000000000000008 for Curve25519Add) with invalid point encodings.
    • Repeated calls with identical malformed input.
  • Log IOCs:

    • Log entries showing successful execution of Curve25519Add or Curve25519ScalarMul with input that should have been rejected.
    • Absence of error logs where errors are expected.
  • Blockchain IOCs:

    • Blocks containing transactions that exploit this vulnerability to bypass cryptographic checks.

Detection Engineering

YARA Rule

rule CVE_2025_54426_Invalid_Ristretto {
    meta:
        description = "Detects invalid Ristretto point bytes in Polkadot Frontier precompile calls"
        author = "Valters IT"
        date = "2025-04-10"
        cve = "CVE-2025-54426"
    strings:
        $invalid_point = { 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 }
    condition:
        $invalid_point
}

Sigma Rule

title: CVE-2025-54426 - Invalid Ristretto Point in Frontier Precompile
id: 8a9b7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d
status: experimental
description: Detects transactions calling Curve25519Add or Curve25519ScalarMul with invalid Ristretto point bytes.
author: Valters IT
date: 2025/04/10
logsource:
    category: blockchain
    product: polkadot
detection:
    selection:
        precompile_address:
            - '0x0000000000000000000000000000000000000008'  # Curve25519Add
            - '0x0000000000000000000000000000000000000009'  # Curve25519ScalarMul
        input_data|contains: '0000000000000000000000000000000000000000000000000000000000000000'
    condition: selection
falsepositives:
    - Legitimate use of identity element (rare)
level: high

Suricata Rule

alert tcp any any -> any 30333 (msg:"CVE-2025-54426 - Invalid Ristretto Point in Frontier Precompile"; content:"|00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00|"; offset:0; depth:32; sid:1000001; rev:1;)

Remediation & Mitigation

Immediate Actions:

  1. Patch: Update Polkadot Frontier to commit 36f70d1 or later. This is the only complete fix.
  2. Workaround: If patching is delayed, implement a proxy contract that validates Ristretto point inputs before forwarding to the precompile. Use a library like ristretto255 to check point validity.

Long-Term Measures:

  • Add fuzz testing for all precompiles to catch similar input validation issues.
  • Implement a security review process for cryptographic code.
  • Monitor the Polkadot Frontier repository for future security advisories.

Detection:

  • Deploy the YARA, Sigma, and Suricata rules provided above.
  • Enable logging for all precompile calls and review logs for anomalies.

Valters IT
Securing the decentralized future.

◈ SOURCE Analysis & enrichment: valtersit.com/cve/CVE-2025-54426/ · CVE data: NVD/MITRE (public domain) · © 2026 ValtersIT Hub
>_ SYSTEM_CORE: INTEL_ACTIVE
90% TEAM-CURATED // 10% AUTOMATED INGESTION.
ALL PATCH REFERENCES AND VERSION DATA SOURCED FROM NVD + OSV OFFICIAL REGISTRIES.