Podatność w bibliotece nimiq-block pozwala złośliwemu walidatorowi na sfałszowanie dowodu pominięcia bloku (skip block proof) bez posiadania wymaganej liczby głosów kworum. Atakujący dysponujący znacznie mniejszą liczbą rzeczywistych slotów podpisujących może ominąć mechanizm konsensusu, co zagraża integralności i dostępności sieci blockchain.
▸ Pokaż oryginał (EN)
nimiq-block contains block primitives to be used in Nimiq's Rust implementation. `SkipBlockProof::verify` computes its quorum check using `BitSet.len()`, then iterates `BitSet` indices and casts each `usize` index to `u16` (`slot as u16`) for slot lookup. Prior to version 1.3.0, if an attacker can get a `SkipBlockProof` verified where `MultiSignature.signers` contains out-of-range indices spaced by 65536, these indices inflate `len()` but collide onto the same in-range `u16` slot during aggregation. This makes it possible for a malicious validator with far fewer than `2f+1` real signer slots to pass skip block proof verification by multiplying a single BLS signature by the same factor. The patch for this vulnerability is included as part of v1.3.0. No known workarounds are available.
Funkcja `SkipBlockProof::verify` oblicza kworum na podstawie `BitSet.len()`, a następnie iteruje po indeksach `BitSet`, rzutując każdy indeks typu `usize` na typ `u16` przy wyszukiwaniu slotu. Jeśli pole `MultiSignature.signers` zawiera indeksy spoza zakresu oddalone od siebie o wielokrotność 65536, te indeksy zawyżają wynik `len()` (liczony na pełnych wartościach `usize`), lecz podczas agregacji kolidują na ten sam slot `u16` mieszczący się w zakresie. W efekcie jeden podpis BLS może być wielokrotnie zliczony jako różne głosy, pozwalając spełnić próg `2f+1` bez faktycznego posiadania wymaganej liczby slotów podpisujących. Jest to kombinacja nieprawidłowej walidacji wejścia (CWE-20), przepełnienia liczby całkowitej przy rzutowaniu (CWE-190), braku weryfikacji autentyczności danych (CWE-345) oraz nieodpowiedniej walidacji ilości indeksów (CWE-1284).
Złośliwy walidator może przejść weryfikację dowodu pominięcia bloku dysponując znacznie mniejszą liczbą rzeczywistych slotów niż wymagany próg kworum, co umożliwia naruszenie integralności konsensusu sieci i potencjalne zakłócenie jej działania.
Należy zaktualizować bibliotekę nimiq-block do wersji 1.3.0 lub nowszej, w której zawarto poprawkę eliminującą opisaną podatność. Producent nie wskazuje żadnych znanych obejść (workarounds).
Biblioteka nimiq-block używana w implementacji Nimiq Proof-Of-Stake w języku Rust (core-rs-albatross) — wersje przed 1.3.0
Poprawka została wprowadzona w wersji v1.3.0. Producent potwierdza brak znanych obejść. Szczegóły dostępne w security advisory GHSA-6973-8887-87ff oraz commicie d02059053181ed8ddad6b59a0adfd661ef5cd823.
CVSS:3.1/AV:N/AC:L/PR:L/UI:N/S:C/C:N/I:H/A:HNimiq Proof Of Stake
APPNimiq< 1.3.0
Powiązane podatności
nimiq-primitives contains primitives (e.g., block, account, transaction) to be used in Nimiq's Rust implementa...
Nimiq's network-libp2p is a Nimiq network implementation based on libp2p. Prior to version 1.3.0, `network-lib...
nimiq/core-rs-albatross is a Rust implementation of the Nimiq Proof-of-Stake protocol based on the Albatross c...
nimiq-blockchain provides persistent block storage for Nimiq's Rust implementation. In 1.3.0 and earlier, bloc...
nimiq/core-rs-albatross is a Rust implementation of the Nimiq Proof-of-Stake protocol based on the Albatross c...