CVE-2026-52733 Overview
CVE-2026-52733 affects Zebra, a Zcash node implementation written in Rust. Prior to version 4.5.0, a natural or attacker-influenced chain fork can leave stale Sapling and Orchard note-commitment subtree roots in Zebra state. The Chain::pop_tip function in zebra-state/src/service/non_finalized_state/chain.rs removed reverted tip blocks without removing subtree entries whose end_height belonged to those blocks. When the winning fork later finalized, abandoned branch data persisted to RocksDB and survived node restarts. The flaw is tracked under [CWE-459: Incomplete Cleanup].
Critical Impact
Corrupted subtree data can cause z_getsubtreesbyindex consumers such as lightwalletd and light wallets to receive incorrect subtree roots, producing wallet synchronization failures that require a full state rebuild for recovery.
Affected Products
- Zebra Zcash node versions prior to 4.5.0
- Downstream lightwalletd instances relying on affected Zebra nodes
- Light wallets consuming z_getsubtreesbyindex from vulnerable Zebra nodes
Discovery Timeline
- 2026-08-18 - CVE-2026-52733 published to NVD
- 2026-08-19 - Last updated in NVD database
Technical Details for CVE-2026-52733
Vulnerability Analysis
Zebra maintains a non-finalized state tracking multiple candidate chain tips before block finalization. The state includes note-commitment subtree roots for Sapling and Orchard shielded pools. These subtrees are indexed by end_height, the block height at which each subtree completes.
When a chain reorganization occurs, Zebra rolls back the losing fork by calling Chain::pop_tip on reverted blocks. The function correctly removed block data but omitted cleanup logic for subtree entries associated with the popped block. This diverged from pop_root, which performed the equivalent cleanup on the opposite end of the chain.
Once the winning fork finalizes, the non-finalized state flushes to RocksDB persistent storage. Stale subtree entries from abandoned branches were written alongside legitimate data and persisted across restarts.
Root Cause
The root cause is incomplete cleanup [CWE-459] in Chain::pop_tip. The function reverts a tip block from the in-memory chain but fails to iterate and remove subtree entries whose end_height matches the reverted block. The absence of this cleanup step allows subtree state to diverge from block state.
Attack Vector
An attacker capable of influencing chain forks, or a naturally occurring reorganization, triggers the condition. The network-based attack requires no authentication but has high complexity because it depends on inducing or exploiting a fork containing shielded-pool subtree boundaries. The resulting state corruption affects integrity of wallet synchronization data served to downstream clients.
// Cargo.lock patch excerpt from v4.5.0 release
[[package]]
name = "zebra-chain"
-version = "7.0.0"
+version = "8.0.0"
dependencies = [
"bech32",
"bitflags 2.11.1",
Source: GitHub Zebra Commit 1440b43
Detection Methods for CVE-2026-52733
Indicators of Compromise
- Wallet synchronization failures reported by lightwalletd instances connected to a Zebra node running a version prior to 4.5.0.
- z_getsubtreesbyindex responses that do not match subtree roots observed on independent, patched Zcash nodes.
- Persistent state inconsistencies in RocksDB that survive node restarts and manifest only after chain reorganizations.
Detection Strategies
- Compare subtree roots returned by z_getsubtreesbyindex against known-good values from a reference node running Zebra 4.5.0 or zcashd.
- Monitor node logs for chain reorganization events followed by wallet client errors from downstream lightwalletd consumers.
- Audit deployed Zebra node versions across infrastructure and flag any instance below 4.5.0.
Monitoring Recommendations
- Track chain reorganization frequency and depth as an operational metric on all Zebra nodes.
- Alert when lightwalletd clients report subtree root mismatches or repeated resync attempts.
- Log Zebra version banners and compare them against the patched baseline during scheduled configuration audits.
How to Mitigate CVE-2026-52733
Immediate Actions Required
- Upgrade all Zebra nodes to version 4.5.0 or later, which contains the fix in Chain::pop_tip.
- Rebuild node state after upgrade if the node experienced reorganizations while running a vulnerable version, since persisted stale subtree data will remain until state is reconstructed.
- Notify downstream lightwalletd and wallet operators to resynchronize once nodes are patched and state is rebuilt.
Patch Information
The fix is included in Zebra v4.5.0. See the GitHub Security Advisory GHSA-2gf8-q9rr-jq3h and the Zebra v4.5.0 Release Notes. The corrective commit is available at GitHub Zebra Commit 1440b43.
Workarounds
- No configuration-based workaround exists; the fix requires upgrading to Zebra 4.5.0.
- Operators unable to upgrade immediately should perform a full state rebuild after any chain reorganization to purge stale subtree entries.
- Redirect downstream lightwalletd traffic to a patched reference node until the local Zebra instance is upgraded.
# Upgrade Zebra to the patched release
git clone https://github.com/ZcashFoundation/zebra.git
cd zebra
git checkout v4.5.0
cargo build --release
# Rebuild state after upgrade to remove any persisted stale subtree data
rm -rf ~/.cache/zebra/state
./target/release/zebrad start
Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

