Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-52735

CVE-2026-52735: Zebra Zcash Node DOS Vulnerability

CVE-2026-52735 is a denial of service vulnerability in Zebra Zcash node that allows attackers to cause consensus chain splits through signature-operation miscounting. This post covers technical details, affected versions, and fixes.

Published:

CVE-2026-52735 Overview

CVE-2026-52735 is a consensus-splitting vulnerability in Zebra, the Rust implementation of a Zcash node maintained by the Zcash Foundation. Versions prior to 4.5.0 undercount signature operations in Pay-to-Script-Hash (P2SH) redeem scripts that contain a disabled opcode followed by signature opcodes. The zcashd reference implementation continues static signature-operation counting through disabled opcodes such as OP_CODESEPARATOR, while Zebra stops counting at the disabled opcode and returns only the partial count. An attacker can craft P2SH spends that Zebra counts below MAX_BLOCK_SIGOPS while zcashd counts above the 20,000-operation limit, producing divergent block-validity decisions across the network.

Critical Impact

A remote attacker can broadcast crafted P2SH transactions that trigger a consensus chain split between Zebra and zcashd nodes, degrading Zcash network integrity and availability without producing a block themselves.

Affected Products

  • Zebra (Zcash Foundation Rust node) versions prior to 4.5.0
  • zebra-script crate consuming the script::Code::sig_op_count path
  • Zcash miners and validators running vulnerable Zebra builds

Discovery Timeline

  • 2026-08-18 - CVE-2026-52735 published to NVD
  • 2026-08-18 - Last updated in NVD database

Technical Details for CVE-2026-52735

Vulnerability Analysis

Zebra and zcashd must agree on block validity to maintain a single Zcash chain. The vulnerability breaks that agreement in the P2SH signature-operation accounting path. In zebra-script/src/lib.rs, the function p2sh_input_sigop_count delegates counting to the pure-Rust script::Code::sig_op_count implementation. That implementation uses a try_fold parser that terminates when it encounters a disabled opcode and returns only the accumulated count from before the error.

The zcashd C++ reference implementation performs static signature-operation counting and continues walking the script past disabled opcodes. Any CHECKSIG, CHECKMULTISIG, or related opcodes that appear after a disabled opcode contribute to the zcashd total but are invisible to Zebra. A redeem script can therefore be shaped so that Zebra sees a low sigop count and zcashd sees one exceeding the 20,000-per-block ceiling.

The issue is categorized under CWE-684: Incorrect Provision of Specified Functionality because Zebra's counter does not implement the specified consensus semantics.

Root Cause

The root cause is a parser-behavior mismatch. Zebra's Rust script parser treats disabled opcodes as terminal errors during signature-operation counting. The reference implementation treats sigop counting as a static byte-level scan that ignores execution semantics. The two behaviors produce different totals for the same script when disabled opcodes precede signature opcodes.

Attack Vector

The attack is network-reachable and unauthenticated. An attacker constructs a P2SH spend whose redeem script contains a disabled opcode such as OP_CODESEPARATOR followed by enough CHECKMULTISIG or CHECKSIG operations to push the block total past MAX_BLOCK_SIGOPS under zcashd rules. The attacker broadcasts these transactions to the mempool.

If any Zebra miner includes the transactions in a block, Zebra validators accept the block and extend the Zebra chain. zcashd validators reject the same block for exceeding the sigop limit and follow a different tip. The result is a persistent chain split affecting network availability and integrity.

text
// Patch summary from the v4.5.0 release (Cargo.lock and zebra-chain/Cargo.toml)
[[package]]
 name = "zebra-chain"
-version = "7.0.0"
+version = "8.0.0"

Source: GitHub Commit 1440b43. The fix aligns p2sh_input_sigop_count behavior with zcashd static counting semantics.

Detection Methods for CVE-2026-52735

Indicators of Compromise

  • P2SH redeem scripts observed in the mempool containing OP_CODESEPARATOR (0xab) immediately followed by OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG, or OP_CHECKMULTISIGVERIFY.
  • Divergence in accepted block heights or block hashes between local Zebra nodes and reference zcashd peers.
  • Zebra logs accepting a block that neighboring zcashd peers reject with a sigop-limit error.

Detection Strategies

  • Run a zcashd reference node in parallel with each Zebra node and alert on any disagreement in getbestblockhash or getblockcount output.
  • Parse mempool transactions and flag P2SH inputs whose redeem scripts contain disabled opcodes preceding signature-checking opcodes.
  • Monitor the Zcash Foundation security advisory feed for related indicators, including GHSA-gf9r-m956-97qx.

Monitoring Recommendations

  • Track Zebra zebrad version strings across the fleet and alert on any node reporting a version below 4.5.0.
  • Watch for sudden increases in block orphan rate or reorganization depth, which can indicate active exploitation.
  • Aggregate node consensus telemetry into a central log store so that split-brain conditions surface quickly.

How to Mitigate CVE-2026-52735

Immediate Actions Required

  • Upgrade all Zebra nodes to version 4.5.0 or later before mining or accepting external transactions.
  • Audit mining pool infrastructure to confirm no vulnerable Zebra builds are selecting transactions for block templates.
  • Cross-validate recent chain tips against a patched zcashd peer to confirm no split has already occurred.

Patch Information

The Zcash Foundation released the fix in Zebra 4.5.0. The corrective change replaces the failing try_fold sigop counter with logic that mirrors the static counting behavior of zcashd. Release notes and artifacts are available at the Zebra v4.5.0 GitHub release, with the underlying commit documented at GitHub Commit 1440b43.

Workarounds

  • If immediate upgrade is not possible, disable mining on Zebra nodes and rely on zcashd for block production until patched.
  • Restrict inbound peer connections to trusted zcashd peers so that malformed P2SH transactions are filtered before reaching a Zebra miner.
  • Continuously compare Zebra chain tips against zcashd peers and halt the node on divergence.
bash
# Upgrade Zebra to the patched release
git clone https://github.com/ZcashFoundation/zebra.git
cd zebra
git checkout v4.5.0
cargo build --release

# Verify installed version reports 4.5.0 or newer
./target/release/zebrad --version

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.