🛡️ CVE-2026-52878 — klever-go
Description
Klever-Go KVM: Unauthenticated remote node crash (nil-pointer DoS) in klever-go P2P transaction interceptor (txVersionChecker nil RawData) - potential chain halt
Summary
Every transaction gossiped on the klever-go P2P network is decoded and validated
synchronously inside the libp2p pubsub topic-validator callback. The validator
txVersionChecker.CheckTxVersion dereferences tx.RawData.Version with no nil
check. A protobuf Transaction whose embedded RawData sub-message is omitted
decodes to RawData == nil, so validating it triggers a nil-pointer panic.
The libp2p pubsub callback, the underlying go-libp2p-pubsub validation worker, and
klever's own network/p2p layer install no recover(), so the panic propagates and
crashes the entire node process. The attacker payload is a 3-byte protobuf message;
no validator key, stake, funds, or on-chain account is required. Aimed at enough of
the BLS validator set, repeated delivery halts block production (chain halt).
Affected component
- Root cause:
core/versioning/txVersionChecker.go:22 - Reached via:
core/process/transaction/interceptedTransaction.go:203(integrity) and:154(CheckValidity) - Production tx-topic path:
core/process/interceptors/multiDataInterceptor.go:171and:223 - Unprotected caller:
network/p2p/libp2p/netMessenger.gopubsubCallback(no recover) - Topic wiring:
core/process/factory/interceptorscontainer/baseInterceptorsContainerFactory.go(createOneTxInterceptor)
Details
Synchronous validation path, no recovery at any frame:
```
libp2p pubsubCallback network/p2p/libp2p/netMessenger.go (no recover)
-> MultiDataInterceptor.ProcessReceivedMessage core/process/interceptors/multiDataInterceptor.go:171
-> interceptedData(...) core/process/interceptors/multiDataInterceptor.go:223
-> InterceptedTransaction.CheckValidity core/process/transaction/interceptedTransaction.go:154
-> integrity() core/process/transaction/interceptedTransaction.go:203
-> txVersionChecker.CheckTxVersion(tx) core/versioning/txVersionChecker.go:22 <-- nil deref
```
Root cause (core/versioning/txVersionChecker.go):
```go
func (tvc *txVersionChecker) CheckTxVersion(tx *transaction.Transaction) error {
if tx.RawData.Version < tvc.minTxVersion { // tx.RawData is nil -> panic
return process.ErrInvalidTransactionVersion
}
return nil
}
```
integrity() calls CheckTxVersion as its very first statement, before any
RawData nil-check, and CheckValidity() runs before the whitelist / originator-
election gate in the interceptor, so node-role and whitelist restrictions do not
protect this path.
Preconditions
- Attacker runs an ordinary libp2p peer reachable to the target via normal peering /
kad-dht discovery on the transactions gossip topic.
- Production runs with
withMessageSigning = true, which only requires the gossip
message to be signed by the attacker's OWN libp2p peer key (a self-generated
identity; NOT a validator key, NOT funded, NOT authorized).
- No special config or feature flag; the tx interceptor is built unconditionally and
subscribes to transactions on every node.
Impact
- Deterministic, immediate crash of any targeted node (validator, sentry, or
observer) from a single ~3-byte message.
- Gossipsub validates before relaying, so the victim does not forward the crashing
message; the attacker delivers it directly to each target (one tiny message/node).
- With auto-restart (systemd), re-sending sustains the outage.
- Directed at > 1/3 of the BLS validator set, this prevents consensus and halts the chain.
- NOTE: the HTTP
POST /transaction/sendpath is NOT crash-exploitable - the REST
server uses gin.Default() (Recovery middleware) and returns HTTP 500. The
exploitable vector is the P2P interceptor.
Exploit cost / attack complexity
- Cost: negligible (one self-signed libp2p peer; 3-byte payload; no gas/capital).
- Complexity: LOW. Unauthenticated, remote, deterministic.
PoC-Source
Scenario
- Build the malicious transaction as it appears on the wire: a protobuf
Transaction
with RawData omitted (plus a throwaway Signature so the batch entry looks like a
real tx). With the production proto marshalizer this encodes to 3 bytes
(12 01 78) and round-trips back to RawData == nil.
- Feed it through the REAL production interceptors. The
transactionsgossip topic is
served by a MultiDataInterceptor (baseInterceptorsContainerFactory.go,
createOneTxInterceptor); the test wraps the tx in a Batch exactly like a bulk-tx
gossip message and calls ProcessReceivedMessage, which is precisely what the
panic-free libp2p pubsubCallback invokes in production. A second test drives the
generic SingleDataInterceptor to show the bug is in the shared validation chain.
- The data factory is a faithful copy of the production `interceptedTxDataFactory
How this vulnerability can be exploited
This issue can be reached over the network, attack complexity is low, an attacker needs no privileges on the target. No user interaction is required. The scope is unchanged, so the impact stays within the vulnerable component. Rated impact: confidentiality none, integrity none, availability high.
Weakness class
CVE-2026-52878 is classified as CWE-476: NULL Pointer Dereference. A pointer that can be null is used without a check, crashing the process.
Affected software
CVE-2026-52878 is recorded against 2 packages.
- github.com/klever-io/klever-go
- unknown
Timeline and source
Published on 5 June 2026 and last revised on 25 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.
References
Details
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H
Affected Packages
| Software | From version | Fixed in |
|---|---|---|
| github.com/klever-io/klever-go | — | — |
| unknown | — | — |
References
Similar Threats
- Unknown GO-2026-5204
- High GHSA-hf2g-6j7h-98wg
- High GHSA-rm5c-5x2p-48wr
- High GHSA-w4c6-7r69-w7j9
- High CVE-2026-47249
Site Security Check
Is klever-go part of your stack?
CVE-2026-52878 is rated CVSS 8.0 High. BotEraser scans your installation against known CVE records and tells you whether this vulnerability applies to the versions you actually run.
Scan My Site Free →No credit card required · Results in minutes
ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.