Description
ZEBRA is a Zcash node written entirely in Rust. Prior to 4.5.0, Zebra can accept a block that zcashd rejects because the P2SH signature-operation counter undercounts redeem scripts containing a disabled opcode followed by signature opcodes. In zebra-script/src/lib.rs, p2sh_input_sigop_count used the pure-Rust script::Code::sig_op_count path, whose try_fold parser stops at disabled opcodes such as OP_CODESEPARATOR and returns only the partial count accumulated before the error. The zcashd reference implementation continues static signature-operation counting through disabled opcodes, so an attacker can broadcast P2SH spends that Zebra counts below MAX_BLOCK_SIGOPS while zcashd counts above the 20,000-operation limit. If a Zebra miner includes those transactions, Zebra validators accept the block while zcashd validators reject it, creating a consensus chain split that affects network integrity and availability without requiring the attacker to produce a block. This issue is fixed in version 4.5.0.
Published: 2026-08-18
Score: 9.3 Critical
EPSS: n/a
KEV: No
Impact: n/a
Action: n/a
AI Analysis

Impact

Zebra can mistakenly accept blocks containing P2SH spends whose signature‑operation count is underestimated because its pure‑Rust parser stops parsing at disabled opcodes. The reference implementation counts all signatures, so the validated block may exceed the 20,000‑sigop limit. The mismatch lets an attacker broadcast crafted transactions that Zebra believes are valid while the rest of the network rejects the block, creating a temporary chain split that undermines network integrity and availability.

Affected Systems

The vulnerability affects the ZcashFoundation Zebra node prior to version 4.5.0. All users running Zebra 4.4.x or earlier are susceptible; version 4.5.0 and later include the fix.

Risk and Exploitability

The CVSS score of 9.3 indicates a high severity. No EPSS data is available, and the issue is not listed in the CISA KEV catalog. The attacker can simply craft and broadcast a P2SH transaction that contains a disabled opcode followed by signature operations; no block creation is required. Because Zebra will undercount sigops, such transactions can be included in blocks that Zebra will accept but which zcashd will reject, causing a consensus split between Zebra‑based nodes and the rest of the network.

Generated by OpenCVE AI on August 18, 2026 at 20:34 UTC.

Remediation

No vendor fix or workaround currently provided.

OpenCVE Recommended Actions

  • Upgrade Zebra to version 4.5.0 or later.
  • If an upgrade is not feasible, disable mining or block validation on the affected node until the patch is applied, or run Zebra in passive observer mode.
  • Implement a secondary validation layer that cross‑checks Zebra’s transaction sigop counts with the reference implementation before propagating blocks.

Generated by OpenCVE AI on August 18, 2026 at 20:34 UTC.

Tracking

Sign in to view the affected projects.

Advisories
Source ID Title
Github GHSA Github GHSA GHSA-gf9r-m956-97qx zebrad has consensus divergence via P2SH sigop undercount in pure-Rust disabled-opcode parser
History

Tue, 18 Aug 2026 21:00:00 +0000

Type Values Removed Values Added
First Time appeared Zcashfoundation
Zcashfoundation zebra
Vendors & Products Zcashfoundation
Zcashfoundation zebra

Tue, 18 Aug 2026 20:30:00 +0000

Type Values Removed Values Added
Metrics ssvc

{'options': {'Automatable': 'yes', 'Exploitation': 'none', 'Technical Impact': 'partial'}, 'version': '2.0.3'}


Tue, 18 Aug 2026 19:30:00 +0000

Type Values Removed Values Added
Description ZEBRA is a Zcash node written entirely in Rust. Prior to 4.5.0, Zebra can accept a block that zcashd rejects because the P2SH signature-operation counter undercounts redeem scripts containing a disabled opcode followed by signature opcodes. In zebra-script/src/lib.rs, p2sh_input_sigop_count used the pure-Rust script::Code::sig_op_count path, whose try_fold parser stops at disabled opcodes such as OP_CODESEPARATOR and returns only the partial count accumulated before the error. The zcashd reference implementation continues static signature-operation counting through disabled opcodes, so an attacker can broadcast P2SH spends that Zebra counts below MAX_BLOCK_SIGOPS while zcashd counts above the 20,000-operation limit. If a Zebra miner includes those transactions, Zebra validators accept the block while zcashd validators reject it, creating a consensus chain split that affects network integrity and availability without requiring the attacker to produce a block. This issue is fixed in version 4.5.0.
Title ZEBRA: Consensus divergence via P2SH sigop undercount in pure-Rust disabled-opcode parser
Weaknesses CWE-684
References
Metrics cvssV4_0

{'score': 9.3, 'vector': 'CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:H/SA:H'}


Subscriptions

Zcashfoundation Zebra
cve-icon MITRE

Status: PUBLISHED

Assigner: GitHub_M

Published:

Updated: 2026-08-18T19:48:45.150Z

Reserved: 2026-06-08T14:00:43.572Z

Link: CVE-2026-52735

cve-icon Vulnrichment

Updated: 2026-08-18T19:48:39.700Z

cve-icon NVD

Status : Received

Published: 2026-08-18T20:17:17.227

Modified: 2026-08-18T20:17:17.227

Link: CVE-2026-52735

cve-icon Redhat

No data.

cve-icon OpenCVE Enrichment

Updated: 2026-08-18T20:45:04Z

Weaknesses
  • CWE-684

    Incorrect Provision of Specified Functionality