Skip to main content
CVE Vulnerability Database
Vulnerability Database/CVE-2026-46403

CVE-2026-46403: Klever-Go Privilege Escalation Vulnerability

CVE-2026-46403 is a privilege escalation flaw in Klever-Go that allows contracts to delete or upgrade other contracts during read-only execution. This article covers technical details, affected versions, and mitigation.

Published:

CVE-2026-46403 Overview

CVE-2026-46403 affects Klever-Go, the Go implementation of the Klever blockchain protocol. The Klever Virtual Machine (KVM) exposes ExecuteReadOnlyWithTypedArguments as a read-only execution mechanism. However, the indirect contract delete and upgrade paths fail to reject execution when runtime.ReadOnly() returns true. A contract reached through read-only execution can invoke the production delete hook against a target contract it owns. The delete path appends the target address to vmOutput.DeletedAccounts, which the smart contract processor later applies to chain state. This breaks the isolation boundary that read-only calls are supposed to guarantee. The issue is fixed in version 1.7.17.

Critical Impact

A callee reached through a read-only KVM invocation can trigger contract deletion and upgrade operations, allowing state-changing side effects from calls that should be side-effect free.

Affected Products

  • Klever-Go versions prior to 1.7.17
  • Klever Virtual Machine (KVM) read-only execution subsystem
  • Klever blockchain smart contract processor

Discovery Timeline

  • 2026-07-21 - CVE-2026-46403 published to NVD
  • 2026-07-23 - Last updated in NVD database

Technical Details for CVE-2026-46403

Vulnerability Analysis

The vulnerability is a protection mechanism failure [CWE-693] in the KVM host-core execution path. The ExecuteReadOnlyWithTypedArguments hook saves the previous read-only state, sets runtime.SetReadOnly(true), executes the destination context, and then restores the previous state. This mechanism relies on individual host-core hooks to check runtime.ReadOnly() before performing state-changing operations. The delete and upgrade paths never consulted that flag, so any contract executed under a read-only frame could still emit DeletedAccounts entries and upgrade instructions. The output context then merges these fields into the caller output, and the smart contract processor applies them to chain state after VM execution completes.

Root Cause

Read-only mode is applied as runtime state but is not enforced by the state-changing delete and upgrade host-core paths. The invariant that a read-only frame must produce a side-effect-free vmOutput was assumed rather than checked at each mutation site. Contract owners retained authority to call the production delete hook even when the current execution frame was flagged read-only.

Attack Vector

An attacker deploys or controls a contract that is invoked through ExecuteReadOnlyWithTypedArguments from a caller expecting a pure inspection. During that invocation, the attacker-controlled callee calls the delete hook against a contract it owns. The delete instruction is captured in vmOutput.DeletedAccounts and propagates up to the caller output. When the smart contract processor commits the VM output, the target account is removed from chain state. The same class of bypass applies to upgrade operations and other VM output fields that later mutate state.

go
// Patch context from fixed release (v1.7.17)
// New sentinel errors introduced alongside the read-only enforcement fix
var ErrTooManyItemsInBatch = errors.New("too many items in batch")
var ErrDecompressionTooLarge = errors.New("decompressed payload exceeds maximum allowed size")
var ErrDecompressedSizeMismatch = errors.New("decompressed payload size does not match advertised data size")

// Fixed behavior (described): delete and upgrade host-core paths now check
// runtime.ReadOnly() and abort execution before appending to
// vmOutput.DeletedAccounts or emitting upgrade instructions.

Source: Klever-Go Fix Commit

Detection Methods for CVE-2026-46403

Indicators of Compromise

  • Unexpected entries in vmOutput.DeletedAccounts originating from transactions whose top-level call is a read-only inspection
  • Contract accounts removed from chain state without a corresponding direct delete transaction from the owner
  • Upgrade code changes to a contract that were emitted by a callee invoked through ExecuteReadOnlyWithTypedArguments

Detection Strategies

  • Audit historical VM output logs for DeletedAccounts and upgrade fields produced by execution frames that entered through the read-only hook
  • Correlate deleted contract addresses with the calling contract's ownership graph to detect deletes triggered through indirect read-only paths
  • Add regression tests covering delete, upgrade, storage writes, and value transfers under a read-only frame, as introduced in v1.7.17

Monitoring Recommendations

  • Alert on node versions below 1.7.17 running in validator or archive roles
  • Monitor for anomalous rates of contract deletion or upgrade operations relative to historical baselines
  • Track invocations of ExecuteReadOnlyWithTypedArguments where the resulting vmOutput contains any non-empty state-mutation field

How to Mitigate CVE-2026-46403

Immediate Actions Required

  • Upgrade all Klever-Go nodes to version 1.7.17 or later
  • Review contracts that expose owner-authorized delete or upgrade entry points and confirm callers cannot be reached through read-only execution
  • Replay recent VM outputs against the fixed release to identify state changes that would have been rejected under the enforced invariant

Patch Information

The fix is available in Klever-Go v1.7.17. Contract delete and upgrade host-core paths now reject execution when runtime.ReadOnly() is true. The invariant is regression-tested for delete, upgrade, storage writes, value transfers, and any VM output field that can later mutate chain state. See the Klever-Go Security Advisory GHSA-jc6w-wmfc-fh33 and the remediation commit.

Workarounds

  • No supported workaround exists short of upgrading to v1.7.17
  • As a temporary measure, restrict read-only entry points on deployed contracts to disallow calls into contracts that expose owner-controlled delete or upgrade functions
  • Disable or gate ExecuteReadOnlyWithTypedArguments usage in application logic until nodes are patched
bash
# Upgrade Klever-Go node to the fixed release
git fetch --tags
git checkout v1.7.17
go build -o klever-node ./cmd/node
systemctl restart klever-node

Disclaimer: This content was generated using AI. While we strive for accuracy, please verify critical information with official sources.

Default Legacy - Prefooter | Experience the World’s Most Advanced Cybersecurity Platform

Experience the Most Advanced Cybersecurity Platform

See how the world’s most intelligent, autonomous cybersecurity platform can protect your organization today and into the future.