Security Vulnerability Report
中文
CVE-2026-34061 CVSS 4.9 MEDIUM

CVE-2026-34061

Published: 2026-04-03 23:17:04
Last Modified: 2026-05-05 18:17:14

Description

nimiq/core-rs-albatross is a Rust implementation of the Nimiq Proof-of-Stake protocol based on the Albatross consensus algorithm. Prior to version 1.3.0, an elected validator proposer can send an election macro block whose header.interlink does not match the canonical next interlink. Honest validators accept that proposal in verify_macro_block_proposal() because the proposal path validates header shape, successor relation, proposer, body root, and state, but never checks the interlink binding for election blocks. The same finalized block is later rejected by verify_block() during push with InvalidInterlink. Because validators prevote and precommit the malformed header hash itself, the failure happens after Tendermint decides the block, not before voting. This issue has been patched in version 1.3.0.

CVSS Details

CVSS Score
4.9
Severity
MEDIUM
CVSS Vector
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H

Configurations (Affected Products)

cpe:2.3:a:nimiq:nimiq_proof-of-stake:*:*:*:*:*:rust:*:* - VULNERABLE
nimiq/core-rs-albatross < 1.3.0

PoC / Exploit Code

⚠ For Security Research Only
The following code is for security research and authorized testing only.
python
// Conceptual PoC for CVE-2026-34061 // This snippet demonstrates the logic flaw in Rust pseudo-code fn exploit_cve_2026_34061() { // 1. Attacker acts as a malicious validator (PR:H) let validator_key = load_malicious_validator_key(); // 2. Construct a macro block proposal let mut block_proposal = MacroBlock::default(); // 3. Maliciously tamper with the header.interlink // The interlink must match the canonical chain, but here we set an invalid one block_proposal.header.interlink = Interlink::construct_invalid(); // 4. Ensure other fields are valid to pass shape and signature checks block_proposal.header.body_root = calculate_body_root(&block_proposal.body); block_proposal.header.signature = sign(&validator_key, &block_proposal.header); // 5. Send proposal to the network broadcast_proposal(block_proposal); // VULNERABILITY TRIGGER: // Honest nodes call verify_macro_block_proposal(block_proposal) // This function checks shape, successor, proposer, body_root, state. // IT FAILS TO CHECK: header.interlink binding. // Result: Vulnerable nodes accept the proposal and Prevote/Precommit. // IMPACT: // Later, verify_block() is called during push(), detects InvalidInterlink, // and crashes the node or halts consensus after the block is 'finalized'. }

References

Raw JSON Data

JSON
{"cve": {"id": "CVE-2026-34061", "sourceIdentifier": "[email protected]", "published": "2026-04-03T23:17:03.940", "lastModified": "2026-05-05T18:17:13.890", "vulnStatus": "Analyzed", "cveTags": [], "descriptions": [{"lang": "en", "value": "nimiq/core-rs-albatross is a Rust implementation of the Nimiq Proof-of-Stake protocol based on the Albatross consensus algorithm. Prior to version 1.3.0, an elected validator proposer can send an election macro block whose header.interlink does not match the canonical next interlink. Honest validators accept that proposal in verify_macro_block_proposal() because the proposal path validates header shape, successor relation, proposer, body root, and state, but never checks the interlink binding for election blocks. The same finalized block is later rejected by verify_block() during push with InvalidInterlink. Because validators prevote and precommit the malformed header hash itself, the failure happens after Tendermint decides the block, not before voting. This issue has been patched in version 1.3.0."}], "metrics": {"cvssMetricV31": [{"source": "[email protected]", "type": "Secondary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:U/C:N/I:N/A:H", "baseScore": 4.9, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "HIGH", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 1.2, "impactScore": 3.6}, {"source": "[email protected]", "type": "Primary", "cvssData": {"version": "3.1", "vectorString": "CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:U/C:N/I:N/A:H", "baseScore": 6.5, "baseSeverity": "MEDIUM", "attackVector": "NETWORK", "attackComplexity": "LOW", "privilegesRequired": "LOW", "userInteraction": "NONE", "scope": "UNCHANGED", "confidentialityImpact": "NONE", "integrityImpact": "NONE", "availabilityImpact": "HIGH"}, "exploitabilityScore": 2.8, "impactScore": 3.6}]}, "weaknesses": [{"source": "[email protected]", "type": "Primary", "description": [{"lang": "en", "value": "CWE-345"}]}], "configurations": [{"nodes": [{"operator": "OR", "negate": false, "cpeMatch": [{"vulnerable": true, "criteria": "cpe:2.3:a:nimiq:nimiq_proof-of-stake:*:*:*:*:*:rust:*:*", "versionEndIncluding": "1.2.2", "matchCriteriaId": "F1D1AFE5-536A-424A-B7D3-AFCE79533E39"}]}]}], "references": [{"url": "https://github.com/nimiq/core-rs-albatross/commit/9d7d17c9163384e79f61cdbbfe9853ae57bb8bf7", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/nimiq/core-rs-albatross/pull/3668", "source": "[email protected]", "tags": ["Patch"]}, {"url": "https://github.com/nimiq/core-rs-albatross/releases/tag/v1.3.0", "source": "[email protected]", "tags": ["Release Notes"]}, {"url": "https://github.com/nimiq/core-rs-albatross/security/advisories/GHSA-gr83-j5f8-p2r5", "source": "[email protected]", "tags": ["Third Party Advisory"]}]}}