Attack ChainAIDerived
Hypothetical attack flow derived from CVE metadata – not a confirmed exploit chain
-
AccessJoin libp2p discovery network
-
DeliveryBroadcast signed PeerContact with empty addresses list
-
ExploitMalicious contact accepted into PeerContactBook
-
ExecutionWait for victim to query RPC/web client address book
-
Persist.expect() panics on empty address iterator
-
ImpactNode or RPC task crashes
Vulnerability Assessment
| Weakness |
CWE
OWASP Top 10:2025
A10:2025 - Mishandling of Exceptional Conditions
ASVS 5.0
V16 - Security Logging and Error Handling Unusual condition handling
|
| Exploitation Conditions | The attacker must be a participant in the libp2p peer discovery network - they need to be able to send signed PeerContact messages that the target node will accept and store. No authentication to the target node is required (PR:N in CVSS vector). The crash is not triggered by the attacker directly; it requires a subsequent call to get_address_book, which is exposed via the node's RPC interface or web client (UI:R in CVSS vector). This means exploitation depends on: (1) the target node running core-rs-albatross < 1.4.0; (2) the attacker's ability to insert a peer contact into the discovery layer; and (3) a legitimate user or automated process invoking the address book RPC endpoint after the malicious contact is stored. Exploitation is limited by the need for the second-phase trigger - an operator or client must call get_address_book for the panic to fire. Nodes whose RPC endpoints are not regularly queried, or are firewalled from external callers, reduce the window for the crash to be triggered. |
| Impact | The CVSS 3.1 score of 4.3 (Medium) reflects a network-accessible (AV:N), low-complexity (AC:L), unauthenticated (PR:N) trigger requiring user interaction (UI:R), with no confidentiality or integrity impact and only partial availability impact (A:L). The UI:R element is meaningful: exploitation is two-phase - the attacker injects the malicious contact passively, but the panic only fires when a legitimate user or process calls get_address_book, such as a node operator querying RPC or a connected web client. This decouples the attacker from the crash timing and may make detection harder. No EPSS data was provided, so probabilistic exploitation likelihood cannot be quantified. The vulnerability is not in the CISA KEV catalog, and no public exploit code has been identified. In practice, the availability impact may exceed the A:L CVSS rating if the panic terminates the entire node process rather than just the RPC task - Rust panic behavior is configurable. Overall: genuine operational risk for node operators, but not an emergency given the absence of active exploitation evidence. |
| Exploit ScenarioDerived | An attacker operating a Nimiq node joins the libp2p peer discovery network and crafts a signed PeerContact message containing a valid peer identity but an empty addresses field, then broadcasts it to target nodes; since no protocol validation rejects empty address lists, the contact is accepted and stored in the target's PeerContactBook. Later, when a node operator or automated monitoring script queries the node's RPC interface or web client - a routine operational action - the get_address_book call internally invokes .expect() on the empty address list, triggering a Rust panic that crashes the RPC task or the node process entirely. |
Get an e-mail when this CVE is exploited, patched or re-scored. Free account.
Alert meAnalysisAIv1 – May 20, 2026
Panic-triggered denial of service in Nimiq's core-rs-albatross (versions prior to 1.4.0) allows a network-level attacker to crash the node's RPC task by injecting a signed PeerContact with an empty addresses list into the libp2p peer discovery layer. The crash is deferred: the malicious contact is accepted and stored silently, but any subsequent call to get_address_book - from an RPC client or web client - triggers an unconditional Rust panic via .expect() on an empty iterator. No public exploit code has been identified at time of analysis, and the vulnerability is not listed in the CISA KEV catalog, though the low attack complexity and network-accessible vector make casual exploitation plausible against any exposed node operator workflow.
RemediationAI
The primary fix is upgrading core-rs-albatross to version 1.4.0, released at https://github.com/nimiq/core-rs-albatross/releases/tag/v1.4.0. The upstream patch is confirmed via PR #3715 (https://github.com/nimiq/core-rs-albatross/pull/3715), which replaces the panicking .expect() call with a .filter_map() that silently drops peer contacts carrying empty address lists. If an immediate upgrade is not feasible, operators can reduce exposure by restricting access to the RPC and web client endpoints that invoke get_address_book - blocking external callers prevents the panic trigger, though the malicious contacts will still accumulate in memory. A further compensating control is network-level egress/ingress filtering to limit which peers can participate in libp2p discovery, reducing the attacker's ability to insert malicious PeerContact entries; however, this degrades peer diversity and may affect blockchain synchronization. Neither workaround eliminates the root cause - upgrading to v1.4.0 is the definitive remediation.
Affected VersionsENISA
Affected Packages
Source: OSV (Open Source Vulnerabilities)
Affects your stack
Affects 1 package in euvd
Checking this CVE against your own stacks and servers is part of the Basic plan and up.
Technical ContextAI · show details
The affected component is the libp2p-based peer discovery subsystem within Nimiq's Rust blockchain implementation, identified by CPE cpe:2.3:a:nimiq:core-rs-albatross:*:*:*:*:*:*:*:*. Peer discovery operates via signed PeerContact messages, which can legally carry an empty addresses field - no protocol-level validation enforces at least one address. The root cause maps to CWE-754 (Improper Check for Unusual or Exceptional Conditions): the PeerContactBook::known_peers function called addresses.first().expect('every peer should have at least one address') without guarding against an empty list. In Rust, .expect() on a None value triggers an unrecoverable panic, which depending on the panic runtime setting either terminates the thread/task or the entire process. The fix in PR #3715 replaced .map() with .filter_map() using the ? operator, silently skipping contacts whose address list is empty rather than panicking.
Know when Core Rs Albatross gets its next vulnerability
- Watch products and get an email when something new is published
- Check this CVE against your own stack and servers
- Exploit and PoC references, threat intelligence from 22 sources
No credit card · 7-day full trial
Severity by source
AV:N/AC:L/PR:N/UI:R/S:U/C:N/I:N/A:L
Primary rating from Vendor (GitHub_M) · only source for this CVE.
CVSS VectorVendor: GitHub_M
Lifecycle Timeline
1DescriptionCVE.org
nimiq-blockchain provides persistent block storage for Nimiq's Rust implementation. In versions 1.3.0 and prior, network-libp2p discovery accepts signed PeerContact updates from untrusted peers and stores them in a peer contact book, eventually leading to address book crash. A PeerContact can legally contain an empty addresses list (no intrinsic validation enforces non-empty). Later, PeerContactBook::known_peers builds an address book by taking addresses.first().expect("every peer should have at least one address"). If the attacker has inserted a signed peer contact with addresses=[], any call to get_address_book (RPC/web client) can panic and crash the node/RPC task depending on panic settings. This issue has been fixed in version 1.4.0.
Threat Intelligence Overview
How this decision was reached
The engine reads each signal below and applies a fixed list of rules from top to bottom. The first rule that matches sets the recommended action – like a statement, every line is shown.
What every action level means
SSVC AssessmentENISA
Priority Score
Attack Technique
Denial of Service attacks render applications or systems unavailable by overwhelming resources or triggering failure conditions.
More in Core Rs Albatross
View allInteger truncation in Nimiq core-rs-albatross's skip block proof verification allows authenticated validators to forge c
Timestamp manipulation in Nimiq Core Rust implementation (nimiq-blockchain 1.3.0 and earlier) allows authenticated block
Nimiq core-rs-albatross validators prior to version 1.3.0 can be remotely crashed via malformed Tendermint proposals. An
Integer underflow in Nimiq core-rs-albatross <1.3.0 enables unauthenticated remote attackers to trigger deterministic de
Denial of service in Nimiq Core RS Albatross prior to version 1.3.0 allows remote attackers to crash full nodes by sendi
Elected validator proposers in nimiq/core-rs-albatross before version 1.3.0 can submit election macro blocks with malfor
EUVD-2026-31195
NVD
CVE.org
EPSS
Vulnrichment
GitHub
VulDB
Exploit-DB