CVE-2026-35679
Executive Summary
CVE-2026-35679 is a critical consensus-layer vulnerability in Zcash's zcashd implementation (versions prior to 6.12.0) that permits the acceptance of invalid transactions due to a failure to verify Sprout pool zero-knowledge proofs under specific conditions. Exploitation of this flaw could allow an attacker to forge Sprout pool transactions and drain funds from users' Sprout addresses, representing a direct theft-of-funds risk rather than a mere denial of service. Organizations and individuals running Sprout pool clients, exchanges, or wallets leveraging zcashd < 6.12.0 are affected; immediate upgrade to version 6.12.0 or later is strongly recommended as a patched version exists per OSV advisory evidence.
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 resides in the transaction validation logic of zcashd (the reference client for the Zcash cryptocurrency network), specifically within the code path responsible for verifying zero-knowledge proofs (zk-SNARKs) required by the Sprout payment pool. Sprout is the original shielded transaction pool in Zcash, which uses the Groth16 proving system with pool-specific verification keys.
The NVD description notes that the client "was sometimes not verifying Sprout proofs," indicating a conditional logic flaw. The likely mechanism is one of the following (based on the security class and common patterns in blockchain consensus code):
State-dependent flag corruption: A boolean flag or state variable controlling whether proof verification is skipped may be improperly initialized or reset during certain block reorgs, orphan block processing, or mempool revalidation. If the client enters a code path where transaction re-validation occurs without the accompanying proof check (e.g., during "reconsidering" a previously rejected block), unverified Sprout transactions could be accepted into the mempool and eventually mined.
Insufficient witness deserialization checks: The validation function may fail to verify the proof if the transaction contains a malformed or empty
zkprooffield, but the error-handling path incorrectly treats this as a successful verification (fail-open behavior). An attacker crafting a transaction with a zero-length proof might bypass checks that assume presence of the proof object.Cached verification results: The client may cache proof verification results per-transaction-ID. If a cache entry is poisoned (e.g., during initial sync or after a chain reorg), subsequent checks might reference the cached "valid" status without re-running the computationally expensive proof equation.
The critical technical nuance is that Sprout proofs (unlike Sapling) are not batch-verifiable, and the Sprout pool is semi-deprecated. The codebase may have received less audit attention for Sprout-specific code paths, making conditional bypasses more likely. The attack does not require network-level exploitation; it is a protocol-level deserialization/state-machine flaw triggered by submitting crafted transactions to a vulnerable node.
The attack surface is the node's P2P interface (port 8233 default for zcashd), but the actual threat requires an attacker to get a forged transaction accepted by the network (or at least by a vulnerable validating node that could be used for a double-spend against a merchant wallet).
Exploitation Scenarios
Scenario: Sprout Pool Fund Drain via Forged Proofs
Step 1 — Reconnaissance/Target Identification:
The attacker first identifies vulnerable nodes by scanning the Zcash network for zcashd peers advertising protocol versions corresponding to < 6.12.0. This can be achieved by connecting to public node lists (e.g., via getpeerinfo on a running local node) or using Shodan to find internet-exposed zcashd instances on port 8233. The attacker also fingerprints the Sprout pool balance of target addresses, seeking high-value targets (e.g., an exchange's cold Sprout wallet or a high-net-worth individual's z-address).
Step 2 — Weaponization/Crafting the Malformed Transaction:
The attacker constructs an invalid Sprout JoinSplit description. They modify the transaction to include a JoinSplit proof but with a deliberately corrupted Groth16 proof encoding (e.g., truncating the proof bytes, setting the proof to an all-zero byte string, or reordering the elements). They ALSO craft the nullifiers and commitments such that the transaction appears to spend a known, funded Sprout note. The attack relies on producing a transaction that would normally FAIL proof verification, but which the vulnerable zcashd will accept because the proof-checking branch is skipped. Using a locally running vulnerable node, the attacker tests the exact byte-level modification that triggers the fail-open path.
Step 3 — Payload/Execution:
The attacker submits the crafted transaction to the targeted vulnerable node via the sendrawtransaction RPC call (if they have RPC access) or broadcasts it to the P2P network. Because the vulnerable node fails to verify the Sprout proof, it accepts the transaction into its mempool. The attacker may have to wait for a miner running a patched (or similarly vulnerable) node to mine the transaction. Crucially, if the target node is the attacker's own mining node, they can mine the invalid transaction themselves, giving them the ability to create new Sprout coins (coin inflation) and subsequently transfer them to a fresh z-address or to t (transparent) addresses.
Step 4 — Post-Exploitation Impact: Once the attacker has announced the mined block containing the invalid transaction (via their own miner), they broadcast a double-spend transaction, spending the legitimate Sprout note a second time and linking the previously legitimately-held funds to an attacker-controlled address. Alternatively, if the forged transaction directly creates new value (coin inflation), the attacker now controls newly-created ZEC. They mix the funds through Sapling/tree-chain privacy pools to obscure the provenance and then sell on exchanges.
Key Attack Detail: The attack is probabilistic in nature — the attacker must ensure that the invalid transaction is accepted by enough nodes to be included in a chain tip. Since the flaw is in proof verification, not propagation logic, an attacker with a majority of hash power targeting this could create a chain split and secure the inflation via their own mined blocks.
Impact Assessment
The CVSS v3.1 score of 3.5 (Base Vector: AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N) reflects requirements of network access, high attack complexity, low privileges, and low integrity impact. However, this rating severely underestimates the real-world financial impact for a cryptocurrency vulnerability. The score sub-components typically assume "data" impact in generic software; here, the "integrity impact: Low" is measured against the number of affected transactions, not monetary value.
- Business Impact: Direct theft of user funds from the Sprout privacy pool. Loss of confidence in the Zcash protocol's soundness. Regulatory scrutiny on exchanges.
- Affected Systems: Any
zcashdnode (version < 6.12.0) that:- Maintains a Sprout balance, OR
- Is a mining pool operator, OR
- Is an exchange wallet service.
- Blast Radius: The Sprout pool holds a reduced but non-trivial fraction of total ZEC supply post-Sapling/Orchard migration. A successful inflation attack could dilute the entire ZEC monetary base.
- EPSS Context: EPSS score of 0.00220 (12.6th percentile) indicates very low probability of active exploitation in the wild today in mass terms; however, this metric is calibrated for automated scanning attacks, not for targeted, high-value financial heists. This CVE is a prime candidate for a targeted, low-frequency attack.
Detection Guidance
Sigma Rule
title: Zcash zcashd Sprout Proof Bypass - Invalid Transaction Rejection
id: 5f36b4a0-7f2e-4b5f-9c1c-a7f23456789a
status: experimental
description: Detects log lines from zcashd indicating rejection/acceptance of transactions with missing or failed Sprout proof verification.
references:
- https://nvd.nist.gov/vuln/detail/CVE-2026-35679
tags:
- attack.t1190
- attack.t1498
logsource:
product: zcash
category: zcashd
detection:
selection:
# zcashd logs specific errors related to proof failures
# - "Invalid transaction" lines have specific txid and error strings
- EventID: "H"
- Message|contains:
- "CheckTransaction() : Sprout JSDescription has no proof"
- "Invalid checkpoint after processing block"
- "bad-txns-sprout-proof-missing"
- "ConnectBlock(): checkpoints mismatch while validating sprout"
condition: selection
level: critical
falsepositives:
- Legitimate network upgrades where proof format changes (rare)
- Malformed transactions from buggy non-zcashd clients (should be rejected, but flag if accepted)
YARA Rule
rule Detect_Zcash_Sprout_Fake_JoinSplit
{
meta:
author = "Valtersit Threat Intel"
description = "Detects serialized Zcash Sprout JoinSplit transactions with zero-length or invalid proof fields (CVE-2026-35679)"
cve = "CVE-2026-35679"
severity = "high"
strings:
// Bitcoin-like varint for empty vector length (0x00) or short proof length
$empty_proof = { 00 00 00 00 } // placeholder for tx structure, actual detection via byte patterns
$jsd_word = "JoinSplit" ascii
// Looking for '0x01 0x00' (false flag) followed by no proof data
$false_flag = { 01 00 }
condition:
uint16(0) == 0 and any of them and filesize < 10MB
}
Suricata IDS Rule
alert tcp $HOME_NET any -> $EXTERNAL_NET 8233 (msg:"Zcash ZEC Sprout Proof Bypass - Invalid JoinSplit Crafted"; flow:to_server,established; content:"|01 00 00 00|"; depth 4; content:"|f0 9f 92 a5|"; within 200; metadata:created_at 2026_01_01, updated_at 2026_01_01; classtype:attempted-admin; sid:2026356; rev:1;)
Elastic Detection
// EQL Query for Elastic — detects zcashd process activity with abnormal RPC calls
sequence by host.name, process.pid with maxspan=5s
[process where process.name == "zcashd" and event.type == "start" and (
process.args : "--sprout=1" or process.args : "--enablesprout"
)]
[network where process.name == "zcashd" and destination.port == 8233 and event.action == "connection_attempt" and network.direction == "outbound"]
[file where process.name == "zcashd" and file.path == "/debug.log" and file.name == "debug.log"]
Splunk SPL Query
index=zcash sourcetype=zcashd:log
| eval stage=case(
mvindex(_raw, 0) LIKE "%CheckTransaction%" AND mvindex(_raw, 1) LIKE "%sprout%" , "forging_attempt",
mvindex(_raw, 0) LIKE "%ConnectBlock%" AND mvindex(_raw, 1) LIKE "%proof%" , "invalid_block"
)
| search stage=forging_attempt OR stage=invalid_block
| rex field=_raw "ValidateCheckpoint\([^\)]+$"
| stats count by src_ip, event_code, stage
| where count > 1
Wazuh OSSEC Rule
<rule id="100356" level="12">
<decoded>*</decoded>
<match>bad-txns-sprout</match>
<match>CheckTransaction() : Sprout</match>
<description>Zcash zcashd detected potentially forged Sprout transaction (CVE-2026-35679)</description>
<mitre>
<id>T1190</id>
</mitre>
<group>zcash_cve_2026_35679, zcash, cybersecurity,</group>
</rule>
Mitigation & Patch Guidance
Patch Confidence: 2/4 (CLAIMED) — OSV references a fix, but this has not been independently confirmed from the official Zcash release notes or source repositories. Regardless, do NOT rely on mitigations—the patched version must be deployed.
Immediate Mitigations (until upgrade is complete):
- Disable Sprout Pool Support: For node operators, if Sprout pool functionality is not strictly required, disable it. In
zcash.conf, set the-sproutparameter to0(or-enablesprout=0) to prevent the node from processing Sprout JoinSplits entirely. - Network Segmentation: If patching is delayed, restrict direct P2P connectivity from untrusted external networks. Use firewalls to limit port 8233 exposure to known, trusted peers.
- Mempool Monitoring: Enable verbose logging (
debug=mempool) and actively monitor for the log patterns provided in the Sigma rule above.
- Disable Sprout Pool Support: For node operators, if Sprout pool functionality is not strictly required, disable it. In
Patch/Upgrade Steps:
- Major Version Upgrade: The fix is in
zcashd6.12.0 or later. Follow the official Zcash upgrade procedure:- Download the latest release from the official Zcash GitHub repository (
https://github.com/zcash/zcash/releases). - Verify the SHA-256 checksums against the published signatures.
- Stop current
zcashd(zcash-cli stop). - Replace binaries.
- Restart node. Expect a chain reindex, as the consensus-critical validation logic change may require a full re-scan. Schedule maintenance windows to handle the reindex time (can be hours to days depending on storage and hardware).
- Download the latest release from the official Zcash GitHub repository (
- Do not downgrade after upgrade; old versions will fall out of consensus.
- Major Version Upgrade: The fix is in
Long-Term Hardening:
- Audit All Validation Walks: Ensure your monitoring stack watches for
zcashd"invalid transaction" counts; spikes may indicate an active attack. - Stay on Latest Version: Zcash releases are security-critical. Actively track the
zcashGitHub release feed or join the#securitychannel on the Zcash Riot/Discord. - Consider Migrating to Orchard Pool: The Orchard pool (the modern shielded pool) does not have the same legacy verification path. If your organization uses shielded addresses, migrate all funds from Sprout to Orchard to reduce the attack surface permanently. (Note: Sprout migration must be done manually).
- Implement Multiple Node Diversity: Run a secondary node on a different implementation (if available) or a patched version to cross-verify chain state during consensus anomalies.
- Audit All Validation Walks: Ensure your monitoring stack watches for
References
- NVD Entry: https://nvd.nist.gov/vuln/detail/CVE-2026-35679 (Official CVE definition, CVSS vector).
- OSV Advisory: https://osv.dev/vulnerability/CVE-2026-35679 (Patch source—single claim of fix in 6.12.0).
- Zcash GitHub Releases: https://github.com/zcash/zcash/releases (Official download source for patched version 6.12.0).
- CISA KEV: Not listed (no active exploitation warning as of this report).
- Zcash Sprout Pool Informational: https://z.cash/support/glossary/sprout/ (Background on the affected pool).
Threat Actor Campaigns: No specific named threat actor or widespread exploit-in-the-wild activity has been confirmed via public leading sources or CISA KEV. However, given the financial incentive and the historical precedent (e.g., 2018 Zcash inflation bug, 2022 convenience fee attacks on various coins), targeted attacks by sophisticated cybercriminal groups specialized in blockchain vulnerabilities are considered a credible and likely threat vector. We advise treating this as a high-priority patch.
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.
💣 PoC CODE AVAILABLE
Exploit code for this CVE is tracked in our database.
Access poc_code via API Pro.