CVE-2026-52736
Executive Summary
CVE-2026-52736 is a denial-of-service vulnerability in ZEBRA, a Zcash node implementation written in Rust, affecting all versions prior to 4.5.0. A remote unauthenticated P2P peer can exploit a race condition between an invalid block body and the valid canonical body for the same block header hash, causing the victim node to become permanently stalled one block behind the network tip until a restart or reorganization occurs. The vulnerability resides in the queue_and_commit_to_non_finalized_state function in zebra-state/src/service.rs, where a block hash is cached before contextual validation completes, allowing a malicious peer to poison the node's internal state. The CVSS vector reflects the high complexity of exploitation but acknowledges the significant availability impact on network participants running Zcash infrastructure.
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.
No signup required
Technical Analysis
The vulnerability exploits a fundamental design tension in blockchain consensus: block headers and block bodies are validated at different stages of the pipeline. ZEBRA, being a Rust implementation of the Zcash protocol, follows the standard architecture of separating header validation from body validation, with an intermediate queueing stage where blocks await contextual validation before being committed to the non-finalized state.
The attack leverages ZIP-244, a Zcash Improvement Proposal that governs transaction authentication data mutation. Specifically, ZIP-244 permits an attacker to mutate the coinbase scriptSig authentication data while preserving all critical identifiers: transaction IDs, the Merkle root, and consequently the block header hash. This cryptographic property means an attacker can create a block body that shares the exact same header hash as the canonical, valid block body, but which will fail later commitment validation due to the poisoned coinbase scriptSig data.
The core flaw manifests in zebra-state/src/service.rs within the queue_and_commit_to_non_finalized_state function. When a block is received, the function records the block hash in a state variable called non_finalized_block_write_sent_hashes before contextual validation is completed. This early hash recording is intended as a deduplication mechanism to prevent redundant processing of the same block. However, the critical failure is that the hash is not removed from this tracking set when the write task later rejects the body during commitment validation.
The attack sequence operates as follows:
Race Condition Setup: The attacker sends a malicious block body that shares the same header hash as the canonical valid block. Because the header hash is identical, the node's header-first synchronization logic treats it as the same block it expects to receive.
Poisoned Body Processing: The malicious body (with mutated coinbase scriptSig) arrives first and is queued for processing. The hash is recorded in
non_finalized_block_write_sent_hashes. At this point, contextual validation either has not yet run or the body is parsed successfully at the wire level.Validation Failure: When the write task attempts to commit the body to the non-finalized state, the poisoned coinbase data fails ZIP-244 commitment validation. The body is rejected and discarded.
Suppression of Valid Body: When the honest, canonical block body later arrives (either from another peer or after network propagation), the node checks
non_finalized_block_write_sent_hashes. The cached hash from the rejected malicious body causes the node to classify the honest body as a duplicate via theKnownBlock::WriteChannelduplicate handling path. The valid body is suppressed and never processed.Permanent Stall: The node remains stuck at the current height, unable to advance because its state tracking believes the block was already processed, even though it was not committed. This condition persists until either the node is restarted (clearing the in-memory state) or a chain reorganization occurs that changes the block hashes involved.
The vulnerability is fundamentally a state-management bug: a stale entry in a deduplication cache that fails to account for validation failure. The attacker does not need to maintain any ongoing connection — a single malicious block delivery at the right moment (when the honest block is about to be propagated) is sufficient to cause a persistent denial of service.
The CVSS vector of CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:L reflects several key characteristics: the attack is network-based (AV:N) and requires no authentication (PR:N) or user interaction (UI:N). The high attack complexity (AC:H) is warranted because the attacker must race the malicious block body against the valid canonical body — timing precision is required to ensure the poisoned body arrives and is processed first. The security scope is unchanged (S:U), there is no confidentiality or integrity impact, and the availability impact is rated Low (A:L) because the node can be recovered via restart or reorganization, though such recovery may require significant operational intervention depending on the node's deployment context.
Exploitation Scenarios
Attack Chain
Step 1: Reconnaissance / Target Identification
An attacker must first identify Zcash node infrastructure running ZEBRA. Zcash nodes communicate over P2P on TCP port 8233 by default. Attackers can use network scanning (e.g., Shodan queries for port 8233), Zcash network crawlers, or passive monitoring of node announcements during network propagation to identify vulnerable ZEBRA nodes (< 4.5.0). Node software version may be identified through protocol handshake messages, which often include a user agent string.
Step 2: Triggering the Vulnerability Class
The vulnerability is a race condition in the block processing pipeline. No public PoC exists; the attack chain is inferred from the vulnerability class and NVD description. The attacker must:
- Monitor the Zcash network for the next block announcement (header broadcast).
- Immediately construct a malicious block body that shares the canonical block's header hash by:
- Taking the canonical block header.
- Mutating the coinbase scriptSig authentication data as permitted by ZIP-244.
- Ensuring the transaction IDs and Merkle root remain unchanged (preserving the header hash).
- Race the poisoned body against the legitimate body to the victim node, ideally via a direct P2P connection to maximize delivery speed.
Step 3: Payload / Execution Method
The payload is the crafted block body with mutated coinbase scriptSig data. The attacker sends it over the Zcash P2P protocol as a standard block message. Because the block hash matches the expected canonical hash, ZEBRA's block queueing logic accepts it for processing. The poisoned body is recorded in the deduplication cache before validation, and when validation fails, the stale cache entry causes subsequent legitimate bodies to be suppressed.
Step 4: Post-Exploitation Impact
The victim node becomes permanently stalled one block behind the network tip. This has cascading effects:
- Transaction Propagation Failure: The node stops serving transactions to its peers because it believes it is at the wrong chain tip.
- Peer Isolation: Other nodes may disconnect from the stalled node or deprioritize it in peer selection.
- Mining Disruption: If the node runs a mining configuration, mining operations cease or operate on stale data.
- Operational Degradation: Wallets and applications relying on the node's RPC interface return stale data, potentially causing incorrect balance reporting or failed transaction submissions.
- Persistence: The stall persists indefinitely until an operator manually restarts the node or the network undergoes a reorganization that invalidates the affected block header.
No public PoC available; attack chain is inferred from vulnerability class and NVD description. The absence of exploit code in the wild suggests either recent disclosure or limited awareness, but the vulnerability class (P2P race condition leading to state poisoning) is well-understood in blockchain security research.
Impact Assessment
Business Impact: ZEBRA is a critical piece of Zcash network infrastructure. A denial-of-service vulnerability affecting full nodes has significant operational impact for:
- Node Operators: Organizations running ZEBRA for settlement validation face persistent availability degradation. A node stuck one block behind cannot participate in consensus, validate transactions, or serve wallet queries accurately.
- Service Providers: Companies offering Zcash-based services (exchanges, payment processors, custody solutions) depend on reliable node infrastructure. A denied node translates to failed transactions, stale balances, and potential regulatory compliance issues.
- Network Health: Widespread exploitation could reduce the number of participating nodes, decreasing network resilience and potentially enabling more sophisticated attacks on the consensus layer.
Affected Systems: All ZEBRA deployments running versions prior to 4.5.0. This includes production nodes, testnet nodes, and development environments. The vulnerability affects nodes regardless of operating system since ZEBRA is cross-platform (Linux, macOS, Windows, BSD).
Blast Radius: The direct impact is limited to the victim node — the attacker gains no data access or code execution. However, the availability impact has a multiplier effect on connected services. A node servicing multiple downstream applications (wallet backends, exchange hot wallets, analytics services) causes all those services to fail or operate inaccurately. The CVSS availability subscore (A:L) reflects the recoverability via restart, but in practice, a node operator may not notice the stall for hours, amplifying the practical impact.
Common Weakness Enumeration: This vulnerability is categorized under CWE-459 (Incomplete Cleanup), which describes a failure to properly clean up resources or state after an error condition. The incomplete cleanup of non_finalized_block_write_sent_hashes after validation failure is the root cause, consistent with the CWE-459 classification.
Exploitation Maturity: No known exploit-in-the-wild evidence exists. No public PoC or Nuclei template is available. The patch confidence rating of 0/4 indicates uncertainty about fix availability despite the NVD description stating it is fixed in version 4.5.0.
Detection Guidance
Note on Detection: This vulnerability is a P2P protocol attack with no standard web-based indicators. Detection requires monitoring ZEBRA node logs, network traffic to port 8233, and application-level state changes.
Sigma Rule
The Sigma rule targets Windows and Linux event logs focusing on ZEBRA node errors indicating validation failures that precede a stall:
title: ZEBRA Node Validation Failure Leading to State Stall
id: 8c47ef1f-8e5d-4f72-9e2d-ffb3ba9c9a4d
status: experimental
description: Detects ZEBRA node log entries indicating block validation failure followed by duplicate block suppression, potential CVE-2026-52736 exploitation
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-52736
author: ValtersIT Threat Intelligence
date: 2026/02/15
logsource:
product: linux
service: zebra-node
detection:
selection_block_write_error:
message|contains:
- 'Invalid block body'
- 'coinbase scriptSig'
- 'validation failed for block'
selection_duplicate_suppression:
message|contains:
- 'KnownBlock'
- 'WriteChannel duplicate'
- 'already in write sent hashes'
selection_timing:
timestamp|relative:
- 'within 60 seconds of each other'
condition: (selection_block_write_error and selection_duplicate_suppression) and selection_timing
level: high
falsepositives:
- Legitimate network forks where blocks are naturally reorganized
- Transient network issues causing duplicate block delivery
tags:
- attack.t1190
- cve.2026.52736
- denial_of_service
YARA Rule
The YARA rule targets ZEBRA state files and memory dumps for indicators of stale state entries:
rule CVE_2026_52736_ZEBRA_Poisoned_Hash_State {
meta:
author = "ValtersIT Threat Intelligence"
description = "Detects ZEBRA node state files containing stale non_finalized_block_write_sent_hashes entries with validation failure patterns"
reference = "CVE-2026-52736"
date = "2026-02-15"
severity = "high"
strings:
$s1 = "non_finalized_block_write_sent_hashes" ascii wide
$s2 = "KnownBlock" ascii wide
$s3 = "WriteChannel duplicate" ascii wide
$s4 = "queue_and_commit_to_non_finalized_state" ascii wide
$s5 = "coinbase scriptSig" ascii wide
$s6 = "commitment validation" ascii wide
$s7 = "Invalid block" ascii wide
condition:
(uint16(0) == 0x4D42 or filesize > 1MB) and
2 of ($s*) and
($s1 or $s4) and
($s2 or $s3)
}
Suricata IDS Rule
The Suricata rule monitors port 8233 traffic for rapid block message deliveries and subsequent disconnect patterns:
alert tcp any any -> any 8233 (msg:"CVE-2026-52736 Zcash P2P Block Race Attempt"; flow:established,to_server; content:"|01|"; offset:0; depth:1; content:"block"; within:5; content:"!|0a|zebra"; pcre:"/block.{0,200}header.{0,500}tx/si"; threshold:type both, track by_src, count 5, seconds 60; classtype:attempted-dos; sid:10052736; rev:1; reference:cve,2026-52736;)
Elastic Detection
Elastic EQL query targeting ZEBRA application logs:
sequence by host.name with maxspan=2m
[ any where event.category == "process" and process.name == "zebrad" and
process.args : "*" and message : "*Invalid block body*" ]
[ any where event.category == "process" and process.name == "zebrad" and
process.args : "*" and message : "*write_sent_hashes*" ]
[ any where event.category == "process" and process.name == "zebrad" and
process.args : "*" and message : "*KnownBlock*WriteChannel*duplicate*" ]
Splunk SPL Query
Splunk query for ZEBRA log aggregation:
index="zebra" sourcetype="zebrad_logs"
| eval error_type=case(
_raw LIKE "%Invalid block body%" OR _raw LIKE "%commitment validation%" OR
_raw LIKE "%coinbase scriptSig%" , "validation_failure",
_raw LIKE "%non_finalized_block_write_sent_hashes%" OR _raw LIKE "%write_sent_hashes%" , "state_poisoning",
_raw LIKE "%KnownBlock%" OR _raw LIKE "%WriteChannel duplicate%" , "duplicate_suppression"
)
| stats count by host, error_type, _time
| search error_type=*
| streamstats time_window=2m count as event_count by host
| where event_count >= 3
| table _time, host, error_type, count
| sort - _time
Wazuh OSSEC Rule
Wazuh XML rule for ZEBRA validation failure detection:
<group name="zebra,cve-2026-52736,">
<rule id="100536" level="12">
<decoded_as>zebrad</decoded_as>
<field name="message">Invalid block body.*coinbase scriptSig</field>
<description>CVE-2026-52736: ZEBRA node rejected block with invalid coinbase scriptSig - possible P2P attack</description>
<mitre>
<id>T1190</id>
</mitre>
<group>denial_of_service,zebra,</group>
</rule>
<rule id="100537" level="12">
<decoded_as>zebrad</decoded_as>
<field name="message">KnownBlock.*WriteChannel duplicate</field>
<description>CVE-2026-52736: ZEBRA suppressed block via stale hash state - potential state poisoning</description>
<mitre>
<id>T1190</id>
</mitre>
<group>denial_of_service,zebra,</group>
</rule>
<rule id="100538" level="14">
<if_sid>100536</if_sid>
<field name="message">KnownBlock.*WriteChannel duplicate</field>
<description>CVE-2026-52736: Validation failure followed by duplicate suppression - exploitation chain detected</description>
<mitre>
<id>T1190</id>
</mitre>
<group>denial_of_service,zebra,</group>
</rule>
</group>
Mitigation & Patch Guidance
Patch Confidence: 0/4 — UNPATCHED (no patch evidence from any tracked source, despite NVD description indicating fix in 4.5.0)
1) Immediate Mitigations
- Upgrade ZEBRA to version 4.5.0 or later — The NVD description states this issue is fixed in version 4.5.0. While patch confidence is low due to lack of tracked patch evidence, upgrading to the latest available version is the most direct mitigation.
- Restart Procedure: Implement automated health checks that monitor node height. If a node falls behind the network tip by more than one block and does not recover within 10 minutes, trigger an automated restart to clear the poisoned in-memory state.
- Peer Management: Restrict inbound P2P connections to known, trusted peers where feasible. While this reduces node discovery, it limits the attack surface for unsolicited block deliveries.
- Network Monitoring: Deploy the detection rules above to receive early warning of exploitation attempts, enabling rapid manual intervention before the node's stall persists.
- Transaction Pool Isolation: Consider running a secondary light-weight node (e.g., zcashd in archive mode) for critical settlement functions while ZEBRA undergoes monitoring and upgrading.
2) Patch/Upgrade Steps
- Confirm current ZEBRA version:
zebrad --version - Review release notes for version 4.5.0 or later.
- Download the latest release from the official ZEBRA GitHub repository (
ZcashFoundation/zebra). - Stop the ZEBRA service:
systemctl stop zebrad(or equivalent). - Backup the node data directory:
cp -r ~/.cache/zebra ~/.cache/zebra.backup - Install the new binary.
- Start the service:
systemctl start zebrad - Verify node sync status:
zebrad --configor query RPC endpoint for block height. - Monitor logs for 24 hours to ensure normal operation.
3) Long-Term Hardening
- Redundancy: Operate at least two independent Zcash nodes (ideally ZEBRA and zcashd) behind a load balancer for RPC services, ensuring resilience against single-node denial-of-service.
- Automated Monitoring: Implement continuous health-checking that verifies not just process health but actual blockchain synchronization status (chain tip height vs. network tip).
- Contribution to ZEBRA Security: Given the 0/4 patch confidence, security teams should actively monitor the ZEBRA GitHub repository for security advisories and participate in the project's disclosure process.
- Source Audits: Conduct or commission audits of
zebra-state/src/service.rs— particularly thequeue_and_commit_to_non_finalized_statefunction and hash-caching logic — to identify similar state-management vulnerabilities. - Network Segmentation: Place Zcash nodes on isolated network segments with egress filtering to limit P2P traffic to known peers.
- Incident Response Preparation: Develop a playbook for Zcash node stall incidents, including restart procedures, chain reorganization verification, and downstream service failover.
References
NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-52736 — Official NVD record with vulnerability description and metadata.
ZEBRA Official Repository: https://github.com/ZcashFoundation/zebra — Official ZEBRA GitHub repository; monitor for releases and security advisories. The fix is stated to be in version 4.5.0.
ZIP-244 Specification: https://zips.z.cash/zip-0244 — Zcash Improvement Proposal describing transaction authentication data mutation rules, which is the cryptographic enabler of this attack.
CWE-459 Reference: https://cwe.mitre.org/data/definitions/459.html — Common Weakness Enumeration entry for Incomplete Cleanup, the root-cause weakness category.
Zcash Network Documentation: https://zcash.readthedocs.io — Zcash protocol and node documentation, useful for understanding P2P architecture and port 8233 configuration.
Threat Actor Campaigns: No known threat actor campaigns or exploit-in-the-wild evidence exists for CVE-2026-52736 as of the publication date. The vulnerability is not listed on the CISA Known Exploited Vulnerabilities (KEV) catalog. The absence of public exploit code and the high attack complexity (AC:H in the CVSS vector) suggest that exploitation requires a sophisticated understanding of Zcash consensus mechanics and precise network timing, likely limiting near-term exploitation to state-sponsored actors or advanced adversaries targeting Zcash infrastructure for financial or political motives. Security teams should nevertheless treat this as a high-priority advisory given the fundamental nature of the flaw (a state-management bug in a consensus-critical code path) and the expanding deployment of ZEBRA nodes within the Zcash ecosystem.
What is this? Security researchers use these exact search queries on Shodan.io (a search engine for internet-connected devices) to find vulnerable systems globally. You can copy these dorks to see if your organization's IP space is exposed.