Severity by source
CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:N/VI:H/VA:N/SC:N/SI:N/SA:N/E:X/CR:X/IR:X/AR:X/MAV:X/MAC:X/MAT:X/MPR:X/MUI:X/MVC:X/MVI:X/MVA:X/MSC:X/MSI:X/MSA:X/S:X/AU:X/R:X/V:X/RE:X/U:X
Race-condition propagation timing warrants AC:H; chain-state divergence maps to I:H and permanent sync disruption to A:H; no confidentiality impact applies.
Primary rating from Vendor (https://github.com/ZcashFoundation/zebra).
CVSS VectorVendor: https://github.com/ZcashFoundation/zebra
Lifecycle Timeline
5DescriptionCVE.org
Description
Am I affected
You are affected if:
- You run any version of
zebradup to and includingv4.4.1. - Your node accepts inbound P2P connections (
network.listen_addris set, which is the default). - Your node processes blocks past the checkpoint height (non-finalized state is active).
All default configurations are affected.
Summary
Zebra records a block hash in non_finalized_block_write_sent_hashes when the block is sent to the write task, before contextual validation completes. If validation fails, the hash is not removed. A remote unauthenticated peer can deliver a poisoned block body that shares a header hash with a later valid canonical block. The poisoned body is rejected, but the hash remains cached. When the valid canonical block arrives, Zebra treats it as a duplicate and rejects it. The node cannot advance past that height until restart or a reorg event.
Details
ZIP-244 defines txid_v5 without binding transparent input scriptSig, which lives in auth_digest and is committed to by hashBlockCommitments in the block header. Because merkle_root is computed over txids (not auth digests), and the block hash is computed over the header, an attacker can construct two blocks with identical header hashes but different transaction bodies by mutating the coinbase scriptSig.
The attack flow over P2P:
- Attacker observes a new block header (from any peer).
- Attacker constructs a poisoned body by flipping a byte of the coinbase scriptSig extra-data section. The block hash is unchanged.
- Attacker advertises the block hash via
invto the target node. - Target requests the block via
getdata; attacker serves the poisoned body. - Zebra adds the hash to
non_finalized_block_write_sent_hashesbefore validation. - The write task rejects the body at
block_commitment_is_valid_for_chain_history(auth_data_root mismatch). - The hash is not removed from
non_finalized_block_write_sent_hashes. - When the valid canonical block arrives (from honest peers or RPC),
queue_and_commit_to_non_finalized_statesees the hash in the cache and returnsKnownBlock::WriteChannelduplicate. - The node is stuck at height N-1.
A secondary variant exists where chain pruning (via MAX_NON_FINALIZED_CHAIN_FORKS) removes a chain from chain_set but leaves its block hashes in non_finalized_block_write_sent_hashes, producing the same lockout for children of the pruned fork.
Patches
Patched in Zebra 4.4.2. The fix removes stale entries from non_finalized_block_write_sent_hashes on every failed non-finalized write path.
Workarounds
There is no complete configuration-level workaround. Reducing the node's inbound peer count (network.peerset_initial_target_size) narrows the attack surface but does not eliminate it. Restarting the node clears the in-memory cache and allows the valid block to be re-fetched.
Impact
A remote unauthenticated P2P peer can permanently stall a targeted Zebra node at a specific block height. The node diverges from the network tip; downstream consumers (lightwalletd, wallets, explorers, mining infrastructure) relying on the node see a stalled chain. The attack requires winning a propagation race: delivering the poisoned block body before honest peers deliver the canonical block. A well-positioned attacker (low-latency connection to the target, observation of new blocks from other peers) can reliably win this race. In sustained form, the attacker repeats for each new block, keeping the target permanently behind.
Recovery requires restarting the node (which clears the in-memory sent-hash cache) or waiting for a reorg at the affected height (rare on the canonical chain).
Credit
Reported independently by @ipwning (primary, with ZIP-244 malleability analysis and zcashd cross-reference) and @x15-eth (first reporter, with E2E reproduction and control experiment).
AnalysisAI
Block suppression via ZIP-244 transaction malleability in zebrad up to v4.4.1 allows a remote unauthenticated P2P peer to permanently stall a target node at a specific block height by poisoning the sent-hash cache with a validation-rejected block whose hash is never cleaned up. The root cause is that non_finalized_block_write_sent_hashes records a block's header hash before contextual validation completes, and on failure the stale entry remains, causing any subsequent delivery of the legitimate canonical block to be discarded as a duplicate. No active exploitation is listed in CISA KEV, but the Zcash Foundation advisory credits two independent researchers with E2E reproduction, confirming the attack is practically executable against all default configurations; vendor-released patch zebrad 4.5.0 is available.
Technical ContextAI
The vulnerability (CWE-459: Incomplete Cleanup) arises from an interaction between Zcash's ZIP-244 transaction-ID scheme and Zebra's non-finalized state write pipeline. ZIP-244 defines txid_v5 without binding the transparent input scriptSig; instead, scriptSig lives in auth_digest, which is committed to by hashBlockCommitments in the block header rather than by merkle_root. Because the block hash is derived from the header alone, an attacker can produce two distinct block bodies sharing an identical header hash simply by mutating bytes in a coinbase scriptSig extra-data field - the merkle_root is unchanged and so is the hash. Zebra's SentHashes cache records the header hash at dispatch time (zebra-state/src/service.rs lines 659-714), before block_commitment_is_valid_for_chain_history performs the auth_data_root check. When that check fails the write task returns an error but the cache entry at lines 797-802 is never purged, meaning every subsequent delivery of the canonical block hits queue_and_commit_to_non_finalized_state returning KnownBlock::WriteChannel. A secondary variant exists: chain pruning via MAX_NON_FINALIZED_CHAIN_FORKS removes a fork from chain_set but leaves its hashes in the cache, producing the same lockout for children of the pruned fork. Affected packages: pkg:rust/zebrad <=4.4.1 and pkg:rust/zebra-state <=6.0.0.
RemediationAI
Upgrade to zebrad v4.5.0 or later (zebra-state 7.0.0), released 2026-05-28, which removes stale entries from non_finalized_block_write_sent_hashes on every failed non-finalized write path; the fix commit is 1440b43ca7df59aca948090d45117557b217a6cd and the release is at https://github.com/ZcashFoundation/zebra/releases/tag/v4.5.0. No complete configuration-level workaround exists. Reducing network.peerset_initial_target_size narrows the inbound peer attack surface but does not eliminate the vulnerability, since a single malicious peer is sufficient. Operators who cannot immediately upgrade should implement a watchdog that compares local block height against a trusted peer or public explorer and triggers a process restart when the node falls behind by more than one or two blocks; restart clears the in-memory SentHashes cache and allows the valid canonical block to be re-fetched, at the cost of brief re-sync downtime at each triggered restart.
More in Checkpoint
View allPotentially allowing an attacker to read certain information on Check Point Security Gateways once connected to the inte
backend/comics/comics-document.c (aka the comic book backend) in GNOME Evince before 3.24.1 allows remote attackers to e
Authentication bypass in the Check Point SmartConsole login process lets an unauthenticated remote attacker mint a valid
The huggingface/transformers library is vulnerable to arbitrary code execution through deserialization of untrusted data
PyTorch is a Python package that provides tensor computation. [CVSS 8.8 HIGH]
Check Point ZoneAlarm Extreme Security before 15.8.211.19229 allows local users to escalate privileges. Rated high sever
Remote code execution in PyTorch Lightning through 2.6.5 allows an attacker who can get a victim to load a malicious che
Check Point Endpoint Security Initial Client for Windows before version E81.30 tries to load a DLL placed in any PATH lo
A hard-link created from log file archive of Check Point ZoneAlarm up to 15.4.062 or Check Point Endpoint Security clien
Path traversal in Hugging Face Accelerate through 1.14.0 exposes two distinct attack outcomes when a user loads a crafte
Out-of-bounds read in the Linux kernel drm/amdkfd CRIU checkpoint path leaks kernel memory to userspace on systems with
Multiple unspecified vulnerabilities in Check Point Security Gateway 80 R71.x before R71.45 (730159141) and R75.20.x bef
Same weakness CWE-459 – Incomplete Cleanup
View allSame technique Information Disclosure
View allShare
External POC / Exploit Code
Leaving vuln.today
EUVD-2026-61171
GHSA-4m69-67m6-prqp